]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
Merge remote-tracking branch 'upstream/pull/2153'
[rails.git] / vendor / assets / iD / iD.js
1 (function () {
2   var version = "4.13.0";
3
4   function ascending(a, b) {
5     return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
6   }
7
8   function bisector(compare) {
9     if (compare.length === 1) compare = ascendingComparator(compare);
10     return {
11       left: function(a, x, lo, hi) {
12         if (lo == null) lo = 0;
13         if (hi == null) hi = a.length;
14         while (lo < hi) {
15           var mid = lo + hi >>> 1;
16           if (compare(a[mid], x) < 0) lo = mid + 1;
17           else hi = mid;
18         }
19         return lo;
20       },
21       right: function(a, x, lo, hi) {
22         if (lo == null) lo = 0;
23         if (hi == null) hi = a.length;
24         while (lo < hi) {
25           var mid = lo + hi >>> 1;
26           if (compare(a[mid], x) > 0) hi = mid;
27           else lo = mid + 1;
28         }
29         return lo;
30       }
31     };
32   }
33
34   function ascendingComparator(f) {
35     return function(d, x) {
36       return ascending(f(d), x);
37     };
38   }
39
40   var ascendingBisect = bisector(ascending);
41   var bisectRight = ascendingBisect.right;
42   var bisectLeft = ascendingBisect.left;
43
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]);
48     return pairs;
49   }
50
51   function pair(a, b) {
52     return [a, b];
53   }
54
55   function cross(values0, values1, reduce) {
56     var n0 = values0.length,
57         n1 = values1.length,
58         values = new Array(n0 * n1),
59         i0,
60         i1,
61         i,
62         value0;
63
64     if (reduce == null) reduce = pair;
65
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]);
69       }
70     }
71
72     return values;
73   }
74
75   function d3_descending(a, b) {
76     return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
77   }
78
79   function number(x) {
80     return x === null ? NaN : +x;
81   }
82
83   function variance(values, valueof) {
84     var n = values.length,
85         m = 0,
86         i = -1,
87         mean = 0,
88         value,
89         delta,
90         sum = 0;
91
92     if (valueof == null) {
93       while (++i < n) {
94         if (!isNaN(value = number(values[i]))) {
95           delta = value - mean;
96           mean += delta / ++m;
97           sum += delta * (value - mean);
98         }
99       }
100     }
101
102     else {
103       while (++i < n) {
104         if (!isNaN(value = number(valueof(values[i], i, values)))) {
105           delta = value - mean;
106           mean += delta / ++m;
107           sum += delta * (value - mean);
108         }
109       }
110     }
111
112     if (m > 1) return sum / (m - 1);
113   }
114
115   function deviation(array, f) {
116     var v = variance(array, f);
117     return v ? Math.sqrt(v) : v;
118   }
119
120   function extent(values, valueof) {
121     var n = values.length,
122         i = -1,
123         value,
124         min,
125         max;
126
127     if (valueof == null) {
128       while (++i < n) { // Find the first comparable value.
129         if ((value = values[i]) != null && value >= value) {
130           min = max = 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;
135             }
136           }
137         }
138       }
139     }
140
141     else {
142       while (++i < n) { // Find the first comparable value.
143         if ((value = valueof(values[i], i, values)) != null && value >= value) {
144           min = max = 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;
149             }
150           }
151         }
152       }
153     }
154
155     return [min, max];
156   }
157
158   var array = Array.prototype;
159
160   var slice = array.slice;
161   var map = array.map;
162
163   function constant(x) {
164     return function() {
165       return x;
166     };
167   }
168
169   function identity(x) {
170     return x;
171   }
172
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;
175
176     var i = -1,
177         n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
178         range = new Array(n);
179
180     while (++i < n) {
181       range[i] = start + i * step;
182     }
183
184     return range;
185   }
186
187   var e10 = Math.sqrt(50),
188       e5 = Math.sqrt(10),
189       e2 = Math.sqrt(2);
190
191   function ticks(start, stop, count) {
192     var reverse,
193         i = -1,
194         n,
195         ticks,
196         step;
197
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 [];
202
203     if (step > 0) {
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;
208     } else {
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;
213     }
214
215     if (reverse) ticks.reverse();
216
217     return ticks;
218   }
219
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);
224     return power >= 0
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);
227   }
228
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;
237   }
238
239   function sturges(values) {
240     return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
241   }
242
243   function histogram() {
244     var value = identity,
245         domain = extent,
246         threshold = sturges;
247
248     function histogram(data) {
249       var i,
250           n = data.length,
251           x,
252           values = new Array(n);
253
254       for (i = 0; i < n; ++i) {
255         values[i] = value(data[i], i, data);
256       }
257
258       var xz = domain(values),
259           x0 = xz[0],
260           x1 = xz[1],
261           tz = threshold(values, x0, x1);
262
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
267       }
268
269       // Remove any thresholds outside the domain.
270       var m = tz.length;
271       while (tz[0] <= x0) tz.shift(), --m;
272       while (tz[m - 1] > x1) tz.pop(), --m;
273
274       var bins = new Array(m + 1),
275           bin;
276
277       // Initialize bins.
278       for (i = 0; i <= m; ++i) {
279         bin = bins[i] = [];
280         bin.x0 = i > 0 ? tz[i - 1] : x0;
281         bin.x1 = i < m ? tz[i] : x1;
282       }
283
284       // Assign data to bins by value, ignoring any outside the domain.
285       for (i = 0; i < n; ++i) {
286         x = values[i];
287         if (x0 <= x && x <= x1) {
288           bins[bisectRight(tz, x, 0, m)].push(data[i]);
289         }
290       }
291
292       return bins;
293     }
294
295     histogram.value = function(_) {
296       return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
297     };
298
299     histogram.domain = function(_) {
300       return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain;
301     };
302
303     histogram.thresholds = function(_) {
304       return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;
305     };
306
307     return histogram;
308   }
309
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);
315     var n,
316         i = (n - 1) * p,
317         i0 = Math.floor(i),
318         value0 = +valueof(values[i0], i0, values),
319         value1 = +valueof(values[i0 + 1], i0 + 1, values);
320     return value0 + (value1 - value0) * (i - i0);
321   }
322
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)));
326   }
327
328   function scott(values, min, max) {
329     return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
330   }
331
332   function max(values, valueof) {
333     var n = values.length,
334         i = -1,
335         value,
336         max;
337
338     if (valueof == null) {
339       while (++i < n) { // Find the first comparable value.
340         if ((value = values[i]) != null && value >= value) {
341           max = value;
342           while (++i < n) { // Compare the remaining values.
343             if ((value = values[i]) != null && value > max) {
344               max = value;
345             }
346           }
347         }
348       }
349     }
350
351     else {
352       while (++i < n) { // Find the first comparable value.
353         if ((value = valueof(values[i], i, values)) != null && value >= value) {
354           max = value;
355           while (++i < n) { // Compare the remaining values.
356             if ((value = valueof(values[i], i, values)) != null && value > max) {
357               max = value;
358             }
359           }
360         }
361       }
362     }
363
364     return max;
365   }
366
367   function mean(values, valueof) {
368     var n = values.length,
369         m = n,
370         i = -1,
371         value,
372         sum = 0;
373
374     if (valueof == null) {
375       while (++i < n) {
376         if (!isNaN(value = number(values[i]))) sum += value;
377         else --m;
378       }
379     }
380
381     else {
382       while (++i < n) {
383         if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;
384         else --m;
385       }
386     }
387
388     if (m) return sum / m;
389   }
390
391   function d3_median(values, valueof) {
392     var n = values.length,
393         i = -1,
394         value,
395         numbers = [];
396
397     if (valueof == null) {
398       while (++i < n) {
399         if (!isNaN(value = number(values[i]))) {
400           numbers.push(value);
401         }
402       }
403     }
404
405     else {
406       while (++i < n) {
407         if (!isNaN(value = number(valueof(values[i], i, values)))) {
408           numbers.push(value);
409         }
410       }
411     }
412
413     return quantile(numbers.sort(ascending), 0.5);
414   }
415
416   function merge(arrays) {
417     var n = arrays.length,
418         m,
419         i = -1,
420         j = 0,
421         merged,
422         array;
423
424     while (++i < n) j += arrays[i].length;
425     merged = new Array(j);
426
427     while (--n >= 0) {
428       array = arrays[n];
429       m = array.length;
430       while (--m >= 0) {
431         merged[--j] = array[m];
432       }
433     }
434
435     return merged;
436   }
437
438   function min(values, valueof) {
439     var n = values.length,
440         i = -1,
441         value,
442         min;
443
444     if (valueof == null) {
445       while (++i < n) { // Find the first comparable value.
446         if ((value = values[i]) != null && value >= value) {
447           min = value;
448           while (++i < n) { // Compare the remaining values.
449             if ((value = values[i]) != null && min > value) {
450               min = value;
451             }
452           }
453         }
454       }
455     }
456
457     else {
458       while (++i < n) { // Find the first comparable value.
459         if ((value = valueof(values[i], i, values)) != null && value >= value) {
460           min = value;
461           while (++i < n) { // Compare the remaining values.
462             if ((value = valueof(values[i], i, values)) != null && min > value) {
463               min = value;
464             }
465           }
466         }
467       }
468     }
469
470     return min;
471   }
472
473   function permute(array, indexes) {
474     var i = indexes.length, permutes = new Array(i);
475     while (i--) permutes[i] = array[indexes[i]];
476     return permutes;
477   }
478
479   function scan(values, compare) {
480     if (!(n = values.length)) return;
481     var n,
482         i = 0,
483         j = 0,
484         xi,
485         xj = values[j];
486
487     if (compare == null) compare = ascending;
488
489     while (++i < n) {
490       if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {
491         xj = xi, j = i;
492       }
493     }
494
495     if (compare(xj, xj) === 0) return j;
496   }
497
498   function shuffle(array, i0, i1) {
499     var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
500         t,
501         i;
502
503     while (m) {
504       i = Math.random() * m-- | 0;
505       t = array[m + i0];
506       array[m + i0] = array[i + i0];
507       array[i + i0] = t;
508     }
509
510     return array;
511   }
512
513   function sum(values, valueof) {
514     var n = values.length,
515         i = -1,
516         value,
517         sum = 0;
518
519     if (valueof == null) {
520       while (++i < n) {
521         if (value = +values[i]) sum += value; // Note: zero and null are equivalent.
522       }
523     }
524
525     else {
526       while (++i < n) {
527         if (value = +valueof(values[i], i, values)) sum += value;
528       }
529     }
530
531     return sum;
532   }
533
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];
539       }
540     }
541     return transpose;
542   }
543
544   function length(d) {
545     return d.length;
546   }
547
548   function zip() {
549     return transpose(arguments);
550   }
551
552   var slice$1 = Array.prototype.slice;
553
554   function identity$1(x) {
555     return x;
556   }
557
558   var top = 1,
559       right = 2,
560       bottom = 3,
561       left = 4,
562       epsilon = 1e-6;
563
564   function translateX(x) {
565     return "translate(" + (x + 0.5) + ",0)";
566   }
567
568   function translateY(y) {
569     return "translate(0," + (y + 0.5) + ")";
570   }
571
572   function number$1(scale) {
573     return function(d) {
574       return +scale(d);
575     };
576   }
577
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);
581     return function(d) {
582       return +scale(d) + offset;
583     };
584   }
585
586   function entering() {
587     return !this.__axis;
588   }
589
590   function axis(orient, scale) {
591     var tickArguments = [],
592         tickValues = null,
593         tickFormat = null,
594         tickSizeInner = 6,
595         tickSizeOuter = 6,
596         tickPadding = 3,
597         k = orient === top || orient === left ? -1 : 1,
598         x = orient === left || orient === right ? "x" : "y",
599         transform = orient === top || orient === bottom ? translateX : translateY;
600
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");
616
617       path = path.merge(path.enter().insert("path", ".tick")
618           .attr("class", "domain")
619           .attr("stroke", "#000"));
620
621       tick = tick.merge(tickEnter);
622
623       line = line.merge(tickEnter.append("line")
624           .attr("stroke", "#000")
625           .attr(x + "2", k * tickSizeInner));
626
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"));
631
632       if (context !== selection) {
633         path = path.transition(context);
634         tick = tick.transition(context);
635         line = line.transition(context);
636         text = text.transition(context);
637
638         tickExit = tickExit.transition(context)
639             .attr("opacity", epsilon)
640             .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); });
641
642         tickEnter
643             .attr("opacity", epsilon)
644             .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });
645       }
646
647       tickExit.remove();
648
649       path
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);
653
654       tick
655           .attr("opacity", 1)
656           .attr("transform", function(d) { return transform(position(d)); });
657
658       line
659           .attr(x + "2", k * tickSizeInner);
660
661       text
662           .attr(x, k * spacing)
663           .text(format);
664
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");
670
671       selection
672           .each(function() { this.__axis = position; });
673     }
674
675     axis.scale = function(_) {
676       return arguments.length ? (scale = _, axis) : scale;
677     };
678
679     axis.ticks = function() {
680       return tickArguments = slice$1.call(arguments), axis;
681     };
682
683     axis.tickArguments = function(_) {
684       return arguments.length ? (tickArguments = _ == null ? [] : slice$1.call(_), axis) : tickArguments.slice();
685     };
686
687     axis.tickValues = function(_) {
688       return arguments.length ? (tickValues = _ == null ? null : slice$1.call(_), axis) : tickValues && tickValues.slice();
689     };
690
691     axis.tickFormat = function(_) {
692       return arguments.length ? (tickFormat = _, axis) : tickFormat;
693     };
694
695     axis.tickSize = function(_) {
696       return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;
697     };
698
699     axis.tickSizeInner = function(_) {
700       return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;
701     };
702
703     axis.tickSizeOuter = function(_) {
704       return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;
705     };
706
707     axis.tickPadding = function(_) {
708       return arguments.length ? (tickPadding = +_, axis) : tickPadding;
709     };
710
711     return axis;
712   }
713
714   function axisTop(scale) {
715     return axis(top, scale);
716   }
717
718   function axisRight(scale) {
719     return axis(right, scale);
720   }
721
722   function axisBottom(scale) {
723     return axis(bottom, scale);
724   }
725
726   function axisLeft(scale) {
727     return axis(left, scale);
728   }
729
730   var noop = {value: function() {}};
731
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);
735       _[t] = [];
736     }
737     return new Dispatch(_);
738   }
739
740   function Dispatch(_) {
741     this._ = _;
742   }
743
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};
750     });
751   }
752
753   Dispatch.prototype = dispatch.prototype = {
754     constructor: Dispatch,
755     on: function(typename, callback) {
756       var _ = this._,
757           T = parseTypenames(typename + "", _),
758           t,
759           i = -1,
760           n = T.length;
761
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;
765         return;
766       }
767
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);
771       while (++i < n) {
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);
774       }
775
776       return this;
777     },
778     copy: function() {
779       var copy = {}, _ = this._;
780       for (var t in _) copy[t] = _[t].slice();
781       return new Dispatch(copy);
782     },
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);
787     },
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);
791     }
792   };
793
794   function get(type, name) {
795     for (var i = 0, n = type.length, c; i < n; ++i) {
796       if ((c = type[i]).name === name) {
797         return c.value;
798       }
799     }
800   }
801
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));
806         break;
807       }
808     }
809     if (callback != null) type.push({name: name, value: callback});
810     return type;
811   }
812
813   var xhtml = "http://www.w3.org/1999/xhtml";
814
815   var namespaces = {
816     svg: "http://www.w3.org/2000/svg",
817     xhtml: xhtml,
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/"
821   };
822
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;
827   }
828
829   function creatorInherit(name) {
830     return function() {
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);
836     };
837   }
838
839   function creatorFixed(fullname) {
840     return function() {
841       return this.ownerDocument.createElementNS(fullname.space, fullname.local);
842     };
843   }
844
845   function creator(name) {
846     var fullname = namespace(name);
847     return (fullname.local
848         ? creatorFixed
849         : creatorInherit)(fullname);
850   }
851
852   function none() {}
853
854   function selector(selector) {
855     return selector == null ? none : function() {
856       return this.querySelector(selector);
857     };
858   }
859
860   function selection_select(select) {
861     if (typeof select !== "function") select = selector(select);
862
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;
868         }
869       }
870     }
871
872     return new Selection(subgroups, this._parents);
873   }
874
875   function empty() {
876     return [];
877   }
878
879   function selectorAll(selector) {
880     return selector == null ? empty : function() {
881       return this.querySelectorAll(selector);
882     };
883   }
884
885   function selection_selectAll(select) {
886     if (typeof select !== "function") select = selectorAll(select);
887
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));
892           parents.push(node);
893         }
894       }
895     }
896
897     return new Selection(subgroups, parents);
898   }
899
900   var matcher = function(selector) {
901     return function() {
902       return this.matches(selector);
903     };
904   };
905
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) {
914         return function() {
915           return vendorMatches.call(this, selector);
916         };
917       };
918     }
919   }
920
921   var matcher$1 = matcher;
922
923   function selection_filter(match) {
924     if (typeof match !== "function") match = matcher$1(match);
925
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)) {
929           subgroup.push(node);
930         }
931       }
932     }
933
934     return new Selection(subgroups, this._parents);
935   }
936
937   function sparse(update) {
938     return new Array(update.length);
939   }
940
941   function selection_enter() {
942     return new Selection(this._enter || this._groups.map(sparse), this._parents);
943   }
944
945   function EnterNode(parent, datum) {
946     this.ownerDocument = parent.ownerDocument;
947     this.namespaceURI = parent.namespaceURI;
948     this._next = null;
949     this._parent = parent;
950     this.__data__ = datum;
951   }
952
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); }
959   };
960
961   function constant$1(x) {
962     return function() {
963       return x;
964     };
965   }
966
967   var keyPrefix = "$"; // Protect against keys like “__proto__”.
968
969   function bindIndex(parent, group, enter, update, exit, data) {
970     var i = 0,
971         node,
972         groupLength = group.length,
973         dataLength = data.length;
974
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];
981         update[i] = node;
982       } else {
983         enter[i] = new EnterNode(parent, data[i]);
984       }
985     }
986
987     // Put any non-null nodes that don’t fit into exit.
988     for (; i < groupLength; ++i) {
989       if (node = group[i]) {
990         exit[i] = node;
991       }
992     }
993   }
994
995   function bindKey(parent, group, enter, update, exit, data, key) {
996     var i,
997         node,
998         nodeByKeyValue = {},
999         groupLength = group.length,
1000         dataLength = data.length,
1001         keyValues = new Array(groupLength),
1002         keyValue;
1003
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) {
1010           exit[i] = node;
1011         } else {
1012           nodeByKeyValue[keyValue] = node;
1013         }
1014       }
1015     }
1016
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]) {
1023         update[i] = node;
1024         node.__data__ = data[i];
1025         nodeByKeyValue[keyValue] = null;
1026       } else {
1027         enter[i] = new EnterNode(parent, data[i]);
1028       }
1029     }
1030
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)) {
1034         exit[i] = node;
1035       }
1036     }
1037   }
1038
1039   function selection_data(value, key) {
1040     if (!value) {
1041       data = new Array(this.size()), j = -1;
1042       this.each(function(d) { data[++j] = d; });
1043       return data;
1044     }
1045
1046     var bind = key ? bindKey : bindIndex,
1047         parents = this._parents,
1048         groups = this._groups;
1049
1050     if (typeof value !== "function") value = constant$1(value);
1051
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],
1054           group = groups[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);
1061
1062       bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
1063
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;
1072         }
1073       }
1074     }
1075
1076     update = new Selection(update, parents);
1077     update._enter = enter;
1078     update._exit = exit;
1079     return update;
1080   }
1081
1082   function selection_exit() {
1083     return new Selection(this._exit || this._groups.map(sparse), this._parents);
1084   }
1085
1086   function selection_merge(selection) {
1087
1088     for (var groups0 = this._groups, groups1 = selection._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]) {
1091           merge[i] = node;
1092         }
1093       }
1094     }
1095
1096     for (; j < m0; ++j) {
1097       merges[j] = groups0[j];
1098     }
1099
1100     return new Selection(merges, this._parents);
1101   }
1102
1103   function selection_order() {
1104
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);
1109           next = node;
1110         }
1111       }
1112     }
1113
1114     return this;
1115   }
1116
1117   function selection_sort(compare) {
1118     if (!compare) compare = ascending$1;
1119
1120     function compareNode(a, b) {
1121       return a && b ? compare(a.__data__, b.__data__) : !a - !b;
1122     }
1123
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;
1128         }
1129       }
1130       sortgroup.sort(compareNode);
1131     }
1132
1133     return new Selection(sortgroups, this._parents).order();
1134   }
1135
1136   function ascending$1(a, b) {
1137     return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
1138   }
1139
1140   function selection_call() {
1141     var callback = arguments[0];
1142     arguments[0] = this;
1143     callback.apply(null, arguments);
1144     return this;
1145   }
1146
1147   function selection_nodes() {
1148     var nodes = new Array(this.size()), i = -1;
1149     this.each(function() { nodes[++i] = this; });
1150     return nodes;
1151   }
1152
1153   function selection_node() {
1154
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;
1159       }
1160     }
1161
1162     return null;
1163   }
1164
1165   function selection_size() {
1166     var size = 0;
1167     this.each(function() { ++size; });
1168     return size;
1169   }
1170
1171   function selection_empty() {
1172     return !this.node();
1173   }
1174
1175   function selection_each(callback) {
1176
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);
1180       }
1181     }
1182
1183     return this;
1184   }
1185
1186   function attrRemove(name) {
1187     return function() {
1188       this.removeAttribute(name);
1189     };
1190   }
1191
1192   function attrRemoveNS(fullname) {
1193     return function() {
1194       this.removeAttributeNS(fullname.space, fullname.local);
1195     };
1196   }
1197
1198   function attrConstant(name, value) {
1199     return function() {
1200       this.setAttribute(name, value);
1201     };
1202   }
1203
1204   function attrConstantNS(fullname, value) {
1205     return function() {
1206       this.setAttributeNS(fullname.space, fullname.local, value);
1207     };
1208   }
1209
1210   function attrFunction(name, value) {
1211     return function() {
1212       var v = value.apply(this, arguments);
1213       if (v == null) this.removeAttribute(name);
1214       else this.setAttribute(name, v);
1215     };
1216   }
1217
1218   function attrFunctionNS(fullname, value) {
1219     return function() {
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);
1223     };
1224   }
1225
1226   function selection_attr(name, value) {
1227     var fullname = namespace(name);
1228
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);
1234     }
1235
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));
1240   }
1241
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
1246   }
1247
1248   function styleRemove(name) {
1249     return function() {
1250       this.style.removeProperty(name);
1251     };
1252   }
1253
1254   function styleConstant(name, value, priority) {
1255     return function() {
1256       this.style.setProperty(name, value, priority);
1257     };
1258   }
1259
1260   function styleFunction(name, value, priority) {
1261     return function() {
1262       var v = value.apply(this, arguments);
1263       if (v == null) this.style.removeProperty(name);
1264       else this.style.setProperty(name, v, priority);
1265     };
1266   }
1267
1268   function selection_style(name, value, priority) {
1269     return arguments.length > 1
1270         ? this.each((value == null
1271               ? styleRemove : typeof value === "function"
1272               ? styleFunction
1273               : styleConstant)(name, value, priority == null ? "" : priority))
1274         : styleValue(this.node(), name);
1275   }
1276
1277   function styleValue(node, name) {
1278     return node.style.getPropertyValue(name)
1279         || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
1280   }
1281
1282   function propertyRemove(name) {
1283     return function() {
1284       delete this[name];
1285     };
1286   }
1287
1288   function propertyConstant(name, value) {
1289     return function() {
1290       this[name] = value;
1291     };
1292   }
1293
1294   function propertyFunction(name, value) {
1295     return function() {
1296       var v = value.apply(this, arguments);
1297       if (v == null) delete this[name];
1298       else this[name] = v;
1299     };
1300   }
1301
1302   function selection_property(name, value) {
1303     return arguments.length > 1
1304         ? this.each((value == null
1305             ? propertyRemove : typeof value === "function"
1306             ? propertyFunction
1307             : propertyConstant)(name, value))
1308         : this.node()[name];
1309   }
1310
1311   function classArray(string) {
1312     return string.trim().split(/^|\s+/);
1313   }
1314
1315   function classList(node) {
1316     return node.classList || new ClassList(node);
1317   }
1318
1319   function ClassList(node) {
1320     this._node = node;
1321     this._names = classArray(node.getAttribute("class") || "");
1322   }
1323
1324   ClassList.prototype = {
1325     add: function(name) {
1326       var i = this._names.indexOf(name);
1327       if (i < 0) {
1328         this._names.push(name);
1329         this._node.setAttribute("class", this._names.join(" "));
1330       }
1331     },
1332     remove: function(name) {
1333       var i = this._names.indexOf(name);
1334       if (i >= 0) {
1335         this._names.splice(i, 1);
1336         this._node.setAttribute("class", this._names.join(" "));
1337       }
1338     },
1339     contains: function(name) {
1340       return this._names.indexOf(name) >= 0;
1341     }
1342   };
1343
1344   function classedAdd(node, names) {
1345     var list = classList(node), i = -1, n = names.length;
1346     while (++i < n) list.add(names[i]);
1347   }
1348
1349   function classedRemove(node, names) {
1350     var list = classList(node), i = -1, n = names.length;
1351     while (++i < n) list.remove(names[i]);
1352   }
1353
1354   function classedTrue(names) {
1355     return function() {
1356       classedAdd(this, names);
1357     };
1358   }
1359
1360   function classedFalse(names) {
1361     return function() {
1362       classedRemove(this, names);
1363     };
1364   }
1365
1366   function classedFunction(names, value) {
1367     return function() {
1368       (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
1369     };
1370   }
1371
1372   function selection_classed(name, value) {
1373     var names = classArray(name + "");
1374
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;
1378       return true;
1379     }
1380
1381     return this.each((typeof value === "function"
1382         ? classedFunction : value
1383         ? classedTrue
1384         : classedFalse)(names, value));
1385   }
1386
1387   function textRemove() {
1388     this.textContent = "";
1389   }
1390
1391   function textConstant(value) {
1392     return function() {
1393       this.textContent = value;
1394     };
1395   }
1396
1397   function textFunction(value) {
1398     return function() {
1399       var v = value.apply(this, arguments);
1400       this.textContent = v == null ? "" : v;
1401     };
1402   }
1403
1404   function selection_text(value) {
1405     return arguments.length
1406         ? this.each(value == null
1407             ? textRemove : (typeof value === "function"
1408             ? textFunction
1409             : textConstant)(value))
1410         : this.node().textContent;
1411   }
1412
1413   function htmlRemove() {
1414     this.innerHTML = "";
1415   }
1416
1417   function htmlConstant(value) {
1418     return function() {
1419       this.innerHTML = value;
1420     };
1421   }
1422
1423   function htmlFunction(value) {
1424     return function() {
1425       var v = value.apply(this, arguments);
1426       this.innerHTML = v == null ? "" : v;
1427     };
1428   }
1429
1430   function selection_html(value) {
1431     return arguments.length
1432         ? this.each(value == null
1433             ? htmlRemove : (typeof value === "function"
1434             ? htmlFunction
1435             : htmlConstant)(value))
1436         : this.node().innerHTML;
1437   }
1438
1439   function raise() {
1440     if (this.nextSibling) this.parentNode.appendChild(this);
1441   }
1442
1443   function selection_raise() {
1444     return this.each(raise);
1445   }
1446
1447   function lower() {
1448     if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
1449   }
1450
1451   function selection_lower() {
1452     return this.each(lower);
1453   }
1454
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));
1459     });
1460   }
1461
1462   function constantNull() {
1463     return null;
1464   }
1465
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);
1471     });
1472   }
1473
1474   function remove() {
1475     var parent = this.parentNode;
1476     if (parent) parent.removeChild(this);
1477   }
1478
1479   function selection_remove() {
1480     return this.each(remove);
1481   }
1482
1483   function selection_cloneShallow() {
1484     return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);
1485   }
1486
1487   function selection_cloneDeep() {
1488     return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);
1489   }
1490
1491   function selection_clone(deep) {
1492     return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
1493   }
1494
1495   function selection_datum(value) {
1496     return arguments.length
1497         ? this.property("__data__", value)
1498         : this.node().__data__;
1499   }
1500
1501   var filterEvents = {};
1502
1503   var event = null;
1504
1505   if (typeof document !== "undefined") {
1506     var element$1 = document.documentElement;
1507     if (!("onmouseenter" in element$1)) {
1508       filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
1509     }
1510   }
1511
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);
1518       }
1519     };
1520   }
1521
1522   function contextListener(listener, index, group) {
1523     return function(event1) {
1524       var event0 = event; // Events can be reentrant (e.g., focus).
1525       event = event1;
1526       try {
1527         listener.call(this, this.__data__, index, group);
1528       } finally {
1529         event = event0;
1530       }
1531     };
1532   }
1533
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};
1539     });
1540   }
1541
1542   function onRemove(typename) {
1543     return function() {
1544       var on = this.__on;
1545       if (!on) return;
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);
1549         } else {
1550           on[++i] = o;
1551         }
1552       }
1553       if (++i) on.length = i;
1554       else delete this.__on;
1555     };
1556   }
1557
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);
1566           o.value = value;
1567           return;
1568         }
1569       }
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];
1573       else on.push(o);
1574     };
1575   }
1576
1577   function selection_on(typename, value, capture) {
1578     var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
1579
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) {
1585             return o.value;
1586           }
1587         }
1588       }
1589       return;
1590     }
1591
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));
1595     return this;
1596   }
1597
1598   function customEvent(event1, listener, that, args) {
1599     var event0 = event;
1600     event1.sourceEvent = event;
1601     event = event1;
1602     try {
1603       return listener.apply(that, args);
1604     } finally {
1605       event = event0;
1606     }
1607   }
1608
1609   function dispatchEvent(node, type, params) {
1610     var window = defaultView(node),
1611         event = window.CustomEvent;
1612
1613     if (typeof event === "function") {
1614       event = new event(type, params);
1615     } else {
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);
1619     }
1620
1621     node.dispatchEvent(event);
1622   }
1623
1624   function dispatchConstant(type, params) {
1625     return function() {
1626       return dispatchEvent(this, type, params);
1627     };
1628   }
1629
1630   function dispatchFunction(type, params) {
1631     return function() {
1632       return dispatchEvent(this, type, params.apply(this, arguments));
1633     };
1634   }
1635
1636   function selection_dispatch(type, params) {
1637     return this.each((typeof params === "function"
1638         ? dispatchFunction
1639         : dispatchConstant)(type, params));
1640   }
1641
1642   var root = [null];
1643
1644   function Selection(groups, parents) {
1645     this._groups = groups;
1646     this._parents = parents;
1647   }
1648
1649   function selection() {
1650     return new Selection([[document.documentElement]], root);
1651   }
1652
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,
1683     on: selection_on,
1684     dispatch: selection_dispatch
1685   };
1686
1687   function select(selector) {
1688     return typeof selector === "string"
1689         ? new Selection([[document.querySelector(selector)]], [document.documentElement])
1690         : new Selection([[selector]], root);
1691   }
1692
1693   function create(name) {
1694     return select(creator(name).call(document.documentElement));
1695   }
1696
1697   var nextId = 0;
1698
1699   function local() {
1700     return new Local;
1701   }
1702
1703   function Local() {
1704     this._ = "@" + (++nextId).toString(36);
1705   }
1706
1707   Local.prototype = local.prototype = {
1708     constructor: Local,
1709     get: function(node) {
1710       var id = this._;
1711       while (!(id in node)) if (!(node = node.parentNode)) return;
1712       return node[id];
1713     },
1714     set: function(node, value) {
1715       return node[this._] = value;
1716     },
1717     remove: function(node) {
1718       return this._ in node && delete node[this._];
1719     },
1720     toString: function() {
1721       return this._;
1722     }
1723   };
1724
1725   function sourceEvent() {
1726     var current = event, source;
1727     while (source = current.sourceEvent) current = source;
1728     return current;
1729   }
1730
1731   function point(node, event) {
1732     var svg = node.ownerSVGElement || node;
1733
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];
1739     }
1740
1741     var rect = node.getBoundingClientRect();
1742     return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
1743   }
1744
1745   function mouse(node) {
1746     var event = sourceEvent();
1747     if (event.changedTouches) event = event.changedTouches[0];
1748     return point(node, event);
1749   }
1750
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);
1755   }
1756
1757   function touch(node, touches, identifier) {
1758     if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
1759
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);
1763       }
1764     }
1765
1766     return null;
1767   }
1768
1769   function d3_touches(node, touches) {
1770     if (touches == null) touches = sourceEvent().touches;
1771
1772     for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
1773       points[i] = point(node, touches[i]);
1774     }
1775
1776     return points;
1777   }
1778
1779   function nopropagation() {
1780     event.stopImmediatePropagation();
1781   }
1782
1783   function noevent() {
1784     event.preventDefault();
1785     event.stopImmediatePropagation();
1786   }
1787
1788   function dragDisable(view) {
1789     var root = view.document.documentElement,
1790         selection = select(view).on("dragstart.drag", noevent, true);
1791     if ("onselectstart" in root) {
1792       selection.on("selectstart.drag", noevent, true);
1793     } else {
1794       root.__noselect = root.style.MozUserSelect;
1795       root.style.MozUserSelect = "none";
1796     }
1797   }
1798
1799   function yesdrag(view, noclick) {
1800     var root = view.document.documentElement,
1801         selection = select(view).on("dragstart.drag", null);
1802     if (noclick) {
1803       selection.on("click.drag", noevent, true);
1804       setTimeout(function() { selection.on("click.drag", null); }, 0);
1805     }
1806     if ("onselectstart" in root) {
1807       selection.on("selectstart.drag", null);
1808     } else {
1809       root.style.MozUserSelect = root.__noselect;
1810       delete root.__noselect;
1811     }
1812   }
1813
1814   function constant$2(x) {
1815     return function() {
1816       return x;
1817     };
1818   }
1819
1820   function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
1821     this.target = target;
1822     this.type = type;
1823     this.subject = subject;
1824     this.identifier = id;
1825     this.active = active;
1826     this.x = x;
1827     this.y = y;
1828     this.dx = dx;
1829     this.dy = dy;
1830     this._ = dispatch;
1831   }
1832
1833   DragEvent.prototype.on = function() {
1834     var value = this._.on.apply(this._, arguments);
1835     return value === this._ ? this : value;
1836   };
1837
1838   // Ignore right-click, since that should open the context menu.
1839   function defaultFilter() {
1840     return !event.button;
1841   }
1842
1843   function defaultContainer() {
1844     return this.parentNode;
1845   }
1846
1847   function defaultSubject(d) {
1848     return d == null ? {x: event.x, y: event.y} : d;
1849   }
1850
1851   function defaultTouchable() {
1852     return "ontouchstart" in this;
1853   }
1854
1855   function d3_drag() {
1856     var filter = defaultFilter,
1857         container = defaultContainer,
1858         subject = defaultSubject,
1859         touchable = defaultTouchable,
1860         gestures = {},
1861         listeners = dispatch("start", "drag", "end"),
1862         active = 0,
1863         mousedownx,
1864         mousedowny,
1865         mousemoving,
1866         touchending,
1867         clickDistance2 = 0;
1868
1869     function drag(selection) {
1870       selection
1871           .on("mousedown.drag", mousedowned)
1872         .filter(touchable)
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)");
1878     }
1879
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);
1885       dragDisable(event.view);
1886       nopropagation();
1887       mousemoving = false;
1888       mousedownx = event.clientX;
1889       mousedowny = event.clientY;
1890       gesture("start");
1891     }
1892
1893     function mousemoved() {
1894       noevent();
1895       if (!mousemoving) {
1896         var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
1897         mousemoving = dx * dx + dy * dy > clickDistance2;
1898       }
1899       gestures.mouse("drag");
1900     }
1901
1902     function mouseupped() {
1903       select(event.view).on("mousemove.drag mouseup.drag", null);
1904       yesdrag(event.view, mousemoving);
1905       noevent();
1906       gestures.mouse("end");
1907     }
1908
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;
1914
1915       for (i = 0; i < n; ++i) {
1916         if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
1917           nopropagation();
1918           gesture("start");
1919         }
1920       }
1921     }
1922
1923     function touchmoved() {
1924       var touches = event.changedTouches,
1925           n = touches.length, i, gesture;
1926
1927       for (i = 0; i < n; ++i) {
1928         if (gesture = gestures[touches[i].identifier]) {
1929           noevent();
1930           gesture("drag");
1931         }
1932       }
1933     }
1934
1935     function touchended() {
1936       var touches = event.changedTouches,
1937           n = touches.length, i, gesture;
1938
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]) {
1943           nopropagation();
1944           gesture("end");
1945         }
1946       }
1947     }
1948
1949     function beforestart(id, container, point, that, args) {
1950       var p = point(container, id), s, dx, dy,
1951           sublisteners = listeners.copy();
1952
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;
1957         return true;
1958       })) return;
1959
1960       return function gesture(type) {
1961         var p0 = p, n;
1962         switch (type) {
1963           case "start": gestures[id] = gesture, n = active++; break;
1964           case "end": delete gestures[id], --active; // nobreak
1965           case "drag": p = point(container, id), n = active; break;
1966         }
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]);
1968       };
1969     }
1970
1971     drag.filter = function(_) {
1972       return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter;
1973     };
1974
1975     drag.container = function(_) {
1976       return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container;
1977     };
1978
1979     drag.subject = function(_) {
1980       return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject;
1981     };
1982
1983     drag.touchable = function(_) {
1984       return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable;
1985     };
1986
1987     drag.on = function() {
1988       var value = listeners.on.apply(listeners, arguments);
1989       return value === listeners ? drag : value;
1990     };
1991
1992     drag.clickDistance = function(_) {
1993       return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
1994     };
1995
1996     return drag;
1997   }
1998
1999   function define(constructor, factory, prototype) {
2000     constructor.prototype = factory.prototype = prototype;
2001     prototype.constructor = constructor;
2002   }
2003
2004   function extend(parent, definition) {
2005     var prototype = Object.create(parent.prototype);
2006     for (var key in definition) prototype[key] = definition[key];
2007     return prototype;
2008   }
2009
2010   function Color() {}
2011
2012   var darker = 0.7;
2013   var brighter = 1 / darker;
2014
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] + "\\)$");
2026
2027   var named = {
2028     aliceblue: 0xf0f8ff,
2029     antiquewhite: 0xfaebd7,
2030     aqua: 0x00ffff,
2031     aquamarine: 0x7fffd4,
2032     azure: 0xf0ffff,
2033     beige: 0xf5f5dc,
2034     bisque: 0xffe4c4,
2035     black: 0x000000,
2036     blanchedalmond: 0xffebcd,
2037     blue: 0x0000ff,
2038     blueviolet: 0x8a2be2,
2039     brown: 0xa52a2a,
2040     burlywood: 0xdeb887,
2041     cadetblue: 0x5f9ea0,
2042     chartreuse: 0x7fff00,
2043     chocolate: 0xd2691e,
2044     coral: 0xff7f50,
2045     cornflowerblue: 0x6495ed,
2046     cornsilk: 0xfff8dc,
2047     crimson: 0xdc143c,
2048     cyan: 0x00ffff,
2049     darkblue: 0x00008b,
2050     darkcyan: 0x008b8b,
2051     darkgoldenrod: 0xb8860b,
2052     darkgray: 0xa9a9a9,
2053     darkgreen: 0x006400,
2054     darkgrey: 0xa9a9a9,
2055     darkkhaki: 0xbdb76b,
2056     darkmagenta: 0x8b008b,
2057     darkolivegreen: 0x556b2f,
2058     darkorange: 0xff8c00,
2059     darkorchid: 0x9932cc,
2060     darkred: 0x8b0000,
2061     darksalmon: 0xe9967a,
2062     darkseagreen: 0x8fbc8f,
2063     darkslateblue: 0x483d8b,
2064     darkslategray: 0x2f4f4f,
2065     darkslategrey: 0x2f4f4f,
2066     darkturquoise: 0x00ced1,
2067     darkviolet: 0x9400d3,
2068     deeppink: 0xff1493,
2069     deepskyblue: 0x00bfff,
2070     dimgray: 0x696969,
2071     dimgrey: 0x696969,
2072     dodgerblue: 0x1e90ff,
2073     firebrick: 0xb22222,
2074     floralwhite: 0xfffaf0,
2075     forestgreen: 0x228b22,
2076     fuchsia: 0xff00ff,
2077     gainsboro: 0xdcdcdc,
2078     ghostwhite: 0xf8f8ff,
2079     gold: 0xffd700,
2080     goldenrod: 0xdaa520,
2081     gray: 0x808080,
2082     green: 0x008000,
2083     greenyellow: 0xadff2f,
2084     grey: 0x808080,
2085     honeydew: 0xf0fff0,
2086     hotpink: 0xff69b4,
2087     indianred: 0xcd5c5c,
2088     indigo: 0x4b0082,
2089     ivory: 0xfffff0,
2090     khaki: 0xf0e68c,
2091     lavender: 0xe6e6fa,
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,
2110     lime: 0x00ff00,
2111     limegreen: 0x32cd32,
2112     linen: 0xfaf0e6,
2113     magenta: 0xff00ff,
2114     maroon: 0x800000,
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,
2127     moccasin: 0xffe4b5,
2128     navajowhite: 0xffdead,
2129     navy: 0x000080,
2130     oldlace: 0xfdf5e6,
2131     olive: 0x808000,
2132     olivedrab: 0x6b8e23,
2133     orange: 0xffa500,
2134     orangered: 0xff4500,
2135     orchid: 0xda70d6,
2136     palegoldenrod: 0xeee8aa,
2137     palegreen: 0x98fb98,
2138     paleturquoise: 0xafeeee,
2139     palevioletred: 0xdb7093,
2140     papayawhip: 0xffefd5,
2141     peachpuff: 0xffdab9,
2142     peru: 0xcd853f,
2143     pink: 0xffc0cb,
2144     plum: 0xdda0dd,
2145     powderblue: 0xb0e0e6,
2146     purple: 0x800080,
2147     rebeccapurple: 0x663399,
2148     red: 0xff0000,
2149     rosybrown: 0xbc8f8f,
2150     royalblue: 0x4169e1,
2151     saddlebrown: 0x8b4513,
2152     salmon: 0xfa8072,
2153     sandybrown: 0xf4a460,
2154     seagreen: 0x2e8b57,
2155     seashell: 0xfff5ee,
2156     sienna: 0xa0522d,
2157     silver: 0xc0c0c0,
2158     skyblue: 0x87ceeb,
2159     slateblue: 0x6a5acd,
2160     slategray: 0x708090,
2161     slategrey: 0x708090,
2162     snow: 0xfffafa,
2163     springgreen: 0x00ff7f,
2164     steelblue: 0x4682b4,
2165     tan: 0xd2b48c,
2166     teal: 0x008080,
2167     thistle: 0xd8bfd8,
2168     tomato: 0xff6347,
2169     turquoise: 0x40e0d0,
2170     violet: 0xee82ee,
2171     wheat: 0xf5deb3,
2172     white: 0xffffff,
2173     whitesmoke: 0xf5f5f5,
2174     yellow: 0xffff00,
2175     yellowgreen: 0x9acd32
2176   };
2177
2178   define(Color, color, {
2179     displayable: function() {
2180       return this.rgb().displayable();
2181     },
2182     toString: function() {
2183       return this.rgb() + "";
2184     }
2185   });
2186
2187   function color(format) {
2188     var m;
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)
2200         : null;
2201   }
2202
2203   function rgbn(n) {
2204     return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
2205   }
2206
2207   function rgba(r, g, b, a) {
2208     if (a <= 0) r = g = b = NaN;
2209     return new Rgb(r, g, b, a);
2210   }
2211
2212   function rgbConvert(o) {
2213     if (!(o instanceof Color)) o = color(o);
2214     if (!o) return new Rgb;
2215     o = o.rgb();
2216     return new Rgb(o.r, o.g, o.b, o.opacity);
2217   }
2218
2219   function rgb(r, g, b, opacity) {
2220     return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
2221   }
2222
2223   function Rgb(r, g, b, opacity) {
2224     this.r = +r;
2225     this.g = +g;
2226     this.b = +b;
2227     this.opacity = +opacity;
2228   }
2229
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);
2234     },
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);
2238     },
2239     rgb: function() {
2240       return this;
2241     },
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);
2247     },
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 + ")");
2255     }
2256   }));
2257
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);
2263   }
2264
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;
2270     o = o.rgb();
2271     var r = o.r / 255,
2272         g = o.g / 255,
2273         b = o.b / 255,
2274         min = Math.min(r, g, b),
2275         max = Math.max(r, g, b),
2276         h = NaN,
2277         s = max - min,
2278         l = (max + min) / 2;
2279     if (s) {
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;
2284       h *= 60;
2285     } else {
2286       s = l > 0 && l < 1 ? 0 : h;
2287     }
2288     return new Hsl(h, s, l, o.opacity);
2289   }
2290
2291   function hsl(h, s, l, opacity) {
2292     return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
2293   }
2294
2295   function Hsl(h, s, l, opacity) {
2296     this.h = +h;
2297     this.s = +s;
2298     this.l = +l;
2299     this.opacity = +opacity;
2300   }
2301
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);
2306     },
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);
2310     },
2311     rgb: function() {
2312       var h = this.h % 360 + (this.h < 0) * 360,
2313           s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
2314           l = this.l,
2315           m2 = l + (l < 0.5 ? l : 1 - l) * s,
2316           m1 = 2 * l - m2;
2317       return new Rgb(
2318         hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
2319         hsl2rgb(h, m1, m2),
2320         hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
2321         this.opacity
2322       );
2323     },
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);
2328     }
2329   }));
2330
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
2334         : h < 180 ? m2
2335         : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
2336         : m1) * 255;
2337   }
2338
2339   var deg2rad = Math.PI / 180;
2340   var rad2deg = 180 / Math.PI;
2341
2342   var Kn = 18,
2343       Xn = 0.950470, // D65 standard referent
2344       Yn = 1,
2345       Zn = 1.088830,
2346       t0 = 4 / 29,
2347       t1 = 6 / 29,
2348       t2 = 3 * t1 * t1,
2349       t3 = t1 * t1 * t1;
2350
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);
2356     }
2357     if (!(o instanceof Rgb)) o = rgbConvert(o);
2358     var b = rgb2xyz(o.r),
2359         a = rgb2xyz(o.g),
2360         l = rgb2xyz(o.b),
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);
2365   }
2366
2367   function lab(l, a, b, opacity) {
2368     return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
2369   }
2370
2371   function Lab(l, a, b, opacity) {
2372     this.l = +l;
2373     this.a = +a;
2374     this.b = +b;
2375     this.opacity = +opacity;
2376   }
2377
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);
2381     },
2382     darker: function(k) {
2383       return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
2384     },
2385     rgb: function() {
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);
2392       return new Rgb(
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),
2396         this.opacity
2397       );
2398     }
2399   }));
2400
2401   function xyz2lab(t) {
2402     return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
2403   }
2404
2405   function lab2xyz(t) {
2406     return t > t1 ? t * t * t : t2 * (t - t0);
2407   }
2408
2409   function xyz2rgb(x) {
2410     return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
2411   }
2412
2413   function rgb2xyz(x) {
2414     return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
2415   }
2416
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);
2422   }
2423
2424   function hcl(h, c, l, opacity) {
2425     return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
2426   }
2427
2428   function Hcl(h, c, l, opacity) {
2429     this.h = +h;
2430     this.c = +c;
2431     this.l = +l;
2432     this.opacity = +opacity;
2433   }
2434
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);
2438     },
2439     darker: function(k) {
2440       return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity);
2441     },
2442     rgb: function() {
2443       return labConvert(this).rgb();
2444     }
2445   }));
2446
2447   var A = -0.14861,
2448       B = +1.78277,
2449       C = -0.29227,
2450       D = -0.90649,
2451       E = +1.97294,
2452       ED = E * D,
2453       EB = E * B,
2454       BC_DA = B * C - D * A;
2455
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);
2459     var r = o.r / 255,
2460         g = o.g / 255,
2461         b = o.b / 255,
2462         l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
2463         bl = b - l,
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);
2468   }
2469
2470   function cubehelix(h, s, l, opacity) {
2471     return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
2472   }
2473
2474   function Cubehelix(h, s, l, opacity) {
2475     this.h = +h;
2476     this.s = +s;
2477     this.l = +l;
2478     this.opacity = +opacity;
2479   }
2480
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);
2485     },
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);
2489     },
2490     rgb: function() {
2491       var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
2492           l = +this.l,
2493           a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
2494           cosh = Math.cos(h),
2495           sinh = Math.sin(h);
2496       return new Rgb(
2497         255 * (l + a * (A * cosh + B * sinh)),
2498         255 * (l + a * (C * cosh + D * sinh)),
2499         255 * (l + a * (E * cosh)),
2500         this.opacity
2501       );
2502     }
2503   }));
2504
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
2510         + t3 * v3) / 6;
2511   }
2512
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),
2517           v1 = values[i],
2518           v2 = values[i + 1],
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);
2522     };
2523   }
2524
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],
2530           v1 = values[i % n],
2531           v2 = values[(i + 1) % n],
2532           v3 = values[(i + 2) % n];
2533       return basis((t - i / n) * n, v0, v1, v2, v3);
2534     };
2535   }
2536
2537   function constant$3(x) {
2538     return function() {
2539       return x;
2540     };
2541   }
2542
2543   function linear(a, d) {
2544     return function(t) {
2545       return a + t * d;
2546     };
2547   }
2548
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);
2552     };
2553   }
2554
2555   function hue(a, b) {
2556     var d = b - a;
2557     return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a);
2558   }
2559
2560   function gamma(y) {
2561     return (y = +y) === 1 ? nogamma : function(a, b) {
2562       return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a);
2563     };
2564   }
2565
2566   function nogamma(a, b) {
2567     var d = b - a;
2568     return d ? linear(a, d) : constant$3(isNaN(a) ? b : a);
2569   }
2570
2571   var interpolateRgb = (function rgbGamma(y) {
2572     var color = gamma(y);
2573
2574     function rgb$1(start, end) {
2575       var r = color((start = rgb(start)).r, (end = rgb(end)).r),
2576           g = color(start.g, end.g),
2577           b = color(start.b, end.b),
2578           opacity = nogamma(start.opacity, end.opacity);
2579       return function(t) {
2580         start.r = r(t);
2581         start.g = g(t);
2582         start.b = b(t);
2583         start.opacity = opacity(t);
2584         return start + "";
2585       };
2586     }
2587
2588     rgb$1.gamma = rgbGamma;
2589
2590     return rgb$1;
2591   })(1);
2592
2593   function rgbSpline(spline) {
2594     return function(colors) {
2595       var n = colors.length,
2596           r = new Array(n),
2597           g = new Array(n),
2598           b = new Array(n),
2599           i, color;
2600       for (i = 0; i < n; ++i) {
2601         color = rgb(colors[i]);
2602         r[i] = color.r || 0;
2603         g[i] = color.g || 0;
2604         b[i] = color.b || 0;
2605       }
2606       r = spline(r);
2607       g = spline(g);
2608       b = spline(b);
2609       color.opacity = 1;
2610       return function(t) {
2611         color.r = r(t);
2612         color.g = g(t);
2613         color.b = b(t);
2614         return color + "";
2615       };
2616     };
2617   }
2618
2619   var rgbBasis = rgbSpline(basis$1);
2620   var rgbBasisClosed = rgbSpline(basisClosed);
2621
2622   function array$1(a, b) {
2623     var nb = b ? b.length : 0,
2624         na = a ? Math.min(nb, a.length) : 0,
2625         x = new Array(na),
2626         c = new Array(nb),
2627         i;
2628
2629     for (i = 0; i < na; ++i) x[i] = interpolate(a[i], b[i]);
2630     for (; i < nb; ++i) c[i] = b[i];
2631
2632     return function(t) {
2633       for (i = 0; i < na; ++i) c[i] = x[i](t);
2634       return c;
2635     };
2636   }
2637
2638   function date(a, b) {
2639     var d = new Date;
2640     return a = +a, b -= a, function(t) {
2641       return d.setTime(a + b * t), d;
2642     };
2643   }
2644
2645   function interpolateNumber(a, b) {
2646     return a = +a, b -= a, function(t) {
2647       return a + b * t;
2648     };
2649   }
2650
2651   function object(a, b) {
2652     var i = {},
2653         c = {},
2654         k;
2655
2656     if (a === null || typeof a !== "object") a = {};
2657     if (b === null || typeof b !== "object") b = {};
2658
2659     for (k in b) {
2660       if (k in a) {
2661         i[k] = interpolate(a[k], b[k]);
2662       } else {
2663         c[k] = b[k];
2664       }
2665     }
2666
2667     return function(t) {
2668       for (k in i) c[k] = i[k](t);
2669       return c;
2670     };
2671   }
2672
2673   var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
2674       reB = new RegExp(reA.source, "g");
2675
2676   function zero(b) {
2677     return function() {
2678       return b;
2679     };
2680   }
2681
2682   function one(b) {
2683     return function(t) {
2684       return b(t) + "";
2685     };
2686   }
2687
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
2696
2697     // Coerce inputs to strings.
2698     a = a + "", b = b + "";
2699
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
2706         else s[++i] = bs;
2707       }
2708       if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
2709         if (s[i]) s[i] += bm; // coalesce with previous string
2710         else s[++i] = bm;
2711       } else { // interpolate non-matching numbers
2712         s[++i] = null;
2713         q.push({i: i, x: interpolateNumber(am, bm)});
2714       }
2715       bi = reB.lastIndex;
2716     }
2717
2718     // Add remains of b.
2719     if (bi < b.length) {
2720       bs = b.slice(bi);
2721       if (s[i]) s[i] += bs; // coalesce with previous string
2722       else s[++i] = bs;
2723     }
2724
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]
2728         ? one(q[0].x)
2729         : zero(b))
2730         : (b = q.length, function(t) {
2731             for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
2732             return s.join("");
2733           });
2734   }
2735
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);
2746   }
2747
2748   function interpolateRound(a, b) {
2749     return a = +a, b -= a, function(t) {
2750       return Math.round(a + b * t);
2751     };
2752   }
2753
2754   var degrees = 180 / Math.PI;
2755
2756   var identity$2 = {
2757     translateX: 0,
2758     translateY: 0,
2759     rotate: 0,
2760     skewX: 0,
2761     scaleX: 1,
2762     scaleY: 1
2763   };
2764
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;
2771     return {
2772       translateX: e,
2773       translateY: f,
2774       rotate: Math.atan2(b, a) * degrees,
2775       skewX: Math.atan(skewX) * degrees,
2776       scaleX: scaleX,
2777       scaleY: scaleY
2778     };
2779   }
2780
2781   var cssNode,
2782       cssRoot,
2783       cssView,
2784       svgNode;
2785
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]);
2794   }
2795
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);
2803   }
2804
2805   function interpolateTransform(parse, pxComma, pxParen, degParen) {
2806
2807     function pop(s) {
2808       return s.length ? s.pop() + " " : "";
2809     }
2810
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);
2817       }
2818     }
2819
2820     function rotate(a, b, s, q) {
2821       if (a !== b) {
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)});
2824       } else if (b) {
2825         s.push(pop(s) + "rotate(" + b + degParen);
2826       }
2827     }
2828
2829     function skewX(a, b, s, q) {
2830       if (a !== b) {
2831         q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: interpolateNumber(a, b)});
2832       } else if (b) {
2833         s.push(pop(s) + "skewX(" + b + degParen);
2834       }
2835     }
2836
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 + ")");
2843       }
2844     }
2845
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);
2854       a = b = null; // gc
2855       return function(t) {
2856         var i = -1, n = q.length, o;
2857         while (++i < n) s[(o = q[i]).i] = o.x(t);
2858         return s.join("");
2859       };
2860     };
2861   }
2862
2863   var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
2864   var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
2865
2866   var rho = Math.SQRT2,
2867       rho2 = 2,
2868       rho4 = 4,
2869       epsilon2 = 1e-12;
2870
2871   function cosh(x) {
2872     return ((x = Math.exp(x)) + 1 / x) / 2;
2873   }
2874
2875   function sinh(x) {
2876     return ((x = Math.exp(x)) - 1 / x) / 2;
2877   }
2878
2879   function tanh(x) {
2880     return ((x = Math.exp(2 * x)) - 1) / (x + 1);
2881   }
2882
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],
2888         dx = ux1 - ux0,
2889         dy = uy1 - uy0,
2890         d2 = dx * dx + dy * dy,
2891         i,
2892         S;
2893
2894     // Special case for u0 ≅ u1.
2895     if (d2 < epsilon2) {
2896       S = Math.log(w1 / w0) / rho;
2897       i = function(t) {
2898         return [
2899           ux0 + t * dx,
2900           uy0 + t * dy,
2901           w0 * Math.exp(rho * t * S)
2902         ];
2903       };
2904     }
2905
2906     // General case.
2907     else {
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;
2914       i = function(t) {
2915         var s = t * S,
2916             coshr0 = cosh(r0),
2917             u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
2918         return [
2919           ux0 + u * dx,
2920           uy0 + u * dy,
2921           w0 * coshr0 / cosh(rho * s + r0)
2922         ];
2923       };
2924     }
2925
2926     i.duration = S * 1000;
2927
2928     return i;
2929   }
2930
2931   function hsl$1(hue) {
2932     return function(start, end) {
2933       var h = hue((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) {
2938         start.h = h(t);
2939         start.s = s(t);
2940         start.l = l(t);
2941         start.opacity = opacity(t);
2942         return start + "";
2943       };
2944     }
2945   }
2946
2947   var hsl$2 = hsl$1(hue);
2948   var hslLong = hsl$1(nogamma);
2949
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) {
2956       start.l = l(t);
2957       start.a = a(t);
2958       start.b = b(t);
2959       start.opacity = opacity(t);
2960       return start + "";
2961     };
2962   }
2963
2964   function hcl$1(hue) {
2965     return function(start, end) {
2966       var h = hue((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) {
2971         start.h = h(t);
2972         start.c = c(t);
2973         start.l = l(t);
2974         start.opacity = opacity(t);
2975         return start + "";
2976       };
2977     }
2978   }
2979
2980   var hcl$2 = hcl$1(hue);
2981   var hclLong = hcl$1(nogamma);
2982
2983   function cubehelix$1(hue) {
2984     return (function cubehelixGamma(y) {
2985       y = +y;
2986
2987       function cubehelix$1(start, end) {
2988         var h = hue((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) {
2993           start.h = h(t);
2994           start.s = s(t);
2995           start.l = l(Math.pow(t, y));
2996           start.opacity = opacity(t);
2997           return start + "";
2998         };
2999       }
3000
3001       cubehelix$1.gamma = cubehelixGamma;
3002
3003       return cubehelix$1;
3004     })(1);
3005   }
3006
3007   var cubehelix$2 = cubehelix$1(hue);
3008   var cubehelixLong = cubehelix$1(nogamma);
3009
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));
3013     return samples;
3014   }
3015
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
3020       taskHead,
3021       taskTail,
3022       clockLast = 0,
3023       clockNow = 0,
3024       clockSkew = 0,
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); };
3027
3028   function now() {
3029     return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
3030   }
3031
3032   function clearNow() {
3033     clockNow = 0;
3034   }
3035
3036   function Timer() {
3037     this._call =
3038     this._time =
3039     this._next = null;
3040   }
3041
3042   Timer.prototype = timer.prototype = {
3043     constructor: Timer,
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;
3050         taskTail = this;
3051       }
3052       this._call = callback;
3053       this._time = time;
3054       sleep();
3055     },
3056     stop: function() {
3057       if (this._call) {
3058         this._call = null;
3059         this._time = Infinity;
3060         sleep();
3061       }
3062     }
3063   };
3064
3065   function timer(callback, delay, time) {
3066     var t = new Timer;
3067     t.restart(callback, delay, time);
3068     return t;
3069   }
3070
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;
3075     while (t) {
3076       if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
3077       t = t._next;
3078     }
3079     --frame;
3080   }
3081
3082   function wake() {
3083     clockNow = (clockLast = clock.now()) + clockSkew;
3084     frame = timeout = 0;
3085     try {
3086       timerFlush();
3087     } finally {
3088       frame = 0;
3089       nap();
3090       clockNow = 0;
3091     }
3092   }
3093
3094   function poke() {
3095     var now = clock.now(), delay = now - clockLast;
3096     if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
3097   }
3098
3099   function nap() {
3100     var t0, t1 = taskHead, t2, time = Infinity;
3101     while (t1) {
3102       if (t1._call) {
3103         if (time > t1._time) time = t1._time;
3104         t0 = t1, t1 = t1._next;
3105       } else {
3106         t2 = t1._next, t1._next = null;
3107         t1 = t0 ? t0._next = t2 : taskHead = t2;
3108       }
3109     }
3110     taskTail = t0;
3111     sleep(time);
3112   }
3113
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.
3118     if (delay > 24) {
3119       if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
3120       if (interval) interval = clearInterval(interval);
3121     } else {
3122       if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
3123       frame = 1, setFrame(wake);
3124     }
3125   }
3126
3127   function timeout$1(callback, delay, time) {
3128     var t = new Timer;
3129     delay = delay == null ? 0 : +delay;
3130     t.restart(function(elapsed) {
3131       t.stop();
3132       callback(elapsed + delay);
3133     }, delay, time);
3134     return t;
3135   }
3136
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) {
3142       elapsed += total;
3143       t.restart(tick, total += delay, time);
3144       callback(elapsed);
3145     }, delay, time);
3146     return t;
3147   }
3148
3149   var emptyOn = dispatch("start", "end", "interrupt");
3150   var emptyTween = [];
3151
3152   var CREATED = 0;
3153   var SCHEDULED = 1;
3154   var STARTING = 2;
3155   var STARTED = 3;
3156   var RUNNING = 4;
3157   var ENDING = 5;
3158   var ENDED = 6;
3159
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, {
3165       name: name,
3166       index: index, // For context during callback.
3167       group: group, // For context during callback.
3168       on: emptyOn,
3169       tween: emptyTween,
3170       time: timing.time,
3171       delay: timing.delay,
3172       duration: timing.duration,
3173       ease: timing.ease,
3174       timer: null,
3175       state: CREATED
3176     });
3177   }
3178
3179   function init(node, id) {
3180     var schedule = get$1(node, id);
3181     if (schedule.state > CREATED) throw new Error("too late; already scheduled");
3182     return schedule;
3183   }
3184
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");
3188     return schedule;
3189   }
3190
3191   function get$1(node, id) {
3192     var schedule = node.__transition;
3193     if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
3194     return schedule;
3195   }
3196
3197   function create$1(node, id, self) {
3198     var schedules = node.__transition,
3199         tween;
3200
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);
3205
3206     function schedule(elapsed) {
3207       self.state = SCHEDULED;
3208       self.timer.restart(start, self.delay, self.time);
3209
3210       // If the elapsed delay is less than our first sleep, start immediately.
3211       if (self.delay <= elapsed) start(elapsed - self.delay);
3212     }
3213
3214     function start(elapsed) {
3215       var i, j, n, o;
3216
3217       // If the state is not SCHEDULED, then we previously errored on start.
3218       if (self.state !== SCHEDULED) return stop();
3219
3220       for (i in schedules) {
3221         o = schedules[i];
3222         if (o.name !== self.name) continue;
3223
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);
3228
3229         // Interrupt the active transition, if any.
3230         // Dispatch the interrupt event.
3231         if (o.state === RUNNING) {
3232           o.state = ENDED;
3233           o.timer.stop();
3234           o.on.call("interrupt", node, node.__data__, o.index, o.group);
3235           delete schedules[i];
3236         }
3237
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!
3241         else if (+i < id) {
3242           o.state = ENDED;
3243           o.timer.stop();
3244           delete schedules[i];
3245         }
3246       }
3247
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);
3256           tick(elapsed);
3257         }
3258       });
3259
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;
3266
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)) {
3271           tween[++j] = o;
3272         }
3273       }
3274       tween.length = j + 1;
3275     }
3276
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),
3279           i = -1,
3280           n = tween.length;
3281
3282       while (++i < n) {
3283         tween[i].call(null, t);
3284       }
3285
3286       // Dispatch the end event.
3287       if (self.state === ENDING) {
3288         self.on.call("end", node, node.__data__, self.index, self.group);
3289         stop();
3290       }
3291     }
3292
3293     function stop() {
3294       self.state = ENDED;
3295       self.timer.stop();
3296       delete schedules[id];
3297       for (var i in schedules) return; // eslint-disable-line no-unused-vars
3298       delete node.__transition;
3299     }
3300   }
3301
3302   function interrupt(node, name) {
3303     var schedules = node.__transition,
3304         schedule,
3305         active,
3306         empty = true,
3307         i;
3308
3309     if (!schedules) return;
3310
3311     name = name == null ? null : name + "";
3312
3313     for (i in schedules) {
3314       if ((schedule = schedules[i]).name !== name) { empty = false; continue; }
3315       active = schedule.state > STARTING && schedule.state < ENDING;
3316       schedule.state = ENDED;
3317       schedule.timer.stop();
3318       if (active) schedule.on.call("interrupt", node, node.__data__, schedule.index, schedule.group);
3319       delete schedules[i];
3320     }
3321
3322     if (empty) delete node.__transition;
3323   }
3324
3325   function selection_interrupt(name) {
3326     return this.each(function() {
3327       interrupt(this, name);
3328     });
3329   }
3330
3331   function tweenRemove(id, name) {
3332     var tween0, tween1;
3333     return function() {
3334       var schedule = set$1(this, id),
3335           tween = schedule.tween;
3336
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);
3346             break;
3347           }
3348         }
3349       }
3350
3351       schedule.tween = tween1;
3352     };
3353   }
3354
3355   function tweenFunction(id, name, value) {
3356     var tween0, tween1;
3357     if (typeof value !== "function") throw new Error;
3358     return function() {
3359       var schedule = set$1(this, id),
3360           tween = schedule.tween;
3361
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) {
3369             tween1[i] = t;
3370             break;
3371           }
3372         }
3373         if (i === n) tween1.push(t);
3374       }
3375
3376       schedule.tween = tween1;
3377     };
3378   }
3379
3380   function transition_tween(name, value) {
3381     var id = this._id;
3382
3383     name += "";
3384
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) {
3389           return t.value;
3390         }
3391       }
3392       return null;
3393     }
3394
3395     return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
3396   }
3397
3398   function tweenValue(transition, name, value) {
3399     var id = transition._id;
3400
3401     transition.each(function() {
3402       var schedule = set$1(this, id);
3403       (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
3404     });
3405
3406     return function(node) {
3407       return get$1(node, id).value[name];
3408     };
3409   }
3410
3411   function interpolate$1(a, b) {
3412     var c;
3413     return (typeof b === "number" ? interpolateNumber
3414         : b instanceof color ? interpolateRgb
3415         : (c = color(b)) ? (b = c, interpolateRgb)
3416         : interpolateString)(a, b);
3417   }
3418
3419   function attrRemove$1(name) {
3420     return function() {
3421       this.removeAttribute(name);
3422     };
3423   }
3424
3425   function attrRemoveNS$1(fullname) {
3426     return function() {
3427       this.removeAttributeNS(fullname.space, fullname.local);
3428     };
3429   }
3430
3431   function attrConstant$1(name, interpolate, value1) {
3432     var value00,
3433         interpolate0;
3434     return function() {
3435       var value0 = this.getAttribute(name);
3436       return value0 === value1 ? null
3437           : value0 === value00 ? interpolate0
3438           : interpolate0 = interpolate(value00 = value0, value1);
3439     };
3440   }
3441
3442   function attrConstantNS$1(fullname, interpolate, value1) {
3443     var value00,
3444         interpolate0;
3445     return function() {
3446       var value0 = this.getAttributeNS(fullname.space, fullname.local);
3447       return value0 === value1 ? null
3448           : value0 === value00 ? interpolate0
3449           : interpolate0 = interpolate(value00 = value0, value1);
3450     };
3451   }
3452
3453   function attrFunction$1(name, interpolate, value) {
3454     var value00,
3455         value10,
3456         interpolate0;
3457     return function() {
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(value00 = value0, value10 = value1);
3464     };
3465   }
3466
3467   function attrFunctionNS$1(fullname, interpolate, value) {
3468     var value00,
3469         value10,
3470         interpolate0;
3471     return function() {
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(value00 = value0, value10 = value1);
3478     };
3479   }
3480
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 + ""));
3487   }
3488
3489   function attrTweenNS(fullname, value) {
3490     function tween() {
3491       var node = this, i = value.apply(node, arguments);
3492       return i && function(t) {
3493         node.setAttributeNS(fullname.space, fullname.local, i(t));
3494       };
3495     }
3496     tween._value = value;
3497     return tween;
3498   }
3499
3500   function attrTween(name, value) {
3501     function tween() {
3502       var node = this, i = value.apply(node, arguments);
3503       return i && function(t) {
3504         node.setAttribute(name, i(t));
3505       };
3506     }
3507     tween._value = value;
3508     return tween;
3509   }
3510
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));
3518   }
3519
3520   function delayFunction(id, value) {
3521     return function() {
3522       init(this, id).delay = +value.apply(this, arguments);
3523     };
3524   }
3525
3526   function delayConstant(id, value) {
3527     return value = +value, function() {
3528       init(this, id).delay = value;
3529     };
3530   }
3531
3532   function transition_delay(value) {
3533     var id = this._id;
3534
3535     return arguments.length
3536         ? this.each((typeof value === "function"
3537             ? delayFunction
3538             : delayConstant)(id, value))
3539         : get$1(this.node(), id).delay;
3540   }
3541
3542   function durationFunction(id, value) {
3543     return function() {
3544       set$1(this, id).duration = +value.apply(this, arguments);
3545     };
3546   }
3547
3548   function durationConstant(id, value) {
3549     return value = +value, function() {
3550       set$1(this, id).duration = value;
3551     };
3552   }
3553
3554   function transition_duration(value) {
3555     var id = this._id;
3556
3557     return arguments.length
3558         ? this.each((typeof value === "function"
3559             ? durationFunction
3560             : durationConstant)(id, value))
3561         : get$1(this.node(), id).duration;
3562   }
3563
3564   function easeConstant(id, value) {
3565     if (typeof value !== "function") throw new Error;
3566     return function() {
3567       set$1(this, id).ease = value;
3568     };
3569   }
3570
3571   function transition_ease(value) {
3572     var id = this._id;
3573
3574     return arguments.length
3575         ? this.each(easeConstant(id, value))
3576         : get$1(this.node(), id).ease;
3577   }
3578
3579   function transition_filter(match) {
3580     if (typeof match !== "function") match = matcher$1(match);
3581
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);
3586         }
3587       }
3588     }
3589
3590     return new Transition(subgroups, this._parents, this._name, this._id);
3591   }
3592
3593   function transition_merge(transition) {
3594     if (transition._id !== this._id) throw new Error;
3595
3596     for (var groups0 = this._groups, groups1 = transition._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]) {
3599           merge[i] = node;
3600         }
3601       }
3602     }
3603
3604     for (; j < m0; ++j) {
3605       merges[j] = groups0[j];
3606     }
3607
3608     return new Transition(merges, this._parents, this._name, this._id);
3609   }
3610
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";
3616     });
3617   }
3618
3619   function onFunction(id, name, listener) {
3620     var on0, on1, sit = start(name) ? init : set$1;
3621     return function() {
3622       var schedule = sit(this, id),
3623           on = schedule.on;
3624
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);
3629
3630       schedule.on = on1;
3631     };
3632   }
3633
3634   function transition_on(name, listener) {
3635     var id = this._id;
3636
3637     return arguments.length < 2
3638         ? get$1(this.node(), id).on.on(name)
3639         : this.each(onFunction(id, name, listener));
3640   }
3641
3642   function removeFunction(id) {
3643     return function() {
3644       var parent = this.parentNode;
3645       for (var i in this.__transition) if (+i !== id) return;
3646       if (parent) parent.removeChild(this);
3647     };
3648   }
3649
3650   function transition_remove() {
3651     return this.on("end.remove", removeFunction(this._id));
3652   }
3653
3654   function transition_select(select) {
3655     var name = this._name,
3656         id = this._id;
3657
3658     if (typeof select !== "function") select = selector(select);
3659
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.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));
3666         }
3667       }
3668     }
3669
3670     return new Transition(subgroups, this._parents, name, id);
3671   }
3672
3673   function transition_selectAll(select) {
3674     var name = this._name,
3675         id = this._id;
3676
3677     if (typeof select !== "function") select = selectorAll(select);
3678
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.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);
3685             }
3686           }
3687           subgroups.push(children);
3688           parents.push(node);
3689         }
3690       }
3691     }
3692
3693     return new Transition(subgroups, parents, name, id);
3694   }
3695
3696   var Selection$1 = selection.prototype.constructor;
3697
3698   function transition_selection() {
3699     return new Selection$1(this._groups, this._parents);
3700   }
3701
3702   function styleRemove$1(name, interpolate) {
3703     var value00,
3704         value10,
3705         interpolate0;
3706     return function() {
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(value00 = value0, value10 = value1);
3712     };
3713   }
3714
3715   function styleRemoveEnd(name) {
3716     return function() {
3717       this.style.removeProperty(name);
3718     };
3719   }
3720
3721   function styleConstant$1(name, interpolate, value1) {
3722     var value00,
3723         interpolate0;
3724     return function() {
3725       var value0 = styleValue(this, name);
3726       return value0 === value1 ? null
3727           : value0 === value00 ? interpolate0
3728           : interpolate0 = interpolate(value00 = value0, value1);
3729     };
3730   }
3731
3732   function styleFunction$1(name, interpolate, value) {
3733     var value00,
3734         value10,
3735         interpolate0;
3736     return function() {
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(value00 = value0, value10 = value1);
3743     };
3744   }
3745
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);
3754   }
3755
3756   function styleTween(name, value, priority) {
3757     function tween() {
3758       var node = this, i = value.apply(node, arguments);
3759       return i && function(t) {
3760         node.style.setProperty(name, i(t), priority);
3761       };
3762     }
3763     tween._value = value;
3764     return tween;
3765   }
3766
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));
3773   }
3774
3775   function textConstant$1(value) {
3776     return function() {
3777       this.textContent = value;
3778     };
3779   }
3780
3781   function textFunction$1(value) {
3782     return function() {
3783       var value1 = value(this);
3784       this.textContent = value1 == null ? "" : value1;
3785     };
3786   }
3787
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 + ""));
3792   }
3793
3794   function transition_transition() {
3795     var name = this._name,
3796         id0 = this._id,
3797         id1 = newId();
3798
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,
3805             delay: 0,
3806             duration: inherit.duration,
3807             ease: inherit.ease
3808           });
3809         }
3810       }
3811     }
3812
3813     return new Transition(groups, this._parents, name, id1);
3814   }
3815
3816   var id = 0;
3817
3818   function Transition(groups, parents, name, id) {
3819     this._groups = groups;
3820     this._parents = parents;
3821     this._name = name;
3822     this._id = id;
3823   }
3824
3825   function transition(name) {
3826     return selection().transition(name);
3827   }
3828
3829   function newId() {
3830     return ++id;
3831   }
3832
3833   var selection_prototype = selection.prototype;
3834
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,
3849     on: transition_on,
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
3860   };
3861
3862   function linear$1(t) {
3863     return +t;
3864   }
3865
3866   function quadIn(t) {
3867     return t * t;
3868   }
3869
3870   function quadOut(t) {
3871     return t * (2 - t);
3872   }
3873
3874   function quadInOut(t) {
3875     return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
3876   }
3877
3878   function cubicIn(t) {
3879     return t * t * t;
3880   }
3881
3882   function cubicOut(t) {
3883     return --t * t * t + 1;
3884   }
3885
3886   function cubicInOut(t) {
3887     return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
3888   }
3889
3890   var exponent = 3;
3891
3892   var polyIn = (function custom(e) {
3893     e = +e;
3894
3895     function polyIn(t) {
3896       return Math.pow(t, e);
3897     }
3898
3899     polyIn.exponent = custom;
3900
3901     return polyIn;
3902   })(exponent);
3903
3904   var polyOut = (function custom(e) {
3905     e = +e;
3906
3907     function polyOut(t) {
3908       return 1 - Math.pow(1 - t, e);
3909     }
3910
3911     polyOut.exponent = custom;
3912
3913     return polyOut;
3914   })(exponent);
3915
3916   var polyInOut = (function custom(e) {
3917     e = +e;
3918
3919     function polyInOut(t) {
3920       return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
3921     }
3922
3923     polyInOut.exponent = custom;
3924
3925     return polyInOut;
3926   })(exponent);
3927
3928   var pi = Math.PI,
3929       halfPi = pi / 2;
3930
3931   function sinIn(t) {
3932     return 1 - Math.cos(t * halfPi);
3933   }
3934
3935   function sinOut(t) {
3936     return Math.sin(t * halfPi);
3937   }
3938
3939   function sinInOut(t) {
3940     return (1 - Math.cos(pi * t)) / 2;
3941   }
3942
3943   function expIn(t) {
3944     return Math.pow(2, 10 * t - 10);
3945   }
3946
3947   function expOut(t) {
3948     return 1 - Math.pow(2, -10 * t);
3949   }
3950
3951   function expInOut(t) {
3952     return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
3953   }
3954
3955   function circleIn(t) {
3956     return 1 - Math.sqrt(1 - t * t);
3957   }
3958
3959   function circleOut(t) {
3960     return Math.sqrt(1 - --t * t);
3961   }
3962
3963   function circleInOut(t) {
3964     return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
3965   }
3966
3967   var b1 = 4 / 11,
3968       b2 = 6 / 11,
3969       b3 = 8 / 11,
3970       b4 = 3 / 4,
3971       b5 = 9 / 11,
3972       b6 = 10 / 11,
3973       b7 = 15 / 16,
3974       b8 = 21 / 22,
3975       b9 = 63 / 64,
3976       b0 = 1 / b1 / b1;
3977
3978   function bounceIn(t) {
3979     return 1 - bounceOut(1 - t);
3980   }
3981
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;
3984   }
3985
3986   function bounceInOut(t) {
3987     return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
3988   }
3989
3990   var overshoot = 1.70158;
3991
3992   var backIn = (function custom(s) {
3993     s = +s;
3994
3995     function backIn(t) {
3996       return t * t * ((s + 1) * t - s);
3997     }
3998
3999     backIn.overshoot = custom;
4000
4001     return backIn;
4002   })(overshoot);
4003
4004   var backOut = (function custom(s) {
4005     s = +s;
4006
4007     function backOut(t) {
4008       return --t * t * ((s + 1) * t + s) + 1;
4009     }
4010
4011     backOut.overshoot = custom;
4012
4013     return backOut;
4014   })(overshoot);
4015
4016   var backInOut = (function custom(s) {
4017     s = +s;
4018
4019     function backInOut(t) {
4020       return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
4021     }
4022
4023     backInOut.overshoot = custom;
4024
4025     return backInOut;
4026   })(overshoot);
4027
4028   var tau = 2 * Math.PI,
4029       amplitude = 1,
4030       period = 0.3;
4031
4032   var elasticIn = (function custom(a, p) {
4033     var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4034
4035     function elasticIn(t) {
4036       return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
4037     }
4038
4039     elasticIn.amplitude = function(a) { return custom(a, p * tau); };
4040     elasticIn.period = function(p) { return custom(a, p); };
4041
4042     return elasticIn;
4043   })(amplitude, period);
4044
4045   var elasticOut = (function custom(a, p) {
4046     var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4047
4048     function elasticOut(t) {
4049       return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
4050     }
4051
4052     elasticOut.amplitude = function(a) { return custom(a, p * tau); };
4053     elasticOut.period = function(p) { return custom(a, p); };
4054
4055     return elasticOut;
4056   })(amplitude, period);
4057
4058   var elasticInOut = (function custom(a, p) {
4059     var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4060
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;
4065     }
4066
4067     elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
4068     elasticInOut.period = function(p) { return custom(a, p); };
4069
4070     return elasticInOut;
4071   })(amplitude, period);
4072
4073   var defaultTiming = {
4074     time: null, // Set on use.
4075     delay: 0,
4076     duration: 250,
4077     ease: cubicInOut
4078   };
4079
4080   function inherit(node, id) {
4081     var timing;
4082     while (!(timing = node.__transition) || !(timing = timing[id])) {
4083       if (!(node = node.parentNode)) {
4084         return defaultTiming.time = now(), defaultTiming;
4085       }
4086     }
4087     return timing;
4088   }
4089
4090   function selection_transition(name) {
4091     var id,
4092         timing;
4093
4094     if (name instanceof Transition) {
4095       id = name._id, name = name._name;
4096     } else {
4097       id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
4098     }
4099
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));
4104         }
4105       }
4106     }
4107
4108     return new Transition(groups, this._parents, name, id);
4109   }
4110
4111   selection.prototype.interrupt = selection_interrupt;
4112   selection.prototype.transition = selection_transition;
4113
4114   var root$1 = [null];
4115
4116   function active(node, name) {
4117     var schedules = node.__transition,
4118         schedule,
4119         i;
4120
4121     if (schedules) {
4122       name = name == null ? null : name + "";
4123       for (i in schedules) {
4124         if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) {
4125           return new Transition([[node]], root$1, name, +i);
4126         }
4127       }
4128     }
4129
4130     return null;
4131   }
4132
4133   function constant$4(x) {
4134     return function() {
4135       return x;
4136     };
4137   }
4138
4139   function BrushEvent(target, type, selection) {
4140     this.target = target;
4141     this.type = type;
4142     this.selection = selection;
4143   }
4144
4145   function nopropagation$1() {
4146     event.stopImmediatePropagation();
4147   }
4148
4149   function noevent$1() {
4150     event.preventDefault();
4151     event.stopImmediatePropagation();
4152   }
4153
4154   var MODE_DRAG = {name: "drag"},
4155       MODE_SPACE = {name: "space"},
4156       MODE_HANDLE = {name: "handle"},
4157       MODE_CENTER = {name: "center"};
4158
4159   var X = {
4160     name: "x",
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]]; }
4164   };
4165
4166   var Y = {
4167     name: "y",
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]]; }
4171   };
4172
4173   var XY = {
4174     name: "xy",
4175     handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type),
4176     input: function(xy) { return xy; },
4177     output: function(xy) { return xy; }
4178   };
4179
4180   var cursors = {
4181     overlay: "crosshair",
4182     selection: "move",
4183     n: "ns-resize",
4184     e: "ew-resize",
4185     s: "ns-resize",
4186     w: "ew-resize",
4187     nw: "nwse-resize",
4188     ne: "nesw-resize",
4189     se: "nwse-resize",
4190     sw: "nesw-resize"
4191   };
4192
4193   var flipX = {
4194     e: "w",
4195     w: "e",
4196     nw: "ne",
4197     ne: "nw",
4198     se: "sw",
4199     sw: "se"
4200   };
4201
4202   var flipY = {
4203     n: "s",
4204     s: "n",
4205     nw: "sw",
4206     ne: "se",
4207     se: "ne",
4208     sw: "nw"
4209   };
4210
4211   var signsX = {
4212     overlay: +1,
4213     selection: +1,
4214     n: null,
4215     e: +1,
4216     s: null,
4217     w: -1,
4218     nw: -1,
4219     ne: +1,
4220     se: +1,
4221     sw: -1
4222   };
4223
4224   var signsY = {
4225     overlay: +1,
4226     selection: +1,
4227     n: -1,
4228     e: null,
4229     s: +1,
4230     w: null,
4231     nw: -1,
4232     ne: -1,
4233     se: +1,
4234     sw: +1
4235   };
4236
4237   function type(t) {
4238     return {type: t};
4239   }
4240
4241   // Ignore right-click, since that should open the context menu.
4242   function defaultFilter$1() {
4243     return !event.button;
4244   }
4245
4246   function defaultExtent() {
4247     var svg = this.ownerSVGElement || this;
4248     return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];
4249   }
4250
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;
4255   }
4256
4257   function empty$1(extent) {
4258     return extent[0][0] === extent[1][0]
4259         || extent[0][1] === extent[1][1];
4260   }
4261
4262   function brushSelection(node) {
4263     var state = node.__brush;
4264     return state ? state.dim.output(state.selection) : null;
4265   }
4266
4267   function brushX() {
4268     return brush$1(X);
4269   }
4270
4271   function brushY() {
4272     return brush$1(Y);
4273   }
4274
4275   function brush() {
4276     return brush$1(XY);
4277   }
4278
4279   function brush$1(dim) {
4280     var extent = defaultExtent,
4281         filter = defaultFilter$1,
4282         listeners = dispatch(brush, "start", "brush", "end"),
4283         handleSize = 6,
4284         touchending;
4285
4286     function brush(group) {
4287       var overlay = group
4288           .property("__brush", initialize)
4289         .selectAll(".overlay")
4290         .data([type("overlay")]);
4291
4292       overlay.enter().append("rect")
4293           .attr("class", "overlay")
4294           .attr("pointer-events", "all")
4295           .attr("cursor", cursors.overlay)
4296         .merge(overlay)
4297           .each(function() {
4298             var extent = local$1(this).extent;
4299             select(this)
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]);
4304           });
4305
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");
4315
4316       var handle = group.selectAll(".handle")
4317         .data(dim.handles, function(d) { return d.type; });
4318
4319       handle.exit().remove();
4320
4321       handle.enter().append("rect")
4322           .attr("class", function(d) { return "handle handle--" + d.type; })
4323           .attr("cursor", function(d) { return cursors[d.type]; });
4324
4325       group
4326           .each(redraw)
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);
4331     }
4332
4333     brush.move = function(group, selection) {
4334       if (group.selection) {
4335         group
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() {
4339               var that = this,
4340                   state = that.__brush,
4341                   emit = emitter(that, arguments),
4342                   selection0 = state.selection,
4343                   selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent),
4344                   i = interpolate(selection0, selection1);
4345
4346               function tween(t) {
4347                 state.selection = t === 1 && empty$1(selection1) ? null : i(t);
4348                 redraw.call(that);
4349                 emit.brush();
4350               }
4351
4352               return selection0 && selection1 ? tween : tween(1);
4353             });
4354       } else {
4355         group
4356             .each(function() {
4357               var that = this,
4358                   args = arguments,
4359                   state = that.__brush,
4360                   selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent),
4361                   emit = emitter(that, args).beforestart();
4362
4363               interrupt(that);
4364               state.selection = selection1 == null || empty$1(selection1) ? null : selection1;
4365               redraw.call(that);
4366               emit.start().brush().end();
4367             });
4368       }
4369     };
4370
4371     function redraw() {
4372       var group = select(this),
4373           selection = local$1(this).selection;
4374
4375       if (selection) {
4376         group.selectAll(".selection")
4377             .style("display", null)
4378             .attr("x", selection[0][0])
4379             .attr("y", selection[0][1])
4380             .attr("width", selection[1][0] - selection[0][0])
4381             .attr("height", selection[1][1] - selection[0][1]);
4382
4383         group.selectAll(".handle")
4384             .style("display", null)
4385             .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })
4386             .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })
4387             .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })
4388             .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });
4389       }
4390
4391       else {
4392         group.selectAll(".selection,.handle")
4393             .style("display", "none")
4394             .attr("x", null)
4395             .attr("y", null)
4396             .attr("width", null)
4397             .attr("height", null);
4398       }
4399     }
4400
4401     function emitter(that, args) {
4402       return that.__brush.emitter || new Emitter(that, args);
4403     }
4404
4405     function Emitter(that, args) {
4406       this.that = that;
4407       this.args = args;
4408       this.state = that.__brush;
4409       this.active = 0;
4410     }
4411
4412     Emitter.prototype = {
4413       beforestart: function() {
4414         if (++this.active === 1) this.state.emitter = this, this.starting = true;
4415         return this;
4416       },
4417       start: function() {
4418         if (this.starting) this.starting = false, this.emit("start");
4419         return this;
4420       },
4421       brush: function() {
4422         this.emit("brush");
4423         return this;
4424       },
4425       end: function() {
4426         if (--this.active === 0) delete this.state.emitter, this.emit("end");
4427         return this;
4428       },
4429       emit: function(type) {
4430         customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);
4431       }
4432     };
4433
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;
4438
4439       var that = this,
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 = 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,
4451           dx,
4452           dy,
4453           moving,
4454           shifting = signX && signY && event.shiftKey,
4455           lockX,
4456           lockY,
4457           point0 = mouse(that),
4458           point = point0,
4459           emit = emitter(that, arguments).beforestart();
4460
4461       if (type === "overlay") {
4462         state.selection = selection = [
4463           [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],
4464           [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]
4465         ];
4466       } else {
4467         w0 = selection[0][0];
4468         n0 = selection[0][1];
4469         e0 = selection[1][0];
4470         s0 = selection[1][1];
4471       }
4472
4473       w1 = w0;
4474       n1 = n0;
4475       e1 = e0;
4476       s1 = s0;
4477
4478       var group = select(that)
4479           .attr("pointer-events", "none");
4480
4481       var overlay = group.selectAll(".overlay")
4482           .attr("cursor", cursors[type]);
4483
4484       if (event.touches) {
4485         group
4486             .on("touchmove.brush", moved, true)
4487             .on("touchend.brush touchcancel.brush", ended, true);
4488       } else {
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);
4494
4495         dragDisable(event.view);
4496       }
4497
4498       nopropagation$1();
4499       interrupt(that);
4500       redraw.call(that);
4501       emit.start();
4502
4503       function moved() {
4504         var point1 = mouse(that);
4505         if (shifting && !lockX && !lockY) {
4506           if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;
4507           else lockX = true;
4508         }
4509         point = point1;
4510         moving = true;
4511         noevent$1();
4512         move();
4513       }
4514
4515       function move() {
4516         var t;
4517
4518         dx = point[0] - point0[0];
4519         dy = point[1] - point0[1];
4520
4521         switch (mode) {
4522           case MODE_SPACE:
4523           case MODE_DRAG: {
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;
4526             break;
4527           }
4528           case MODE_HANDLE: {
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;
4533             break;
4534           }
4535           case MODE_CENTER: {
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));
4538             break;
4539           }
4540         }
4541
4542         if (e1 < w1) {
4543           signX *= -1;
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]]);
4547         }
4548
4549         if (s1 < n1) {
4550           signY *= -1;
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]]);
4554         }
4555
4556         if (state.selection) selection = state.selection; // May be set by brush.move!
4557         if (lockX) w1 = selection[0][0], e1 = selection[1][0];
4558         if (lockY) n1 = selection[0][1], s1 = selection[1][1];
4559
4560         if (selection[0][0] !== w1
4561             || selection[0][1] !== n1
4562             || selection[1][0] !== e1
4563             || selection[1][1] !== s1) {
4564           state.selection = [[w1, n1], [e1, s1]];
4565           redraw.call(that);
4566           emit.brush();
4567         }
4568       }
4569
4570       function ended() {
4571         nopropagation$1();
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);
4577         } else {
4578           yesdrag(event.view, moving);
4579           view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
4580         }
4581         group.attr("pointer-events", "all");
4582         overlay.attr("cursor", cursors.overlay);
4583         if (state.selection) selection = state.selection; // May be set by brush.move (on start)!
4584         if (empty$1(selection)) state.selection = null, redraw.call(that);
4585         emit.end();
4586       }
4587
4588       function keydowned() {
4589         switch (event.keyCode) {
4590           case 16: { // SHIFT
4591             shifting = signX && signY;
4592             break;
4593           }
4594           case 18: { // ALT
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;
4598               mode = MODE_CENTER;
4599               move();
4600             }
4601             break;
4602           }
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;
4607               mode = MODE_SPACE;
4608               overlay.attr("cursor", cursors.selection);
4609               move();
4610             }
4611             break;
4612           }
4613           default: return;
4614         }
4615         noevent$1();
4616       }
4617
4618       function keyupped() {
4619         switch (event.keyCode) {
4620           case 16: { // SHIFT
4621             if (shifting) {
4622               lockX = lockY = shifting = false;
4623               move();
4624             }
4625             break;
4626           }
4627           case 18: { // ALT
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;
4631               mode = MODE_HANDLE;
4632               move();
4633             }
4634             break;
4635           }
4636           case 32: { // SPACE
4637             if (mode === MODE_SPACE) {
4638               if (event.altKey) {
4639                 if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
4640                 if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
4641                 mode = MODE_CENTER;
4642               } else {
4643                 if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
4644                 if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
4645                 mode = MODE_HANDLE;
4646               }
4647               overlay.attr("cursor", cursors[type]);
4648               move();
4649             }
4650             break;
4651           }
4652           default: return;
4653         }
4654         noevent$1();
4655       }
4656     }
4657
4658     function initialize() {
4659       var state = this.__brush || {selection: null};
4660       state.extent = extent.apply(this, arguments);
4661       state.dim = dim;
4662       return state;
4663     }
4664
4665     brush.extent = function(_) {
4666       return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;
4667     };
4668
4669     brush.filter = function(_) {
4670       return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter;
4671     };
4672
4673     brush.handleSize = function(_) {
4674       return arguments.length ? (handleSize = +_, brush) : handleSize;
4675     };
4676
4677     brush.on = function() {
4678       var value = listeners.on.apply(listeners, arguments);
4679       return value === listeners ? brush : value;
4680     };
4681
4682     return brush;
4683   }
4684
4685   var cos = Math.cos;
4686   var sin = Math.sin;
4687   var pi$1 = Math.PI;
4688   var halfPi$1 = pi$1 / 2;
4689   var tau$1 = pi$1 * 2;
4690   var max$1 = Math.max;
4691
4692   function compareValue(compare) {
4693     return function(a, b) {
4694       return compare(
4695         a.source.value + a.target.value,
4696         b.source.value + b.target.value
4697       );
4698     };
4699   }
4700
4701   function chord() {
4702     var padAngle = 0,
4703         sortGroups = null,
4704         sortSubgroups = null,
4705         sortChords = null;
4706
4707     function chord(matrix) {
4708       var n = matrix.length,
4709           groupSums = [],
4710           groupIndex = range(n),
4711           subgroupIndex = [],
4712           chords = [],
4713           groups = chords.groups = new Array(n),
4714           subgroups = new Array(n * n),
4715           k,
4716           x,
4717           x0,
4718           dx,
4719           i,
4720           j;
4721
4722       // Compute the sum.
4723       k = 0, i = -1; while (++i < n) {
4724         x = 0, j = -1; while (++j < n) {
4725           x += matrix[i][j];
4726         }
4727         groupSums.push(x);
4728         subgroupIndex.push(range(n));
4729         k += x;
4730       }
4731
4732       // Sort groups…
4733       if (sortGroups) groupIndex.sort(function(a, b) {
4734         return sortGroups(groupSums[a], groupSums[b]);
4735       });
4736
4737       // Sort subgroups…
4738       if (sortSubgroups) subgroupIndex.forEach(function(d, i) {
4739         d.sort(function(a, b) {
4740           return sortSubgroups(matrix[i][a], matrix[i][b]);
4741         });
4742       });
4743
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;
4749
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],
4756               v = matrix[di][dj],
4757               a0 = x,
4758               a1 = x += v * k;
4759           subgroups[dj * n + di] = {
4760             index: di,
4761             subindex: dj,
4762             startAngle: a0,
4763             endAngle: a1,
4764             value: v
4765           };
4766         }
4767         groups[di] = {
4768           index: di,
4769           startAngle: x0,
4770           endAngle: x,
4771           value: groupSums[di]
4772         };
4773         x += dx;
4774       }
4775
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});
4785           }
4786         }
4787       }
4788
4789       return sortChords ? chords.sort(sortChords) : chords;
4790     }
4791
4792     chord.padAngle = function(_) {
4793       return arguments.length ? (padAngle = max$1(0, _), chord) : padAngle;
4794     };
4795
4796     chord.sortGroups = function(_) {
4797       return arguments.length ? (sortGroups = _, chord) : sortGroups;
4798     };
4799
4800     chord.sortSubgroups = function(_) {
4801       return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;
4802     };
4803
4804     chord.sortChords = function(_) {
4805       return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;
4806     };
4807
4808     return chord;
4809   }
4810
4811   var slice$2 = Array.prototype.slice;
4812
4813   function constant$5(x) {
4814     return function() {
4815       return x;
4816     };
4817   }
4818
4819   var pi$2 = Math.PI,
4820       tau$2 = 2 * pi$2,
4821       epsilon$1 = 1e-6,
4822       tauEpsilon = tau$2 - epsilon$1;
4823
4824   function Path() {
4825     this._x0 = this._y0 = // start of current subpath
4826     this._x1 = this._y1 = null; // end of current subpath
4827     this._ = "";
4828   }
4829
4830   function path() {
4831     return new Path;
4832   }
4833
4834   Path.prototype = path.prototype = {
4835     constructor: Path,
4836     moveTo: function(x, y) {
4837       this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
4838     },
4839     closePath: function() {
4840       if (this._x1 !== null) {
4841         this._x1 = this._x0, this._y1 = this._y0;
4842         this._ += "Z";
4843       }
4844     },
4845     lineTo: function(x, y) {
4846       this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
4847     },
4848     quadraticCurveTo: function(x1, y1, x, y) {
4849       this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4850     },
4851     bezierCurveTo: function(x1, y1, x2, y2, x, y) {
4852       this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4853     },
4854     arcTo: function(x1, y1, x2, y2, r) {
4855       x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
4856       var x0 = this._x1,
4857           y0 = this._y1,
4858           x21 = x2 - x1,
4859           y21 = y2 - y1,
4860           x01 = x0 - x1,
4861           y01 = y0 - y1,
4862           l01_2 = x01 * x01 + y01 * y01;
4863
4864       // Is the radius negative? Error.
4865       if (r < 0) throw new Error("negative radius: " + r);
4866
4867       // Is this path empty? Move to (x1,y1).
4868       if (this._x1 === null) {
4869         this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
4870       }
4871
4872       // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
4873       else if (!(l01_2 > epsilon$1)) ;
4874
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);
4880       }
4881
4882       // Otherwise, draw an arc!
4883       else {
4884         var x20 = x2 - x0,
4885             y20 = y2 - y0,
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),
4891             t01 = l / l01,
4892             t21 = l / l21;
4893
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);
4897         }
4898
4899         this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
4900       }
4901     },
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),
4906           x0 = x + dx,
4907           y0 = y + dy,
4908           cw = 1 ^ ccw,
4909           da = ccw ? a0 - a1 : a1 - a0;
4910
4911       // Is the radius negative? Error.
4912       if (r < 0) throw new Error("negative radius: " + r);
4913
4914       // Is this path empty? Move to (x0,y0).
4915       if (this._x1 === null) {
4916         this._ += "M" + x0 + "," + y0;
4917       }
4918
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;
4922       }
4923
4924       // Is this arc empty? We’re done.
4925       if (!r) return;
4926
4927       // Does the angle go the wrong way? Flip the direction.
4928       if (da < 0) da = da % tau$2 + tau$2;
4929
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);
4933       }
4934
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));
4938       }
4939     },
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";
4942     },
4943     toString: function() {
4944       return this._;
4945     }
4946   };
4947
4948   function defaultSource(d) {
4949     return d.source;
4950   }
4951
4952   function defaultTarget(d) {
4953     return d.target;
4954   }
4955
4956   function defaultRadius(d) {
4957     return d.radius;
4958   }
4959
4960   function defaultStartAngle(d) {
4961     return d.startAngle;
4962   }
4963
4964   function defaultEndAngle(d) {
4965     return d.endAngle;
4966   }
4967
4968   function ribbon() {
4969     var source = defaultSource,
4970         target = defaultTarget,
4971         radius = defaultRadius,
4972         startAngle = defaultStartAngle,
4973         endAngle = defaultEndAngle,
4974         context = null;
4975
4976     function ribbon() {
4977       var buffer,
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;
4989
4990       if (!context) context = buffer = path();
4991
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);
4997       }
4998       context.quadraticCurveTo(0, 0, sx0, sy0);
4999       context.closePath();
5000
5001       if (buffer) return context = null, buffer + "" || null;
5002     }
5003
5004     ribbon.radius = function(_) {
5005       return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius;
5006     };
5007
5008     ribbon.startAngle = function(_) {
5009       return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle;
5010     };
5011
5012     ribbon.endAngle = function(_) {
5013       return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle;
5014     };
5015
5016     ribbon.source = function(_) {
5017       return arguments.length ? (source = _, ribbon) : source;
5018     };
5019
5020     ribbon.target = function(_) {
5021       return arguments.length ? (target = _, ribbon) : target;
5022     };
5023
5024     ribbon.context = function(_) {
5025       return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;
5026     };
5027
5028     return ribbon;
5029   }
5030
5031   var prefix = "$";
5032
5033   function Map() {}
5034
5035   Map.prototype = map$1.prototype = {
5036     constructor: Map,
5037     has: function(key) {
5038       return (prefix + key) in this;
5039     },
5040     get: function(key) {
5041       return this[prefix + key];
5042     },
5043     set: function(key, value) {
5044       this[prefix + key] = value;
5045       return this;
5046     },
5047     remove: function(key) {
5048       var property = prefix + key;
5049       return property in this && delete this[property];
5050     },
5051     clear: function() {
5052       for (var property in this) if (property[0] === prefix) delete this[property];
5053     },
5054     keys: function() {
5055       var keys = [];
5056       for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
5057       return keys;
5058     },
5059     values: function() {
5060       var values = [];
5061       for (var property in this) if (property[0] === prefix) values.push(this[property]);
5062       return values;
5063     },
5064     entries: function() {
5065       var entries = [];
5066       for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
5067       return entries;
5068     },
5069     size: function() {
5070       var size = 0;
5071       for (var property in this) if (property[0] === prefix) ++size;
5072       return size;
5073     },
5074     empty: function() {
5075       for (var property in this) if (property[0] === prefix) return false;
5076       return true;
5077     },
5078     each: function(f) {
5079       for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
5080     }
5081   };
5082
5083   function map$1(object, f) {
5084     var map = new Map;
5085
5086     // Copy constructor.
5087     if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });
5088
5089     // Index array by numeric index or specified key function.
5090     else if (Array.isArray(object)) {
5091       var i = -1,
5092           n = object.length,
5093           o;
5094
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);
5097     }
5098
5099     // Convert object to map.
5100     else if (object) for (var key in object) map.set(key, object[key]);
5101
5102     return map;
5103   }
5104
5105   function nest() {
5106     var keys = [],
5107         sortKeys = [],
5108         sortValues,
5109         rollup,
5110         nest;
5111
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;
5116       }
5117
5118       var i = -1,
5119           n = array.length,
5120           key = keys[depth++],
5121           keyValue,
5122           value,
5123           valuesByKey = map$1(),
5124           values,
5125           result = createResult();
5126
5127       while (++i < n) {
5128         if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
5129           values.push(value);
5130         } else {
5131           valuesByKey.set(keyValue, [value]);
5132         }
5133       }
5134
5135       valuesByKey.each(function(values, key) {
5136         setResult(result, key, apply(values, depth, createResult, setResult));
5137       });
5138
5139       return result;
5140     }
5141
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;
5148     }
5149
5150     return nest = {
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; }
5158     };
5159   }
5160
5161   function createObject() {
5162     return {};
5163   }
5164
5165   function setObject(object, key, value) {
5166     object[key] = value;
5167   }
5168
5169   function createMap() {
5170     return map$1();
5171   }
5172
5173   function setMap(map, key, value) {
5174     map.set(key, value);
5175   }
5176
5177   function Set() {}
5178
5179   var proto = map$1.prototype;
5180
5181   Set.prototype = set$2.prototype = {
5182     constructor: Set,
5183     has: proto.has,
5184     add: function(value) {
5185       value += "";
5186       this[prefix + value] = value;
5187       return this;
5188     },
5189     remove: proto.remove,
5190     clear: proto.clear,
5191     values: proto.keys,
5192     size: proto.size,
5193     empty: proto.empty,
5194     each: proto.each
5195   };
5196
5197   function set$2(object, f) {
5198     var set = new Set;
5199
5200     // Copy constructor.
5201     if (object instanceof Set) object.each(function(value) { set.add(value); });
5202
5203     // Otherwise, assume it’s an array.
5204     else if (object) {
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));
5208     }
5209
5210     return set;
5211   }
5212
5213   function keys(map) {
5214     var keys = [];
5215     for (var key in map) keys.push(key);
5216     return keys;
5217   }
5218
5219   function values(map) {
5220     var values = [];
5221     for (var key in map) values.push(map[key]);
5222     return values;
5223   }
5224
5225   function entries(map) {
5226     var entries = [];
5227     for (var key in map) entries.push({key: key, value: map[key]});
5228     return entries;
5229   }
5230
5231   var EOL = {},
5232       EOF = {},
5233       QUOTE = 34,
5234       NEWLINE = 10,
5235       RETURN = 13;
5236
5237   function objectConverter(columns) {
5238     return new Function("d", "return {" + columns.map(function(name, i) {
5239       return JSON.stringify(name) + ": d[" + i + "]";
5240     }).join(",") + "}");
5241   }
5242
5243   function customConverter(columns, f) {
5244     var object = objectConverter(columns);
5245     return function(row, i) {
5246       return f(object(row), i, columns);
5247     };
5248   }
5249
5250   // Compute unique columns in order of discovery.
5251   function inferColumns(rows) {
5252     var columnSet = Object.create(null),
5253         columns = [];
5254
5255     rows.forEach(function(row) {
5256       for (var column in row) {
5257         if (!(column in columnSet)) {
5258           columns.push(columnSet[column] = column);
5259         }
5260       }
5261     });
5262
5263     return columns;
5264   }
5265
5266   function dsv(delimiter) {
5267     var reFormat = new RegExp("[\"" + delimiter + "\n\r]"),
5268         DELIMITER = delimiter.charCodeAt(0);
5269
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);
5274       });
5275       rows.columns = columns || [];
5276       return rows;
5277     }
5278
5279     function parseRows(text, f) {
5280       var rows = [], // output rows
5281           N = text.length,
5282           I = 0, // current character index
5283           n = 0, // current line number
5284           t, // current token
5285           eof = N <= 0, // current token followed by EOF?
5286           eol = false; // current token followed by EOL?
5287
5288       // Strip the trailing newline.
5289       if (text.charCodeAt(N - 1) === NEWLINE) --N;
5290       if (text.charCodeAt(N - 1) === RETURN) --N;
5291
5292       function token() {
5293         if (eof) return EOF;
5294         if (eol) return eol = false, EOL;
5295
5296         // Unescape quotes.
5297         var i, j = I, c;
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, "\"");
5304         }
5305
5306         // Find next delimiter or newline.
5307         while (I < N) {
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);
5312         }
5313
5314         // Return last token before EOF.
5315         return eof = true, text.slice(j, N);
5316       }
5317
5318       while ((t = token()) !== EOF) {
5319         var row = [];
5320         while (t !== EOL && t !== EOF) row.push(t), t = token();
5321         if (f && (row = f(row, n++)) == null) continue;
5322         rows.push(row);
5323       }
5324
5325       return rows;
5326     }
5327
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]);
5333         }).join(delimiter);
5334       })).join("\n");
5335     }
5336
5337     function formatRows(rows) {
5338       return rows.map(formatRow).join("\n");
5339     }
5340
5341     function formatRow(row) {
5342       return row.map(formatValue).join(delimiter);
5343     }
5344
5345     function formatValue(text) {
5346       return text == null ? ""
5347           : reFormat.test(text += "") ? "\"" + text.replace(/"/g, "\"\"") + "\""
5348           : text;
5349     }
5350
5351     return {
5352       parse: parse,
5353       parseRows: parseRows,
5354       format: format,
5355       formatRows: formatRows
5356     };
5357   }
5358
5359   var csv = dsv(",");
5360
5361   var csvParse = csv.parse;
5362   var csvParseRows = csv.parseRows;
5363   var csvFormat = csv.format;
5364   var csvFormatRows = csv.formatRows;
5365
5366   var tsv = dsv("\t");
5367
5368   var tsvParse = tsv.parse;
5369   var tsvParseRows = tsv.parseRows;
5370   var tsvFormat = tsv.format;
5371   var tsvFormatRows = tsv.formatRows;
5372
5373   function center$1(x, y) {
5374     var nodes;
5375
5376     if (x == null) x = 0;
5377     if (y == null) y = 0;
5378
5379     function force() {
5380       var i,
5381           n = nodes.length,
5382           node,
5383           sx = 0,
5384           sy = 0;
5385
5386       for (i = 0; i < n; ++i) {
5387         node = nodes[i], sx += node.x, sy += node.y;
5388       }
5389
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;
5392       }
5393     }
5394
5395     force.initialize = function(_) {
5396       nodes = _;
5397     };
5398
5399     force.x = function(_) {
5400       return arguments.length ? (x = +_, force) : x;
5401     };
5402
5403     force.y = function(_) {
5404       return arguments.length ? (y = +_, force) : y;
5405     };
5406
5407     return force;
5408   }
5409
5410   function constant$6(x) {
5411     return function() {
5412       return x;
5413     };
5414   }
5415
5416   function jiggle() {
5417     return (Math.random() - 0.5) * 1e-6;
5418   }
5419
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);
5424   }
5425
5426   function add(tree, x, y, d) {
5427     if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
5428
5429     var parent,
5430         node = tree._root,
5431         leaf = {data: d},
5432         x0 = tree._x0,
5433         y0 = tree._y0,
5434         x1 = tree._x1,
5435         y1 = tree._y1,
5436         xm,
5437         ym,
5438         xp,
5439         yp,
5440         right,
5441         bottom,
5442         i,
5443         j;
5444
5445     // If the tree is empty, initialize the root as a leaf.
5446     if (!node) return tree._root = leaf, tree;
5447
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;
5453     }
5454
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;
5459
5460     // Otherwise, split the leaf node until the old and new point are separated.
5461     do {
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;
5467   }
5468
5469   function addAll(data) {
5470     var d, i, n = data.length,
5471         x,
5472         y,
5473         xz = new Array(n),
5474         yz = new Array(n),
5475         x0 = Infinity,
5476         y0 = Infinity,
5477         x1 = -Infinity,
5478         y1 = -Infinity;
5479
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;
5483       xz[i] = x;
5484       yz[i] = y;
5485       if (x < x0) x0 = x;
5486       if (x > x1) x1 = x;
5487       if (y < y0) y0 = y;
5488       if (y > y1) y1 = y;
5489     }
5490
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;
5494
5495     // Expand the tree to cover the new points.
5496     this.cover(x0, y0).cover(x1, y1);
5497
5498     // Add the new points.
5499     for (i = 0; i < n; ++i) {
5500       add(this, xz[i], yz[i], data[i]);
5501     }
5502
5503     return this;
5504   }
5505
5506   function tree_cover(x, y) {
5507     if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
5508
5509     var x0 = this._x0,
5510         y0 = this._y0,
5511         x1 = this._x1,
5512         y1 = this._y1;
5513
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!
5517     if (isNaN(x0)) {
5518       x1 = (x0 = Math.floor(x)) + 1;
5519       y1 = (y0 = Math.floor(y)) + 1;
5520     }
5521
5522     // Otherwise, double repeatedly to cover.
5523     else if (x0 > x || x > x1 || y0 > y || y > y1) {
5524       var z = x1 - x0,
5525           node = this._root,
5526           parent,
5527           i;
5528
5529       switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) {
5530         case 0: {
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);
5533           break;
5534         }
5535         case 1: {
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);
5538           break;
5539         }
5540         case 2: {
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);
5543           break;
5544         }
5545         case 3: {
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);
5548           break;
5549         }
5550       }
5551
5552       if (this._root && this._root.length) this._root = node;
5553     }
5554
5555     // If the quadtree covers the point already, just return.
5556     else return this;
5557
5558     this._x0 = x0;
5559     this._y0 = y0;
5560     this._x1 = x1;
5561     this._y1 = y1;
5562     return this;
5563   }
5564
5565   function tree_data() {
5566     var data = [];
5567     this.visit(function(node) {
5568       if (!node.length) do data.push(node.data); while (node = node.next)
5569     });
5570     return data;
5571   }
5572
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]];
5577   }
5578
5579   function Quad(node, x0, y0, x1, y1) {
5580     this.node = node;
5581     this.x0 = x0;
5582     this.y0 = y0;
5583     this.x1 = x1;
5584     this.y1 = y1;
5585   }
5586
5587   function tree_find(x, y, radius) {
5588     var data,
5589         x0 = this._x0,
5590         y0 = this._y0,
5591         x1,
5592         y1,
5593         x2,
5594         y2,
5595         x3 = this._x1,
5596         y3 = this._y1,
5597         quads = [],
5598         node = this._root,
5599         q,
5600         i;
5601
5602     if (node) quads.push(new Quad(node, x0, y0, x3, y3));
5603     if (radius == null) radius = Infinity;
5604     else {
5605       x0 = x - radius, y0 = y - radius;
5606       x3 = x + radius, y3 = y + radius;
5607       radius *= radius;
5608     }
5609
5610     while (q = quads.pop()) {
5611
5612       // Stop searching if this quadrant can’t contain a closer node.
5613       if (!(node = q.node)
5614           || (x1 = q.x0) > x3
5615           || (y1 = q.y0) > y3
5616           || (x2 = q.x1) < x0
5617           || (y2 = q.y1) < y0) continue;
5618
5619       // Bisect the current quadrant.
5620       if (node.length) {
5621         var xm = (x1 + x2) / 2,
5622             ym = (y1 + y2) / 2;
5623
5624         quads.push(
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)
5629         );
5630
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;
5636         }
5637       }
5638
5639       // Visit this point. (Visiting coincident points isn’t necessary!)
5640       else {
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;
5644         if (d2 < radius) {
5645           var d = Math.sqrt(radius = d2);
5646           x0 = x - d, y0 = y - d;
5647           x3 = x + d, y3 = y + d;
5648           data = node.data;
5649         }
5650       }
5651     }
5652
5653     return data;
5654   }
5655
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
5658
5659     var parent,
5660         node = this._root,
5661         retainer,
5662         previous,
5663         next,
5664         x0 = this._x0,
5665         y0 = this._y0,
5666         x1 = this._x1,
5667         y1 = this._y1,
5668         x,
5669         y,
5670         xm,
5671         ym,
5672         right,
5673         bottom,
5674         i,
5675         j;
5676
5677     // If the tree is empty, initialize the root as a leaf.
5678     if (!node) return this;
5679
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;
5688     }
5689
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;
5693
5694     // If there are multiple coincident points, remove just the point.
5695     if (previous) return (next ? previous.next = next : delete previous.next), this;
5696
5697     // If this is the root point, remove it.
5698     if (!parent) return this._root = next, this;
5699
5700     // Remove this leaf.
5701     next ? parent[i] = next : delete parent[i];
5702
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])
5706         && !node.length) {
5707       if (retainer) retainer[j] = node;
5708       else this._root = node;
5709     }
5710
5711     return this;
5712   }
5713
5714   function removeAll(data) {
5715     for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
5716     return this;
5717   }
5718
5719   function tree_root() {
5720     return this._root;
5721   }
5722
5723   function tree_size() {
5724     var size = 0;
5725     this.visit(function(node) {
5726       if (!node.length) do ++size; while (node = node.next)
5727     });
5728     return size;
5729   }
5730
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));
5741       }
5742     }
5743     return this;
5744   }
5745
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()) {
5750       var node = q.node;
5751       if (node.length) {
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));
5757       }
5758       next.push(q);
5759     }
5760     while (q = next.pop()) {
5761       callback(q.node, q.x0, q.y0, q.x1, q.y1);
5762     }
5763     return this;
5764   }
5765
5766   function defaultX(d) {
5767     return d[0];
5768   }
5769
5770   function tree_x(_) {
5771     return arguments.length ? (this._x = _, this) : this._x;
5772   }
5773
5774   function defaultY(d) {
5775     return d[1];
5776   }
5777
5778   function tree_y(_) {
5779     return arguments.length ? (this._y = _, this) : this._y;
5780   }
5781
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);
5785   }
5786
5787   function Quadtree(x, y, x0, y0, x1, y1) {
5788     this._x = x;
5789     this._y = y;
5790     this._x0 = x0;
5791     this._y0 = y0;
5792     this._x1 = x1;
5793     this._y1 = y1;
5794     this._root = undefined;
5795   }
5796
5797   function leaf_copy(leaf) {
5798     var copy = {data: leaf.data}, next = copy;
5799     while (leaf = leaf.next) next = next.next = {data: leaf.data};
5800     return copy;
5801   }
5802
5803   var treeProto = quadtree.prototype = Quadtree.prototype;
5804
5805   treeProto.copy = function() {
5806     var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
5807         node = this._root,
5808         nodes,
5809         child;
5810
5811     if (!node) return copy;
5812
5813     if (!node.length) return copy._root = leaf_copy(node), copy;
5814
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);
5821         }
5822       }
5823     }
5824
5825     return copy;
5826   };
5827
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;
5842
5843   function x(d) {
5844     return d.x + d.vx;
5845   }
5846
5847   function y(d) {
5848     return d.y + d.vy;
5849   }
5850
5851   function collide(radius) {
5852     var nodes,
5853         radii,
5854         strength = 1,
5855         iterations = 1;
5856
5857     if (typeof radius !== "function") radius = constant$6(radius == null ? 1 : +radius);
5858
5859     function force() {
5860       var i, n = nodes.length,
5861           tree,
5862           node,
5863           xi,
5864           yi,
5865           ri,
5866           ri2;
5867
5868       for (var k = 0; k < iterations; ++k) {
5869         tree = quadtree(nodes, x, y).visitAfter(prepare);
5870         for (i = 0; i < n; ++i) {
5871           node = nodes[i];
5872           ri = radii[node.index], ri2 = ri * ri;
5873           xi = node.x + node.vx;
5874           yi = node.y + node.vy;
5875           tree.visit(apply);
5876         }
5877       }
5878
5879       function apply(quad, x0, y0, x1, y1) {
5880         var data = quad.data, rj = quad.r, r = ri + rj;
5881         if (data) {
5882           if (data.index > node.index) {
5883             var x = xi - data.x - data.vx,
5884                 y = yi - data.y - data.vy,
5885                 l = x * x + y * y;
5886             if (l < r * r) {
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);
5893               data.vy -= y * r;
5894             }
5895           }
5896           return;
5897         }
5898         return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
5899       }
5900     }
5901
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) {
5906           quad.r = quad[i].r;
5907         }
5908       }
5909     }
5910
5911     function initialize() {
5912       if (!nodes) return;
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);
5916     }
5917
5918     force.initialize = function(_) {
5919       nodes = _;
5920       initialize();
5921     };
5922
5923     force.iterations = function(_) {
5924       return arguments.length ? (iterations = +_, force) : iterations;
5925     };
5926
5927     force.strength = function(_) {
5928       return arguments.length ? (strength = +_, force) : strength;
5929     };
5930
5931     force.radius = function(_) {
5932       return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
5933     };
5934
5935     return force;
5936   }
5937
5938   function index(d) {
5939     return d.index;
5940   }
5941
5942   function find(nodeById, nodeId) {
5943     var node = nodeById.get(nodeId);
5944     if (!node) throw new Error("missing: " + nodeId);
5945     return node;
5946   }
5947
5948   function link(links) {
5949     var id = index,
5950         strength = defaultStrength,
5951         strengths,
5952         distance = constant$6(30),
5953         distances,
5954         nodes,
5955         count,
5956         bias,
5957         iterations = 1;
5958
5959     if (links == null) links = [];
5960
5961     function defaultStrength(link) {
5962       return 1 / Math.min(count[link.source.index], count[link.target.index]);
5963     }
5964
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];
5973           x *= l, y *= l;
5974           target.vx -= x * (b = bias[i]);
5975           target.vy -= y * b;
5976           source.vx += x * (b = 1 - b);
5977           source.vy += y * b;
5978         }
5979       }
5980     }
5981
5982     function initialize() {
5983       if (!nodes) return;
5984
5985       var i,
5986           n = nodes.length,
5987           m = links.length,
5988           nodeById = map$1(nodes, id),
5989           link;
5990
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;
5997       }
5998
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]);
6001       }
6002
6003       strengths = new Array(m), initializeStrength();
6004       distances = new Array(m), initializeDistance();
6005     }
6006
6007     function initializeStrength() {
6008       if (!nodes) return;
6009
6010       for (var i = 0, n = links.length; i < n; ++i) {
6011         strengths[i] = +strength(links[i], i, links);
6012       }
6013     }
6014
6015     function initializeDistance() {
6016       if (!nodes) return;
6017
6018       for (var i = 0, n = links.length; i < n; ++i) {
6019         distances[i] = +distance(links[i], i, links);
6020       }
6021     }
6022
6023     force.initialize = function(_) {
6024       nodes = _;
6025       initialize();
6026     };
6027
6028     force.links = function(_) {
6029       return arguments.length ? (links = _, initialize(), force) : links;
6030     };
6031
6032     force.id = function(_) {
6033       return arguments.length ? (id = _, force) : id;
6034     };
6035
6036     force.iterations = function(_) {
6037       return arguments.length ? (iterations = +_, force) : iterations;
6038     };
6039
6040     force.strength = function(_) {
6041       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initializeStrength(), force) : strength;
6042     };
6043
6044     force.distance = function(_) {
6045       return arguments.length ? (distance = typeof _ === "function" ? _ : constant$6(+_), initializeDistance(), force) : distance;
6046     };
6047
6048     return force;
6049   }
6050
6051   function x$1(d) {
6052     return d.x;
6053   }
6054
6055   function y$1(d) {
6056     return d.y;
6057   }
6058
6059   var initialRadius = 10,
6060       initialAngle = Math.PI * (3 - Math.sqrt(5));
6061
6062   function simulation(nodes) {
6063     var simulation,
6064         alpha = 1,
6065         alphaMin = 0.001,
6066         alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
6067         alphaTarget = 0,
6068         velocityDecay = 0.6,
6069         forces = map$1(),
6070         stepper = timer(step),
6071         event = dispatch("tick", "end");
6072
6073     if (nodes == null) nodes = [];
6074
6075     function step() {
6076       tick();
6077       event.call("tick", simulation);
6078       if (alpha < alphaMin) {
6079         stepper.stop();
6080         event.call("end", simulation);
6081       }
6082     }
6083
6084     function tick() {
6085       var i, n = nodes.length, node;
6086
6087       alpha += (alphaTarget - alpha) * alphaDecay;
6088
6089       forces.each(function(force) {
6090         force(alpha);
6091       });
6092
6093       for (i = 0; i < n; ++i) {
6094         node = nodes[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;
6099       }
6100     }
6101
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);
6109         }
6110         if (isNaN(node.vx) || isNaN(node.vy)) {
6111           node.vx = node.vy = 0;
6112         }
6113       }
6114     }
6115
6116     function initializeForce(force) {
6117       if (force.initialize) force.initialize(nodes);
6118       return force;
6119     }
6120
6121     initializeNodes();
6122
6123     return simulation = {
6124       tick: tick,
6125
6126       restart: function() {
6127         return stepper.restart(step), simulation;
6128       },
6129
6130       stop: function() {
6131         return stepper.stop(), simulation;
6132       },
6133
6134       nodes: function(_) {
6135         return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
6136       },
6137
6138       alpha: function(_) {
6139         return arguments.length ? (alpha = +_, simulation) : alpha;
6140       },
6141
6142       alphaMin: function(_) {
6143         return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
6144       },
6145
6146       alphaDecay: function(_) {
6147         return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
6148       },
6149
6150       alphaTarget: function(_) {
6151         return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
6152       },
6153
6154       velocityDecay: function(_) {
6155         return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
6156       },
6157
6158       force: function(name, _) {
6159         return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
6160       },
6161
6162       find: function(x, y, radius) {
6163         var i = 0,
6164             n = nodes.length,
6165             dx,
6166             dy,
6167             d2,
6168             node,
6169             closest;
6170
6171         if (radius == null) radius = Infinity;
6172         else radius *= radius;
6173
6174         for (i = 0; i < n; ++i) {
6175           node = nodes[i];
6176           dx = x - node.x;
6177           dy = y - node.y;
6178           d2 = dx * dx + dy * dy;
6179           if (d2 < radius) closest = node, radius = d2;
6180         }
6181
6182         return closest;
6183       },
6184
6185       on: function(name, _) {
6186         return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
6187       }
6188     };
6189   }
6190
6191   function manyBody() {
6192     var nodes,
6193         node,
6194         alpha,
6195         strength = constant$6(-30),
6196         strengths,
6197         distanceMin2 = 1,
6198         distanceMax2 = Infinity,
6199         theta2 = 0.81;
6200
6201     function force(_) {
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);
6204     }
6205
6206     function initialize() {
6207       if (!nodes) return;
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);
6211     }
6212
6213     function accumulate(quad) {
6214       var strength = 0, q, c, weight = 0, x, y, i;
6215
6216       // For internal nodes, accumulate forces from child quadrants.
6217       if (quad.length) {
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;
6221           }
6222         }
6223         quad.x = x / weight;
6224         quad.y = y / weight;
6225       }
6226
6227       // For leaf nodes, accumulate forces from coincident quadrants.
6228       else {
6229         q = quad;
6230         q.x = q.data.x;
6231         q.y = q.data.y;
6232         do strength += strengths[q.data.index];
6233         while (q = q.next);
6234       }
6235
6236       quad.value = strength;
6237     }
6238
6239     function apply(quad, x1, _, x2) {
6240       if (!quad.value) return true;
6241
6242       var x = quad.x - node.x,
6243           y = quad.y - node.y,
6244           w = x2 - x1,
6245           l = x * x + y * y;
6246
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;
6256         }
6257         return true;
6258       }
6259
6260       // Otherwise, process points directly.
6261       else if (quad.length || l >= distanceMax2) return;
6262
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);
6268       }
6269
6270       do if (quad.data !== node) {
6271         w = strengths[quad.data.index] * alpha / l;
6272         node.vx += x * w;
6273         node.vy += y * w;
6274       } while (quad = quad.next);
6275     }
6276
6277     force.initialize = function(_) {
6278       nodes = _;
6279       initialize();
6280     };
6281
6282     force.strength = function(_) {
6283       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6284     };
6285
6286     force.distanceMin = function(_) {
6287       return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
6288     };
6289
6290     force.distanceMax = function(_) {
6291       return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
6292     };
6293
6294     force.theta = function(_) {
6295       return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
6296     };
6297
6298     return force;
6299   }
6300
6301   function radial(radius, x, y) {
6302     var nodes,
6303         strength = constant$6(0.1),
6304         strengths,
6305         radiuses;
6306
6307     if (typeof radius !== "function") radius = constant$6(+radius);
6308     if (x == null) x = 0;
6309     if (y == null) y = 0;
6310
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;
6318         node.vx += dx * k;
6319         node.vy += dy * k;
6320       }
6321     }
6322
6323     function initialize() {
6324       if (!nodes) return;
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);
6331       }
6332     }
6333
6334     force.initialize = function(_) {
6335       nodes = _, initialize();
6336     };
6337
6338     force.strength = function(_) {
6339       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6340     };
6341
6342     force.radius = function(_) {
6343       return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
6344     };
6345
6346     force.x = function(_) {
6347       return arguments.length ? (x = +_, force) : x;
6348     };
6349
6350     force.y = function(_) {
6351       return arguments.length ? (y = +_, force) : y;
6352     };
6353
6354     return force;
6355   }
6356
6357   function x$2(x) {
6358     var strength = constant$6(0.1),
6359         nodes,
6360         strengths,
6361         xz;
6362
6363     if (typeof x !== "function") x = constant$6(x == null ? 0 : +x);
6364
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;
6368       }
6369     }
6370
6371     function initialize() {
6372       if (!nodes) return;
6373       var i, n = nodes.length;
6374       strengths = new Array(n);
6375       xz = 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);
6378       }
6379     }
6380
6381     force.initialize = function(_) {
6382       nodes = _;
6383       initialize();
6384     };
6385
6386     force.strength = function(_) {
6387       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6388     };
6389
6390     force.x = function(_) {
6391       return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : x;
6392     };
6393
6394     return force;
6395   }
6396
6397   function y$2(y) {
6398     var strength = constant$6(0.1),
6399         nodes,
6400         strengths,
6401         yz;
6402
6403     if (typeof y !== "function") y = constant$6(y == null ? 0 : +y);
6404
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;
6408       }
6409     }
6410
6411     function initialize() {
6412       if (!nodes) return;
6413       var i, n = nodes.length;
6414       strengths = new Array(n);
6415       yz = 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);
6418       }
6419     }
6420
6421     force.initialize = function(_) {
6422       nodes = _;
6423       initialize();
6424     };
6425
6426     force.strength = function(_) {
6427       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6428     };
6429
6430     force.y = function(_) {
6431       return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : y;
6432     };
6433
6434     return force;
6435   }
6436
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);
6443
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).
6446     return [
6447       coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
6448       +x.slice(i + 1)
6449     ];
6450   }
6451
6452   function exponent$1(x) {
6453     return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;
6454   }
6455
6456   function formatGroup(grouping, thousands) {
6457     return function(value, width) {
6458       var i = value.length,
6459           t = [],
6460           j = 0,
6461           g = grouping[0],
6462           length = 0;
6463
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];
6469       }
6470
6471       return t.reverse().join(thousands);
6472     };
6473   }
6474
6475   function formatNumerals(numerals) {
6476     return function(value) {
6477       return value.replace(/[0-9]/g, function(i) {
6478         return numerals[+i];
6479       });
6480     };
6481   }
6482
6483   function formatDefault(x, p) {
6484     x = x.toPrecision(p);
6485
6486     out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) {
6487       switch (x[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;
6492       }
6493     }
6494
6495     return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x;
6496   }
6497
6498   var prefixExponent;
6499
6500   function formatPrefixAuto(x, p) {
6501     var d = formatDecimal(x, p);
6502     if (!d) return x + "";
6503     var coefficient = d[0],
6504         exponent = d[1],
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!
6511   }
6512
6513   function formatRounded(x, p) {
6514     var d = formatDecimal(x, p);
6515     if (!d) return x + "";
6516     var coefficient = d[0],
6517         exponent = d[1];
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");
6521   }
6522
6523   var formatTypes = {
6524     "": formatDefault,
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); },
6534     "r": formatRounded,
6535     "s": formatPrefixAuto,
6536     "X": function(x) { return Math.round(x).toString(16).toUpperCase(); },
6537     "x": function(x) { return Math.round(x).toString(16); }
6538   };
6539
6540   // [[fill]align][sign][symbol][0][width][,][.precision][type]
6541   var re = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;
6542
6543   function formatSpecifier(specifier) {
6544     return new FormatSpecifier(specifier);
6545   }
6546
6547   formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof
6548
6549   function FormatSpecifier(specifier) {
6550     if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
6551
6552     var match,
6553         fill = match[1] || " ",
6554         align = match[2] || ">",
6555         sign = match[3] || "-",
6556         symbol = match[4] || "",
6557         zero = !!match[5],
6558         width = match[6] && +match[6],
6559         comma = !!match[7],
6560         precision = match[8] && +match[8].slice(1),
6561         type = match[9] || "";
6562
6563     // The "n" type is an alias for ",g".
6564     if (type === "n") comma = true, type = "g";
6565
6566     // Map invalid types to the default format.
6567     else if (!formatTypes[type]) type = "";
6568
6569     // If zero fill is specified, padding goes after sign and before digits.
6570     if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
6571
6572     this.fill = fill;
6573     this.align = align;
6574     this.sign = sign;
6575     this.symbol = symbol;
6576     this.zero = zero;
6577     this.width = width;
6578     this.comma = comma;
6579     this.precision = precision;
6580     this.type = type;
6581   }
6582
6583   FormatSpecifier.prototype.toString = function() {
6584     return this.fill
6585         + this.align
6586         + this.sign
6587         + this.symbol
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))
6592         + this.type;
6593   };
6594
6595   function identity$3(x) {
6596     return x;
6597   }
6598
6599   var prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];
6600
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 || "%";
6607
6608     function newFormat(specifier) {
6609       specifier = formatSpecifier(specifier);
6610
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;
6620
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 : "";
6625
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);
6631
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));
6639
6640       function format(value) {
6641         var valuePrefix = prefix,
6642             valueSuffix = suffix,
6643             i, n, c;
6644
6645         if (type === "c") {
6646           valueSuffix = formatType(value) + valueSuffix;
6647           value = "";
6648         } else {
6649           value = +value;
6650
6651           // Perform the initial formatting.
6652           var valueNegative = value < 0;
6653           value = formatType(Math.abs(value), precision);
6654
6655           // If a negative value rounds to zero during formatting, treat as positive.
6656           if (valueNegative && +value === 0) valueNegative = false;
6657
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 === "(" ? ")" : "");
6661
6662           // Break the formatted value into the integer “value” part that can be
6663           // grouped, and fractional or exponential “suffix” part that is not.
6664           if (maybeSuffix) {
6665             i = -1, n = value.length;
6666             while (++i < n) {
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);
6670                 break;
6671               }
6672             }
6673           }
6674         }
6675
6676         // If the fill character is not "0", grouping is applied before padding.
6677         if (comma && !zero) value = group(value, Infinity);
6678
6679         // Compute the padding.
6680         var length = valuePrefix.length + value.length + valueSuffix.length,
6681             padding = length < width ? new Array(width - length + 1).join(fill) : "";
6682
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 = "";
6685
6686         // Reconstruct the final output based on the desired alignment.
6687         switch (align) {
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;
6692         }
6693
6694         return numerals(value);
6695       }
6696
6697       format.toString = function() {
6698         return specifier + "";
6699       };
6700
6701       return format;
6702     }
6703
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;
6711       };
6712     }
6713
6714     return {
6715       format: newFormat,
6716       formatPrefix: formatPrefix
6717     };
6718   }
6719
6720   var locale;
6721   var format;
6722   var formatPrefix;
6723
6724   defaultLocale({
6725     decimal: ".",
6726     thousands: ",",
6727     grouping: [3],
6728     currency: ["$", ""]
6729   });
6730
6731   function defaultLocale(definition) {
6732     locale = formatLocale(definition);
6733     format = locale.format;
6734     formatPrefix = locale.formatPrefix;
6735     return locale;
6736   }
6737
6738   function precisionFixed(step) {
6739     return Math.max(0, -exponent$1(Math.abs(step)));
6740   }
6741
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)));
6744   }
6745
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;
6749   }
6750
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)
6754   // 305–363 (1997).
6755   // Code adapted from GeographicLib by Charles F. F. Karney,
6756   // http://geographiclib.sourceforge.net/
6757
6758   function adder() {
6759     return new Adder;
6760   }
6761
6762   function Adder() {
6763     this.reset();
6764   }
6765
6766   Adder.prototype = {
6767     constructor: Adder,
6768     reset: function() {
6769       this.s = // rounded value
6770       this.t = 0; // exact error
6771     },
6772     add: function(y) {
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;
6777     },
6778     valueOf: function() {
6779       return this.s;
6780     }
6781   };
6782
6783   var temp = new Adder;
6784
6785   function add$1(adder, a, b) {
6786     var x = adder.s = a + b,
6787         bv = x - a,
6788         av = x - bv;
6789     adder.t = (a - av) + (b - bv);
6790   }
6791
6792   var epsilon$2 = 1e-6;
6793   var epsilon2$1 = 1e-12;
6794   var pi$3 = Math.PI;
6795   var halfPi$2 = pi$3 / 2;
6796   var quarterPi = pi$3 / 4;
6797   var tau$3 = pi$3 * 2;
6798
6799   var degrees$1 = 180 / pi$3;
6800   var radians = pi$3 / 180;
6801
6802   var abs = Math.abs;
6803   var atan = Math.atan;
6804   var atan2 = Math.atan2;
6805   var cos$1 = Math.cos;
6806   var ceil = Math.ceil;
6807   var exp = Math.exp;
6808   var log = Math.log;
6809   var pow = Math.pow;
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;
6813   var tan = Math.tan;
6814
6815   function acos(x) {
6816     return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x);
6817   }
6818
6819   function asin(x) {
6820     return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x);
6821   }
6822
6823   function haversin(x) {
6824     return (x = sin$1(x / 2)) * x;
6825   }
6826
6827   function noop$1() {}
6828
6829   function streamGeometry(geometry, stream) {
6830     if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
6831       streamGeometryType[geometry.type](geometry, stream);
6832     }
6833   }
6834
6835   var streamObjectType = {
6836     Feature: function(object, stream) {
6837       streamGeometry(object.geometry, stream);
6838     },
6839     FeatureCollection: function(object, stream) {
6840       var features = object.features, i = -1, n = features.length;
6841       while (++i < n) streamGeometry(features[i].geometry, stream);
6842     }
6843   };
6844
6845   var streamGeometryType = {
6846     Sphere: function(object, stream) {
6847       stream.sphere();
6848     },
6849     Point: function(object, stream) {
6850       object = object.coordinates;
6851       stream.point(object[0], object[1], object[2]);
6852     },
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]);
6856     },
6857     LineString: function(object, stream) {
6858       streamLine(object.coordinates, stream, 0);
6859     },
6860     MultiLineString: function(object, stream) {
6861       var coordinates = object.coordinates, i = -1, n = coordinates.length;
6862       while (++i < n) streamLine(coordinates[i], stream, 0);
6863     },
6864     Polygon: function(object, stream) {
6865       streamPolygon(object.coordinates, stream);
6866     },
6867     MultiPolygon: function(object, stream) {
6868       var coordinates = object.coordinates, i = -1, n = coordinates.length;
6869       while (++i < n) streamPolygon(coordinates[i], stream);
6870     },
6871     GeometryCollection: function(object, stream) {
6872       var geometries = object.geometries, i = -1, n = geometries.length;
6873       while (++i < n) streamGeometry(geometries[i], stream);
6874     }
6875   };
6876
6877   function streamLine(coordinates, stream, closed) {
6878     var i = -1, n = coordinates.length - closed, coordinate;
6879     stream.lineStart();
6880     while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
6881     stream.lineEnd();
6882   }
6883
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();
6889   }
6890
6891   function geoStream(object, stream) {
6892     if (object && streamObjectType.hasOwnProperty(object.type)) {
6893       streamObjectType[object.type](object, stream);
6894     } else {
6895       streamGeometry(object, stream);
6896     }
6897   }
6898
6899   var areaRingSum = adder();
6900
6901   var areaSum = adder(),
6902       lambda00,
6903       phi00,
6904       lambda0,
6905       cosPhi0,
6906       sinPhi0;
6907
6908   var areaStream = {
6909     point: noop$1,
6910     lineStart: noop$1,
6911     lineEnd: noop$1,
6912     polygonStart: function() {
6913       areaRingSum.reset();
6914       areaStream.lineStart = areaRingStart;
6915       areaStream.lineEnd = areaRingEnd;
6916     },
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;
6921     },
6922     sphere: function() {
6923       areaSum.add(tau$3);
6924     }
6925   };
6926
6927   function areaRingStart() {
6928     areaStream.point = areaPointFirst;
6929   }
6930
6931   function areaRingEnd() {
6932     areaPoint(lambda00, phi00);
6933   }
6934
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);
6940   }
6941
6942   function areaPoint(lambda, phi) {
6943     lambda *= radians, phi *= radians;
6944     phi = phi / 2 + quarterPi; // half the angular distance from south pole
6945
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));
6958
6959     // Advance the previous points.
6960     lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
6961   }
6962
6963   function d3_geoArea(object) {
6964     areaSum.reset();
6965     geoStream(object, areaStream);
6966     return areaSum * 2;
6967   }
6968
6969   function spherical(cartesian) {
6970     return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];
6971   }
6972
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)];
6976   }
6977
6978   function cartesianDot(a, b) {
6979     return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
6980   }
6981
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]];
6984   }
6985
6986   // TODO return a
6987   function cartesianAddInPlace(a, b) {
6988     a[0] += b[0], a[1] += b[1], a[2] += b[2];
6989   }
6990
6991   function cartesianScale(vector, k) {
6992     return [vector[0] * k, vector[1] * k, vector[2] * k];
6993   }
6994
6995   // TODO return d
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;
6999   }
7000
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
7005       deltaSum = adder(),
7006       ranges,
7007       range$1;
7008
7009   var boundsStream = {
7010     point: boundsPoint,
7011     lineStart: boundsLineStart,
7012     lineEnd: boundsLineEnd,
7013     polygonStart: function() {
7014       boundsStream.point = boundsRingPoint;
7015       boundsStream.lineStart = boundsRingStart;
7016       boundsStream.lineEnd = boundsRingEnd;
7017       deltaSum.reset();
7018       areaStream.polygonStart();
7019     },
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;
7029     }
7030   };
7031
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;
7036   }
7037
7038   function linePoint(lambda, phi) {
7039     var p = cartesian([lambda * radians, phi * radians]);
7040     if (p0) {
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 = delta > 0 ? 1 : -1,
7048           lambdai = inflection[0] * degrees$1 * sign,
7049           phii,
7050           antimeridian = abs(delta) > 180;
7051       if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
7052         phii = inflection[1] * degrees$1;
7053         if (phii > phi1) phi1 = phii;
7054       } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
7055         phii = -inflection[1] * degrees$1;
7056         if (phii < phi0) phi0 = phii;
7057       } else {
7058         if (phi < phi0) phi0 = phi;
7059         if (phi > phi1) phi1 = phi;
7060       }
7061       if (antimeridian) {
7062         if (lambda < lambda2) {
7063           if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7064         } else {
7065           if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7066         }
7067       } else {
7068         if (lambda1 >= lambda0$1) {
7069           if (lambda < lambda0$1) lambda0$1 = lambda;
7070           if (lambda > lambda1) lambda1 = lambda;
7071         } else {
7072           if (lambda > lambda2) {
7073             if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7074           } else {
7075             if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7076           }
7077         }
7078       }
7079     } else {
7080       ranges.push(range$1 = [lambda0$1 = lambda, lambda1 = lambda]);
7081     }
7082     if (phi < phi0) phi0 = phi;
7083     if (phi > phi1) phi1 = phi;
7084     p0 = p, lambda2 = lambda;
7085   }
7086
7087   function boundsLineStart() {
7088     boundsStream.point = linePoint;
7089   }
7090
7091   function boundsLineEnd() {
7092     range$1[0] = lambda0$1, range$1[1] = lambda1;
7093     boundsStream.point = boundsPoint;
7094     p0 = null;
7095   }
7096
7097   function boundsRingPoint(lambda, phi) {
7098     if (p0) {
7099       var delta = lambda - lambda2;
7100       deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
7101     } else {
7102       lambda00$1 = lambda, phi00$1 = phi;
7103     }
7104     areaStream.point(lambda, phi);
7105     linePoint(lambda, phi);
7106   }
7107
7108   function boundsRingStart() {
7109     areaStream.lineStart();
7110   }
7111
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;
7117     p0 = null;
7118   }
7119
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;
7125   }
7126
7127   function rangeCompare(a, b) {
7128     return a[0] - b[0];
7129   }
7130
7131   function rangeContains(range, x) {
7132     return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
7133   }
7134
7135   function d3_geoBounds(feature) {
7136     var i, n, a, b, merged, deltaMax, delta;
7137
7138     phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
7139     ranges = [];
7140     geoStream(feature, boundsStream);
7141
7142     // First, sort ranges by their minimum longitudes.
7143     if (n = ranges.length) {
7144       ranges.sort(rangeCompare);
7145
7146       // Then, merge any ranges that overlap.
7147       for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {
7148         b = ranges[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];
7152         } else {
7153           merged.push(a = b);
7154         }
7155       }
7156
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) {
7160         b = merged[i];
7161         if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1];
7162       }
7163     }
7164
7165     ranges = range$1 = null;
7166
7167     return lambda0$1 === Infinity || phi0 === Infinity
7168         ? [[NaN, NaN], [NaN, NaN]]
7169         : [[lambda0$1, phi0], [lambda1, phi1]];
7170   }
7171
7172   var W0, W1,
7173       X0, Y0, Z0,
7174       X1, Y1, Z1,
7175       X2, Y2, Z2,
7176       lambda00$2, phi00$2, // first point
7177       x0, y0, z0; // previous point
7178
7179   var centroidStream = {
7180     sphere: noop$1,
7181     point: centroidPoint,
7182     lineStart: centroidLineStart,
7183     lineEnd: centroidLineEnd,
7184     polygonStart: function() {
7185       centroidStream.lineStart = centroidRingStart;
7186       centroidStream.lineEnd = centroidRingEnd;
7187     },
7188     polygonEnd: function() {
7189       centroidStream.lineStart = centroidLineStart;
7190       centroidStream.lineEnd = centroidLineEnd;
7191     }
7192   };
7193
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));
7199   }
7200
7201   function centroidPointCartesian(x, y, z) {
7202     ++W0;
7203     X0 += (x - X0) / W0;
7204     Y0 += (y - Y0) / W0;
7205     Z0 += (z - Z0) / W0;
7206   }
7207
7208   function centroidLineStart() {
7209     centroidStream.point = centroidLinePointFirst;
7210   }
7211
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);
7217     z0 = sin$1(phi);
7218     centroidStream.point = centroidLinePoint;
7219     centroidPointCartesian(x0, y0, z0);
7220   }
7221
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),
7227         z = sin$1(phi),
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);
7229     W1 += w;
7230     X1 += w * (x0 + (x0 = x));
7231     Y1 += w * (y0 + (y0 = y));
7232     Z1 += w * (z0 + (z0 = z));
7233     centroidPointCartesian(x0, y0, z0);
7234   }
7235
7236   function centroidLineEnd() {
7237     centroidStream.point = centroidPoint;
7238   }
7239
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;
7244   }
7245
7246   function centroidRingEnd() {
7247     centroidRingPoint(lambda00$2, phi00$2);
7248     centroidStream.point = centroidPoint;
7249   }
7250
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);
7258     z0 = sin$1(phi);
7259     centroidPointCartesian(x0, y0, z0);
7260   }
7261
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),
7267         z = sin$1(phi),
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
7274     X2 += v * cx;
7275     Y2 += v * cy;
7276     Z2 += v * cz;
7277     W1 += w;
7278     X1 += w * (x0 + (x0 = x));
7279     Y1 += w * (y0 + (y0 = y));
7280     Z1 += w * (z0 + (z0 = z));
7281     centroidPointCartesian(x0, y0, z0);
7282   }
7283
7284   function d3_geoCentroid(object) {
7285     W0 = W1 =
7286     X0 = Y0 = Z0 =
7287     X1 = Y1 = Z1 =
7288     X2 = Y2 = Z2 = 0;
7289     geoStream(object, centroidStream);
7290
7291     var x = X2,
7292         y = Y2,
7293         z = Z2,
7294         m = x * x + y * y + z * z;
7295
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];
7304     }
7305
7306     return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1];
7307   }
7308
7309   function constant$7(x) {
7310     return function() {
7311       return x;
7312     };
7313   }
7314
7315   function compose(a, b) {
7316
7317     function compose(x, y) {
7318       return x = a(x, y), b(x[0], x[1]);
7319     }
7320
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]);
7323     };
7324
7325     return compose;
7326   }
7327
7328   function rotationIdentity(lambda, phi) {
7329     return [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
7330   }
7331
7332   rotationIdentity.invert = rotationIdentity;
7333
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);
7339   }
7340
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];
7344     };
7345   }
7346
7347   function rotationLambda(deltaLambda) {
7348     var rotation = forwardRotationLambda(deltaLambda);
7349     rotation.invert = forwardRotationLambda(-deltaLambda);
7350     return rotation;
7351   }
7352
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);
7358
7359     function rotation(lambda, phi) {
7360       var cosPhi = cos$1(phi),
7361           x = cos$1(lambda) * cosPhi,
7362           y = sin$1(lambda) * cosPhi,
7363           z = sin$1(phi),
7364           k = z * cosDeltaPhi + x * sinDeltaPhi;
7365       return [
7366         atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
7367         asin(k * cosDeltaGamma + y * sinDeltaGamma)
7368       ];
7369     }
7370
7371     rotation.invert = function(lambda, phi) {
7372       var cosPhi = cos$1(phi),
7373           x = cos$1(lambda) * cosPhi,
7374           y = sin$1(lambda) * cosPhi,
7375           z = sin$1(phi),
7376           k = z * cosDeltaGamma - y * sinDeltaGamma;
7377       return [
7378         atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
7379         asin(k * cosDeltaPhi - x * sinDeltaPhi)
7380       ];
7381     };
7382
7383     return rotation;
7384   }
7385
7386   function rotation(rotate) {
7387     rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
7388
7389     function forward(coordinates) {
7390       coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
7391       return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
7392     }
7393
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;
7397     };
7398
7399     return forward;
7400   }
7401
7402   // Generates a circle centered at [0°, 0°], with a given radius and precision.
7403   function circleStream(stream, radius, delta, direction, t0, t1) {
7404     if (!delta) return;
7405     var cosRadius = cos$1(radius),
7406         sinRadius = sin$1(radius),
7407         step = direction * delta;
7408     if (t0 == null) {
7409       t0 = radius + direction * tau$3;
7410       t1 = radius - step / 2;
7411     } else {
7412       t0 = circleRadius(cosRadius, t0);
7413       t1 = circleRadius(cosRadius, t1);
7414       if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3;
7415     }
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]);
7419     }
7420   }
7421
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;
7428   }
7429
7430   function circle() {
7431     var center = constant$7([0, 0]),
7432         radius = constant$7(90),
7433         precision = constant$7(6),
7434         ring,
7435         rotate,
7436         stream = {point: point};
7437
7438     function point(x, y) {
7439       ring.push(x = rotate(x, y));
7440       x[0] *= degrees$1, x[1] *= degrees$1;
7441     }
7442
7443     function circle() {
7444       var c = center.apply(this, arguments),
7445           r = radius.apply(this, arguments) * radians,
7446           p = precision.apply(this, arguments) * radians;
7447       ring = [];
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;
7452       return c;
7453     }
7454
7455     circle.center = function(_) {
7456       return arguments.length ? (center = typeof _ === "function" ? _ : constant$7([+_[0], +_[1]]), circle) : center;
7457     };
7458
7459     circle.radius = function(_) {
7460       return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), circle) : radius;
7461     };
7462
7463     circle.precision = function(_) {
7464       return arguments.length ? (precision = typeof _ === "function" ? _ : constant$7(+_), circle) : precision;
7465     };
7466
7467     return circle;
7468   }
7469
7470   function clipBuffer() {
7471     var lines = [],
7472         line;
7473     return {
7474       point: function(x, y) {
7475         line.push([x, y]);
7476       },
7477       lineStart: function() {
7478         lines.push(line = []);
7479       },
7480       lineEnd: noop$1,
7481       rejoin: function() {
7482         if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
7483       },
7484       result: function() {
7485         var result = lines;
7486         lines = [];
7487         line = null;
7488         return result;
7489       }
7490     };
7491   }
7492
7493   function pointEqual(a, b) {
7494     return abs(a[0] - b[0]) < epsilon$2 && abs(a[1] - b[1]) < epsilon$2;
7495   }
7496
7497   function Intersection(point, points, other, entry) {
7498     this.x = point;
7499     this.z = points;
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
7504   }
7505
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) {
7510     var subject = [],
7511         clip = [],
7512         i,
7513         n;
7514
7515     segments.forEach(function(segment) {
7516       if ((n = segment.length - 1) <= 0) return;
7517       var n, p0 = segment[0], p1 = segment[n], x;
7518
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)) {
7523         stream.lineStart();
7524         for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);
7525         stream.lineEnd();
7526         return;
7527       }
7528
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));
7533     });
7534
7535     if (!subject.length) return;
7536
7537     clip.sort(compareIntersection);
7538     link$1(subject);
7539     link$1(clip);
7540
7541     for (i = 0, n = clip.length; i < n; ++i) {
7542       clip[i].e = startInside = !startInside;
7543     }
7544
7545     var start = subject[0],
7546         points,
7547         point;
7548
7549     while (1) {
7550       // Find first unvisited intersection.
7551       var current = start,
7552           isSubject = true;
7553       while (current.v) if ((current = current.n) === start) return;
7554       points = current.z;
7555       stream.lineStart();
7556       do {
7557         current.v = current.o.v = true;
7558         if (current.e) {
7559           if (isSubject) {
7560             for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);
7561           } else {
7562             interpolate(current.x, current.n.x, 1, stream);
7563           }
7564           current = current.n;
7565         } else {
7566           if (isSubject) {
7567             points = current.p.z;
7568             for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);
7569           } else {
7570             interpolate(current.x, current.p.x, -1, stream);
7571           }
7572           current = current.p;
7573         }
7574         current = current.o;
7575         points = current.z;
7576         isSubject = !isSubject;
7577       } while (!current.v);
7578       stream.lineEnd();
7579     }
7580   }
7581
7582   function link$1(array) {
7583     if (!(n = array.length)) return;
7584     var n,
7585         i = 0,
7586         a = array[0],
7587         b;
7588     while (++i < n) {
7589       a.n = b = array[i];
7590       b.p = a;
7591       a = b;
7592     }
7593     a.n = b = array[0];
7594     b.p = a;
7595   }
7596
7597   var sum$1 = adder();
7598
7599   function polygonContains(polygon, point) {
7600     var lambda = point[0],
7601         phi = point[1],
7602         normal = [sin$1(lambda), -cos$1(lambda), 0],
7603         angle = 0,
7604         winding = 0;
7605
7606     sum$1.reset();
7607
7608     for (var i = 0, n = polygon.length; i < n; ++i) {
7609       if (!(m = (ring = polygon[i]).length)) continue;
7610       var ring,
7611           m,
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);
7617
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 = delta >= 0 ? 1 : -1,
7626             absDelta = sign * delta,
7627             antimeridian = absDelta > pi$3,
7628             k = sinPhi0 * sinPhi1;
7629
7630         sum$1.add(atan2(k * sign * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta)));
7631         angle += antimeridian ? delta + sign * tau$3 : delta;
7632
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;
7643           }
7644         }
7645       }
7646     }
7647
7648     // First, determine whether the South pole is inside or outside:
7649     //
7650     // It is inside if:
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.
7654     //
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.
7658
7659     return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1);
7660   }
7661
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,
7668           polygon,
7669           segments,
7670           ring;
7671
7672       var clip = {
7673         point: point,
7674         lineStart: lineStart,
7675         lineEnd: lineEnd,
7676         polygonStart: function() {
7677           clip.point = pointRing;
7678           clip.lineStart = ringStart;
7679           clip.lineEnd = ringEnd;
7680           segments = [];
7681           polygon = [];
7682         },
7683         polygonEnd: function() {
7684           clip.point = point;
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;
7694             sink.lineStart();
7695             interpolate(null, null, 1, sink);
7696             sink.lineEnd();
7697           }
7698           if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
7699           segments = polygon = null;
7700         },
7701         sphere: function() {
7702           sink.polygonStart();
7703           sink.lineStart();
7704           interpolate(null, null, 1, sink);
7705           sink.lineEnd();
7706           sink.polygonEnd();
7707         }
7708       };
7709
7710       function point(lambda, phi) {
7711         if (pointVisible(lambda, phi)) sink.point(lambda, phi);
7712       }
7713
7714       function pointLine(lambda, phi) {
7715         line.point(lambda, phi);
7716       }
7717
7718       function lineStart() {
7719         clip.point = pointLine;
7720         line.lineStart();
7721       }
7722
7723       function lineEnd() {
7724         clip.point = point;
7725         line.lineEnd();
7726       }
7727
7728       function pointRing(lambda, phi) {
7729         ring.push([lambda, phi]);
7730         ringSink.point(lambda, phi);
7731       }
7732
7733       function ringStart() {
7734         ringSink.lineStart();
7735         ring = [];
7736       }
7737
7738       function ringEnd() {
7739         pointRing(ring[0][0], ring[0][1]);
7740         ringSink.lineEnd();
7741
7742         var clean = ringSink.clean(),
7743             ringSegments = ringBuffer.result(),
7744             i, n = ringSegments.length, m,
7745             segment,
7746             point;
7747
7748         ring.pop();
7749         polygon.push(ring);
7750         ring = null;
7751
7752         if (!n) return;
7753
7754         // No intersections.
7755         if (clean & 1) {
7756           segment = ringSegments[0];
7757           if ((m = segment.length - 1) > 0) {
7758             if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7759             sink.lineStart();
7760             for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);
7761             sink.lineEnd();
7762           }
7763           return;
7764         }
7765
7766         // Rejoin connected segments.
7767         // TODO reuse ringBuffer.rejoin()?
7768         if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
7769
7770         segments.push(ringSegments.filter(validSegment));
7771       }
7772
7773       return clip;
7774     };
7775   }
7776
7777   function validSegment(segment) {
7778     return segment.length > 1;
7779   }
7780
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]);
7786   }
7787
7788   var clipAntimeridian = clip(
7789     function() { return true; },
7790     clipAntimeridianLine,
7791     clipAntimeridianInterpolate,
7792     [-pi$3, -halfPi$2]
7793   );
7794
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) {
7799     var lambda0 = NaN,
7800         phi0 = NaN,
7801         sign0 = NaN,
7802         clean; // no intersections
7803
7804     return {
7805       lineStart: function() {
7806         stream.lineStart();
7807         clean = 1;
7808       },
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);
7815           stream.lineEnd();
7816           stream.lineStart();
7817           stream.point(sign1, phi0);
7818           stream.point(lambda1, phi0);
7819           clean = 0;
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);
7825           stream.lineEnd();
7826           stream.lineStart();
7827           stream.point(sign1, phi0);
7828           clean = 0;
7829         }
7830         stream.point(lambda0 = lambda1, phi0 = phi1);
7831         sign0 = sign1;
7832       },
7833       lineEnd: function() {
7834         stream.lineEnd();
7835         lambda0 = phi0 = NaN;
7836       },
7837       clean: function() {
7838         return 2 - clean; // if intersections, rejoin first and last segments
7839       }
7840     };
7841   }
7842
7843   function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
7844     var cosPhi0,
7845         cosPhi1,
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;
7852   }
7853
7854   function clipAntimeridianInterpolate(from, to, direction, stream) {
7855     var phi;
7856     if (from == null) {
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);
7873     } else {
7874       stream.point(to[0], to[1]);
7875     }
7876   }
7877
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
7883
7884     function interpolate(from, to, direction, stream) {
7885       circleStream(stream, radius, delta, direction, from, to);
7886     }
7887
7888     function visible(lambda, phi) {
7889       return cos$1(lambda) * cos$1(phi) > cr;
7890     }
7891
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
7902       return {
7903         lineStart: function() {
7904           v00 = v0 = false;
7905           clean = 1;
7906         },
7907         point: function(lambda, phi) {
7908           var point1 = [lambda, phi],
7909               point2,
7910               v = visible(lambda, phi),
7911               c = smallRadius
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.
7917           if (v !== v0) {
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]);
7923             }
7924           }
7925           if (v !== v0) {
7926             clean = 0;
7927             if (v) {
7928               // outside going in
7929               stream.lineStart();
7930               point2 = intersect(point1, point0);
7931               stream.point(point2[0], point2[1]);
7932             } else {
7933               // inside going out
7934               point2 = intersect(point0, point1);
7935               stream.point(point2[0], point2[1]);
7936               stream.lineEnd();
7937             }
7938             point0 = point2;
7939           } else if (notHemisphere && point0 && smallRadius ^ v) {
7940             var t;
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))) {
7944               clean = 0;
7945               if (smallRadius) {
7946                 stream.lineStart();
7947                 stream.point(t[0][0], t[0][1]);
7948                 stream.point(t[1][0], t[1][1]);
7949                 stream.lineEnd();
7950               } else {
7951                 stream.point(t[1][0], t[1][1]);
7952                 stream.lineEnd();
7953                 stream.lineStart();
7954                 stream.point(t[0][0], t[0][1]);
7955               }
7956             }
7957           }
7958           if (v && (!point0 || !pointEqual(point0, point1))) {
7959             stream.point(point1[0], point1[1]);
7960           }
7961           point0 = point1, v0 = v, c0 = c;
7962         },
7963         lineEnd: function() {
7964           if (v0) stream.lineEnd();
7965           point0 = null;
7966         },
7967         // Rejoin first and last segments if there were intersections and the first
7968         // and last points were visible.
7969         clean: function() {
7970           return clean | ((v00 && v0) << 1);
7971         }
7972       };
7973     }
7974
7975     // Intersects the great circle between a and b with the clip circle.
7976     function intersect(a, b, two) {
7977       var pa = cartesian(a),
7978           pb = cartesian(b);
7979
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;
7987
7988       // Two polar points.
7989       if (!determinant) return !two && a;
7990
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);
7997
7998       // Solve |p(t)|^2 = 1.
7999       var u = n1xn2,
8000           w = cartesianDot(A, u),
8001           uu = cartesianDot(u, u),
8002           t2 = w * w - uu * (cartesianDot(A, A) - 1);
8003
8004       if (t2 < 0) return;
8005
8006       var t = sqrt(t2),
8007           q = cartesianScale(u, (-w - t) / uu);
8008       cartesianAddInPlace(q, A);
8009       q = spherical(q);
8010
8011       if (!two) return q;
8012
8013       // Two intersection points.
8014       var lambda0 = a[0],
8015           lambda1 = b[0],
8016           phi0 = a[1],
8017           phi1 = b[1],
8018           z;
8019
8020       if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
8021
8022       var delta = lambda1 - lambda0,
8023           polar = abs(delta - pi$3) < epsilon$2,
8024           meridian = polar || delta < epsilon$2;
8025
8026       if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
8027
8028       // Check that the first point is between a and b.
8029       if (meridian
8030           ? polar
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)];
8037       }
8038     }
8039
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,
8044           code = 0;
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
8049       return code;
8050     }
8051
8052     return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]);
8053   }
8054
8055   function clipLine(a, b, x0, y0, x1, y1) {
8056     var ax = a[0],
8057         ay = a[1],
8058         bx = b[0],
8059         by = b[1],
8060         t0 = 0,
8061         t1 = 1,
8062         dx = bx - ax,
8063         dy = by - ay,
8064         r;
8065
8066     r = x0 - ax;
8067     if (!dx && r > 0) return;
8068     r /= dx;
8069     if (dx < 0) {
8070       if (r < t0) return;
8071       if (r < t1) t1 = r;
8072     } else if (dx > 0) {
8073       if (r > t1) return;
8074       if (r > t0) t0 = r;
8075     }
8076
8077     r = x1 - ax;
8078     if (!dx && r < 0) return;
8079     r /= dx;
8080     if (dx < 0) {
8081       if (r > t1) return;
8082       if (r > t0) t0 = r;
8083     } else if (dx > 0) {
8084       if (r < t0) return;
8085       if (r < t1) t1 = r;
8086     }
8087
8088     r = y0 - ay;
8089     if (!dy && r > 0) return;
8090     r /= dy;
8091     if (dy < 0) {
8092       if (r < t0) return;
8093       if (r < t1) t1 = r;
8094     } else if (dy > 0) {
8095       if (r > t1) return;
8096       if (r > t0) t0 = r;
8097     }
8098
8099     r = y1 - ay;
8100     if (!dy && r < 0) return;
8101     r /= dy;
8102     if (dy < 0) {
8103       if (r > t1) return;
8104       if (r > t0) t0 = r;
8105     } else if (dy > 0) {
8106       if (r < t0) return;
8107       if (r < t1) t1 = r;
8108     }
8109
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;
8112     return true;
8113   }
8114
8115   var clipMax = 1e9, clipMin = -clipMax;
8116
8117   // TODO Use d3-polygon’s polygonContains here for the ring check?
8118   // TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
8119
8120   function clipRectangle(x0, y0, x1, y1) {
8121
8122     function visible(x, y) {
8123       return x0 <= x && x <= x1 && y0 <= y && y <= y1;
8124     }
8125
8126     function interpolate(from, to, direction, stream) {
8127       var a = 0, a1 = 0;
8128       if (from == null
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);
8133       } else {
8134         stream.point(to[0], to[1]);
8135       }
8136     }
8137
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
8143     }
8144
8145     function compareIntersection(a, b) {
8146       return comparePoint(a.x, b.x);
8147     }
8148
8149     function comparePoint(a, b) {
8150       var ca = corner(a, 1),
8151           cb = corner(b, 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]
8156           : b[0] - a[0];
8157     }
8158
8159     return function(stream) {
8160       var activeStream = stream,
8161           bufferStream = clipBuffer(),
8162           segments,
8163           polygon,
8164           ring,
8165           x__, y__, v__, // first point
8166           x_, y_, v_, // previous point
8167           first,
8168           clean;
8169
8170       var clipStream = {
8171         point: point,
8172         lineStart: lineStart,
8173         lineEnd: lineEnd,
8174         polygonStart: polygonStart,
8175         polygonEnd: polygonEnd
8176       };
8177
8178       function point(x, y) {
8179         if (visible(x, y)) activeStream.point(x, y);
8180       }
8181
8182       function polygonInside() {
8183         var winding = 0;
8184
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; }
8190           }
8191         }
8192
8193         return winding;
8194       }
8195
8196       // Buffer geometry within a polygon and then clip it en masse.
8197       function polygonStart() {
8198         activeStream = bufferStream, segments = [], polygon = [], clean = true;
8199       }
8200
8201       function polygonEnd() {
8202         var startInside = polygonInside(),
8203             cleanInside = clean && startInside,
8204             visible = (segments = merge(segments)).length;
8205         if (cleanInside || visible) {
8206           stream.polygonStart();
8207           if (cleanInside) {
8208             stream.lineStart();
8209             interpolate(null, null, 1, stream);
8210             stream.lineEnd();
8211           }
8212           if (visible) {
8213             clipRejoin(segments, compareIntersection, startInside, interpolate, stream);
8214           }
8215           stream.polygonEnd();
8216         }
8217         activeStream = stream, segments = polygon = ring = null;
8218       }
8219
8220       function lineStart() {
8221         clipStream.point = linePoint;
8222         if (polygon) polygon.push(ring = []);
8223         first = true;
8224         v_ = false;
8225         x_ = y_ = NaN;
8226       }
8227
8228       // TODO rather than special-case polygons, simply handle them separately.
8229       // Ideally, coincident intersection points should be jittered to avoid
8230       // clipping issues.
8231       function lineEnd() {
8232         if (segments) {
8233           linePoint(x__, y__);
8234           if (v__ && v_) bufferStream.rejoin();
8235           segments.push(bufferStream.result());
8236         }
8237         clipStream.point = point;
8238         if (v_) activeStream.lineEnd();
8239       }
8240
8241       function linePoint(x, y) {
8242         var v = visible(x, y);
8243         if (polygon) ring.push([x, y]);
8244         if (first) {
8245           x__ = x, y__ = y, v__ = v;
8246           first = false;
8247           if (v) {
8248             activeStream.lineStart();
8249             activeStream.point(x, y);
8250           }
8251         } else {
8252           if (v && v_) activeStream.point(x, y);
8253           else {
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)) {
8257               if (!v_) {
8258                 activeStream.lineStart();
8259                 activeStream.point(a[0], a[1]);
8260               }
8261               activeStream.point(b[0], b[1]);
8262               if (!v) activeStream.lineEnd();
8263               clean = false;
8264             } else if (v) {
8265               activeStream.lineStart();
8266               activeStream.point(x, y);
8267               clean = false;
8268             }
8269           }
8270         }
8271         x_ = x, y_ = y, v_ = v;
8272       }
8273
8274       return clipStream;
8275     };
8276   }
8277
8278   function extent$1() {
8279     var x0 = 0,
8280         y0 = 0,
8281         x1 = 960,
8282         y1 = 500,
8283         cache,
8284         cacheStream,
8285         clip;
8286
8287     return clip = {
8288       stream: function(stream) {
8289         return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);
8290       },
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]];
8293       }
8294     };
8295   }
8296
8297   var lengthSum = adder(),
8298       lambda0$2,
8299       sinPhi0$1,
8300       cosPhi0$1;
8301
8302   var lengthStream = {
8303     sphere: noop$1,
8304     point: noop$1,
8305     lineStart: lengthLineStart,
8306     lineEnd: noop$1,
8307     polygonStart: noop$1,
8308     polygonEnd: noop$1
8309   };
8310
8311   function lengthLineStart() {
8312     lengthStream.point = lengthPointFirst;
8313     lengthStream.lineEnd = lengthLineEnd;
8314   }
8315
8316   function lengthLineEnd() {
8317     lengthStream.point = lengthStream.lineEnd = noop$1;
8318   }
8319
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;
8324   }
8325
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;
8338   }
8339
8340   function length$1(object) {
8341     lengthSum.reset();
8342     geoStream(object, lengthStream);
8343     return +lengthSum;
8344   }
8345
8346   var coordinates = [null, null],
8347       object$1 = {type: "LineString", coordinates: coordinates};
8348
8349   function distance(a, b) {
8350     coordinates[0] = a;
8351     coordinates[1] = b;
8352     return length$1(object$1);
8353   }
8354
8355   var containsObjectType = {
8356     Feature: function(object, point) {
8357       return containsGeometry(object.geometry, point);
8358     },
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;
8362       return false;
8363     }
8364   };
8365
8366   var containsGeometryType = {
8367     Sphere: function() {
8368       return true;
8369     },
8370     Point: function(object, point) {
8371       return containsPoint(object.coordinates, point);
8372     },
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;
8376       return false;
8377     },
8378     LineString: function(object, point) {
8379       return containsLine(object.coordinates, point);
8380     },
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;
8384       return false;
8385     },
8386     Polygon: function(object, point) {
8387       return containsPolygon(object.coordinates, point);
8388     },
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;
8392       return false;
8393     },
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;
8397       return false;
8398     }
8399   };
8400
8401   function containsGeometry(geometry, point) {
8402     return geometry && containsGeometryType.hasOwnProperty(geometry.type)
8403         ? containsGeometryType[geometry.type](geometry, point)
8404         : false;
8405   }
8406
8407   function containsPoint(coordinates, point) {
8408     return distance(coordinates, point) === 0;
8409   }
8410
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;
8416   }
8417
8418   function containsPolygon(coordinates, point) {
8419     return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));
8420   }
8421
8422   function ringRadians(ring) {
8423     return ring = ring.map(pointRadians), ring.pop(), ring;
8424   }
8425
8426   function pointRadians(point) {
8427     return [point[0] * radians, point[1] * radians];
8428   }
8429
8430   function contains(object, point) {
8431     return (object && containsObjectType.hasOwnProperty(object.type)
8432         ? containsObjectType[object.type]
8433         : containsGeometry)(object, point);
8434   }
8435
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]; }); };
8439   }
8440
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]; }); };
8444   }
8445
8446   function graticule() {
8447     var x1, x0, X1, X0,
8448         y1, y0, Y1, Y0,
8449         dx = 10, dy = dx, DX = 90, DY = 360,
8450         x, y, X, Y,
8451         precision = 2.5;
8452
8453     function graticule() {
8454       return {type: "MultiLineString", coordinates: lines()};
8455     }
8456
8457     function 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));
8462     }
8463
8464     graticule.lines = function() {
8465       return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; });
8466     };
8467
8468     graticule.outline = function() {
8469       return {
8470         type: "Polygon",
8471         coordinates: [
8472           X(X0).concat(
8473           Y(Y1).slice(1),
8474           X(X1).reverse().slice(1),
8475           Y(Y0).reverse().slice(1))
8476         ]
8477       };
8478     };
8479
8480     graticule.extent = function(_) {
8481       if (!arguments.length) return graticule.extentMinor();
8482       return graticule.extentMajor(_).extentMinor(_);
8483     };
8484
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);
8492     };
8493
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);
8501     };
8502
8503     graticule.step = function(_) {
8504       if (!arguments.length) return graticule.stepMinor();
8505       return graticule.stepMajor(_).stepMinor(_);
8506     };
8507
8508     graticule.stepMajor = function(_) {
8509       if (!arguments.length) return [DX, DY];
8510       DX = +_[0], DY = +_[1];
8511       return graticule;
8512     };
8513
8514     graticule.stepMinor = function(_) {
8515       if (!arguments.length) return [dx, dy];
8516       dx = +_[0], dy = +_[1];
8517       return graticule;
8518     };
8519
8520     graticule.precision = function(_) {
8521       if (!arguments.length) return precision;
8522       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);
8527       return graticule;
8528     };
8529
8530     return graticule
8531         .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]])
8532         .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]);
8533   }
8534
8535   function graticule10() {
8536     return graticule()();
8537   }
8538
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,
8544         cy0 = cos$1(y0),
8545         sy0 = sin$1(y0),
8546         cy1 = cos$1(y1),
8547         sy1 = sin$1(y1),
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))),
8553         k = sin$1(d);
8554
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;
8561       return [
8562         atan2(y, x) * degrees$1,
8563         atan2(z, sqrt(x * x + y * y)) * degrees$1
8564       ];
8565     } : function() {
8566       return [x0 * degrees$1, y0 * degrees$1];
8567     };
8568
8569     interpolate.distance = d;
8570
8571     return interpolate;
8572   }
8573
8574   function identity$4(x) {
8575     return x;
8576   }
8577
8578   var areaSum$1 = adder(),
8579       areaRingSum$1 = adder(),
8580       x00,
8581       y00,
8582       x0$1,
8583       y0$1;
8584
8585   var areaStream$1 = {
8586     point: noop$1,
8587     lineStart: noop$1,
8588     lineEnd: noop$1,
8589     polygonStart: function() {
8590       areaStream$1.lineStart = areaRingStart$1;
8591       areaStream$1.lineEnd = areaRingEnd$1;
8592     },
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();
8597     },
8598     result: function() {
8599       var area = areaSum$1 / 2;
8600       areaSum$1.reset();
8601       return area;
8602     }
8603   };
8604
8605   function areaRingStart$1() {
8606     areaStream$1.point = areaPointFirst$1;
8607   }
8608
8609   function areaPointFirst$1(x, y) {
8610     areaStream$1.point = areaPoint$1;
8611     x00 = x0$1 = x, y00 = y0$1 = y;
8612   }
8613
8614   function areaPoint$1(x, y) {
8615     areaRingSum$1.add(y0$1 * x - x0$1 * y);
8616     x0$1 = x, y0$1 = y;
8617   }
8618
8619   function areaRingEnd$1() {
8620     areaPoint$1(x00, y00);
8621   }
8622
8623   var x0$2 = Infinity,
8624       y0$2 = x0$2,
8625       x1 = -x0$2,
8626       y1 = x1;
8627
8628   var boundsStream$1 = {
8629     point: boundsPoint$1,
8630     lineStart: noop$1,
8631     lineEnd: noop$1,
8632     polygonStart: noop$1,
8633     polygonEnd: noop$1,
8634     result: function() {
8635       var bounds = [[x0$2, y0$2], [x1, y1]];
8636       x1 = y1 = -(y0$2 = x0$2 = Infinity);
8637       return bounds;
8638     }
8639   };
8640
8641   function boundsPoint$1(x, y) {
8642     if (x < x0$2) x0$2 = x;
8643     if (x > x1) x1 = x;
8644     if (y < y0$2) y0$2 = y;
8645     if (y > y1) y1 = y;
8646   }
8647
8648   // TODO Enforce positive area for exterior, negative area for interior?
8649
8650   var X0$1 = 0,
8651       Y0$1 = 0,
8652       Z0$1 = 0,
8653       X1$1 = 0,
8654       Y1$1 = 0,
8655       Z1$1 = 0,
8656       X2$1 = 0,
8657       Y2$1 = 0,
8658       Z2$1 = 0,
8659       x00$1,
8660       y00$1,
8661       x0$3,
8662       y0$3;
8663
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;
8671     },
8672     polygonEnd: function() {
8673       centroidStream$1.point = centroidPoint$1;
8674       centroidStream$1.lineStart = centroidLineStart$1;
8675       centroidStream$1.lineEnd = centroidLineEnd$1;
8676     },
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]
8681           : [NaN, NaN];
8682       X0$1 = Y0$1 = Z0$1 =
8683       X1$1 = Y1$1 = Z1$1 =
8684       X2$1 = Y2$1 = Z2$1 = 0;
8685       return centroid;
8686     }
8687   };
8688
8689   function centroidPoint$1(x, y) {
8690     X0$1 += x;
8691     Y0$1 += y;
8692     ++Z0$1;
8693   }
8694
8695   function centroidLineStart$1() {
8696     centroidStream$1.point = centroidPointFirstLine;
8697   }
8698
8699   function centroidPointFirstLine(x, y) {
8700     centroidStream$1.point = centroidPointLine;
8701     centroidPoint$1(x0$3 = x, y0$3 = y);
8702   }
8703
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;
8708     Z1$1 += z;
8709     centroidPoint$1(x0$3 = x, y0$3 = y);
8710   }
8711
8712   function centroidLineEnd$1() {
8713     centroidStream$1.point = centroidPoint$1;
8714   }
8715
8716   function centroidRingStart$1() {
8717     centroidStream$1.point = centroidPointFirstRing;
8718   }
8719
8720   function centroidRingEnd$1() {
8721     centroidPointRing(x00$1, y00$1);
8722   }
8723
8724   function centroidPointFirstRing(x, y) {
8725     centroidStream$1.point = centroidPointRing;
8726     centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y);
8727   }
8728
8729   function centroidPointRing(x, y) {
8730     var dx = x - x0$3,
8731         dy = y - y0$3,
8732         z = sqrt(dx * dx + dy * dy);
8733
8734     X1$1 += z * (x0$3 + x) / 2;
8735     Y1$1 += z * (y0$3 + y) / 2;
8736     Z1$1 += z;
8737
8738     z = y0$3 * x - x0$3 * y;
8739     X2$1 += z * (x0$3 + x);
8740     Y2$1 += z * (y0$3 + y);
8741     Z2$1 += z * 3;
8742     centroidPoint$1(x0$3 = x, y0$3 = y);
8743   }
8744
8745   function PathContext(context) {
8746     this._context = context;
8747   }
8748
8749   PathContext.prototype = {
8750     _radius: 4.5,
8751     pointRadius: function(_) {
8752       return this._radius = _, this;
8753     },
8754     polygonStart: function() {
8755       this._line = 0;
8756     },
8757     polygonEnd: function() {
8758       this._line = NaN;
8759     },
8760     lineStart: function() {
8761       this._point = 0;
8762     },
8763     lineEnd: function() {
8764       if (this._line === 0) this._context.closePath();
8765       this._point = NaN;
8766     },
8767     point: function(x, y) {
8768       switch (this._point) {
8769         case 0: {
8770           this._context.moveTo(x, y);
8771           this._point = 1;
8772           break;
8773         }
8774         case 1: {
8775           this._context.lineTo(x, y);
8776           break;
8777         }
8778         default: {
8779           this._context.moveTo(x + this._radius, y);
8780           this._context.arc(x, y, this._radius, 0, tau$3);
8781           break;
8782         }
8783       }
8784     },
8785     result: noop$1
8786   };
8787
8788   var lengthSum$1 = adder(),
8789       lengthRing,
8790       x00$2,
8791       y00$2,
8792       x0$4,
8793       y0$4;
8794
8795   var lengthStream$1 = {
8796     point: noop$1,
8797     lineStart: function() {
8798       lengthStream$1.point = lengthPointFirst$1;
8799     },
8800     lineEnd: function() {
8801       if (lengthRing) lengthPoint$1(x00$2, y00$2);
8802       lengthStream$1.point = noop$1;
8803     },
8804     polygonStart: function() {
8805       lengthRing = true;
8806     },
8807     polygonEnd: function() {
8808       lengthRing = null;
8809     },
8810     result: function() {
8811       var length = +lengthSum$1;
8812       lengthSum$1.reset();
8813       return length;
8814     }
8815   };
8816
8817   function lengthPointFirst$1(x, y) {
8818     lengthStream$1.point = lengthPoint$1;
8819     x00$2 = x0$4 = x, y00$2 = y0$4 = y;
8820   }
8821
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));
8825     x0$4 = x, y0$4 = y;
8826   }
8827
8828   function PathString() {
8829     this._string = [];
8830   }
8831
8832   PathString.prototype = {
8833     _radius: 4.5,
8834     _circle: circle$1(4.5),
8835     pointRadius: function(_) {
8836       if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;
8837       return this;
8838     },
8839     polygonStart: function() {
8840       this._line = 0;
8841     },
8842     polygonEnd: function() {
8843       this._line = NaN;
8844     },
8845     lineStart: function() {
8846       this._point = 0;
8847     },
8848     lineEnd: function() {
8849       if (this._line === 0) this._string.push("Z");
8850       this._point = NaN;
8851     },
8852     point: function(x, y) {
8853       switch (this._point) {
8854         case 0: {
8855           this._string.push("M", x, ",", y);
8856           this._point = 1;
8857           break;
8858         }
8859         case 1: {
8860           this._string.push("L", x, ",", y);
8861           break;
8862         }
8863         default: {
8864           if (this._circle == null) this._circle = circle$1(this._radius);
8865           this._string.push("M", x, ",", y, this._circle);
8866           break;
8867         }
8868       }
8869     },
8870     result: function() {
8871       if (this._string.length) {
8872         var result = this._string.join("");
8873         this._string = [];
8874         return result;
8875       } else {
8876         return null;
8877       }
8878     }
8879   };
8880
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
8885         + "z";
8886   }
8887
8888   function d3_geoPath(projection, context) {
8889     var pointRadius = 4.5,
8890         projectionStream,
8891         contextStream;
8892
8893     function path(object) {
8894       if (object) {
8895         if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
8896         geoStream(object, projectionStream(contextStream));
8897       }
8898       return contextStream.result();
8899     }
8900
8901     path.area = function(object) {
8902       geoStream(object, projectionStream(areaStream$1));
8903       return areaStream$1.result();
8904     };
8905
8906     path.measure = function(object) {
8907       geoStream(object, projectionStream(lengthStream$1));
8908       return lengthStream$1.result();
8909     };
8910
8911     path.bounds = function(object) {
8912       geoStream(object, projectionStream(boundsStream$1));
8913       return boundsStream$1.result();
8914     };
8915
8916     path.centroid = function(object) {
8917       geoStream(object, projectionStream(centroidStream$1));
8918       return centroidStream$1.result();
8919     };
8920
8921     path.projection = function(_) {
8922       return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection;
8923     };
8924
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);
8929       return path;
8930     };
8931
8932     path.pointRadius = function(_) {
8933       if (!arguments.length) return pointRadius;
8934       pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
8935       return path;
8936     };
8937
8938     return path.projection(projection).context(context);
8939   }
8940
8941   function d3_geoTransform(methods) {
8942     return {
8943       stream: transformer(methods)
8944     };
8945   }
8946
8947   function transformer(methods) {
8948     return function(stream) {
8949       var s = new TransformStream;
8950       for (var key in methods) s[key] = methods[key];
8951       s.stream = stream;
8952       return s;
8953     };
8954   }
8955
8956   function TransformStream() {}
8957
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(); }
8966   };
8967
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);
8975     return projection;
8976   }
8977
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]);
8986     }, object);
8987   }
8988
8989   function fitSize(projection, size, object) {
8990     return fitExtent(projection, [[0, 0], size], object);
8991   }
8992
8993   function fitWidth(projection, width, object) {
8994     return fit(projection, function(b) {
8995       var w = +width,
8996           k = w / (b[1][0] - b[0][0]),
8997           x = (w - k * (b[1][0] + b[0][0])) / 2,
8998           y = -k * b[0][1];
8999       projection.scale(150 * k).translate([x, y]);
9000     }, object);
9001   }
9002
9003   function fitHeight(projection, height, object) {
9004     return fit(projection, function(b) {
9005       var h = +height,
9006           k = h / (b[1][1] - b[0][1]),
9007           x = -k * b[0][0],
9008           y = (h - k * (b[1][1] + b[0][1])) / 2;
9009       projection.scale(150 * k).translate([x, y]);
9010     }, object);
9011   }
9012
9013   var maxDepth = 16, // maximum depth of subdivision
9014       cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance)
9015
9016   function resample(project, delta2) {
9017     return +delta2 ? resample$1(project, delta2) : resampleNone(project);
9018   }
9019
9020   function resampleNone(project) {
9021     return transformer({
9022       point: function(x, y) {
9023         x = project(x, y);
9024         this.stream.point(x[0], x[1]);
9025       }
9026     });
9027   }
9028
9029   function resample$1(project, delta2) {
9030
9031     function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
9032       var dx = x1 - x0,
9033           dy = y1 - y0,
9034           d2 = dx * dx + dy * dy;
9035       if (d2 > 4 * delta2 && depth--) {
9036         var a = a0 + a1,
9037             b = b0 + b1,
9038             c = c0 + c1,
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),
9043             x2 = p[0],
9044             y2 = p[1],
9045             dx2 = x2 - x0,
9046             dy2 = y2 - y0,
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);
9054         }
9055       }
9056     }
9057     return function(stream) {
9058       var lambda00, x00, y00, a00, b00, c00, // first point
9059           lambda0, x0, y0, a0, b0, c0; // previous point
9060
9061       var resampleStream = {
9062         point: point,
9063         lineStart: lineStart,
9064         lineEnd: lineEnd,
9065         polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },
9066         polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }
9067       };
9068
9069       function point(x, y) {
9070         x = project(x, y);
9071         stream.point(x[0], x[1]);
9072       }
9073
9074       function lineStart() {
9075         x0 = NaN;
9076         resampleStream.point = linePoint;
9077         stream.lineStart();
9078       }
9079
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);
9084       }
9085
9086       function lineEnd() {
9087         resampleStream.point = point;
9088         stream.lineEnd();
9089       }
9090
9091       function ringStart() {
9092         lineStart();
9093         resampleStream.point = ringPoint;
9094         resampleStream.lineEnd = ringEnd;
9095       }
9096
9097       function ringPoint(lambda, phi) {
9098         linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
9099         resampleStream.point = linePoint;
9100       }
9101
9102       function ringEnd() {
9103         resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);
9104         resampleStream.lineEnd = lineEnd;
9105         lineEnd();
9106       }
9107
9108       return resampleStream;
9109     };
9110   }
9111
9112   var transformRadians = transformer({
9113     point: function(x, y) {
9114       this.stream.point(x * radians, y * radians);
9115     }
9116   });
9117
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]);
9123       }
9124     });
9125   }
9126
9127   function projection(project) {
9128     return projectionMutator(function() { return project; })();
9129   }
9130
9131   function projectionMutator(projectAt) {
9132     var project,
9133         k = 150, // scale
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
9140         cache,
9141         cacheStream;
9142
9143     function projection(point) {
9144       point = projectRotate(point[0] * radians, point[1] * radians);
9145       return [point[0] * k + dx, dy - point[1] * k];
9146     }
9147
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];
9151     }
9152
9153     function projectTransform(x, y) {
9154       return x = project(x, y), [x[0] * k + dx, dy - x[1] * k];
9155     }
9156
9157     projection.stream = function(stream) {
9158       return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
9159     };
9160
9161     projection.preclip = function(_) {
9162       return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;
9163     };
9164
9165     projection.postclip = function(_) {
9166       return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9167     };
9168
9169     projection.clipAngle = function(_) {
9170       return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1;
9171     };
9172
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]];
9175     };
9176
9177     projection.scale = function(_) {
9178       return arguments.length ? (k = +_, recenter()) : k;
9179     };
9180
9181     projection.translate = function(_) {
9182       return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
9183     };
9184
9185     projection.center = function(_) {
9186       return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1];
9187     };
9188
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];
9191     };
9192
9193     projection.precision = function(_) {
9194       return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
9195     };
9196
9197     projection.fitExtent = function(extent, object) {
9198       return fitExtent(projection, extent, object);
9199     };
9200
9201     projection.fitSize = function(size, object) {
9202       return fitSize(projection, size, object);
9203     };
9204
9205     projection.fitWidth = function(width, object) {
9206       return fitWidth(projection, width, object);
9207     };
9208
9209     projection.fitHeight = function(height, object) {
9210       return fitHeight(projection, height, object);
9211     };
9212
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;
9218       return reset();
9219     }
9220
9221     function reset() {
9222       cache = cacheStream = null;
9223       return projection;
9224     }
9225
9226     return function() {
9227       project = projectAt.apply(this, arguments);
9228       projection.invert = project.invert && invert;
9229       return recenter();
9230     };
9231   }
9232
9233   function conicProjection(projectAt) {
9234     var phi0 = 0,
9235         phi1 = pi$3 / 3,
9236         m = projectionMutator(projectAt),
9237         p = m(phi0, phi1);
9238
9239     p.parallels = function(_) {
9240       return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1];
9241     };
9242
9243     return p;
9244   }
9245
9246   function cylindricalEqualAreaRaw(phi0) {
9247     var cosPhi0 = cos$1(phi0);
9248
9249     function forward(lambda, phi) {
9250       return [lambda * cosPhi0, sin$1(phi) / cosPhi0];
9251     }
9252
9253     forward.invert = function(x, y) {
9254       return [x / cosPhi0, asin(y * cosPhi0)];
9255     };
9256
9257     return forward;
9258   }
9259
9260   function conicEqualAreaRaw(y0, y1) {
9261     var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2;
9262
9263     // Are the parallels symmetrical around the Equator?
9264     if (abs(n) < epsilon$2) return cylindricalEqualAreaRaw(y0);
9265
9266     var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;
9267
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)];
9271     }
9272
9273     project.invert = function(x, y) {
9274       var r0y = r0 - y;
9275       return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];
9276     };
9277
9278     return project;
9279   }
9280
9281   function conicEqualArea() {
9282     return conicProjection(conicEqualAreaRaw)
9283         .scale(155.424)
9284         .center([0, 33.6442]);
9285   }
9286
9287   function albers() {
9288     return conicEqualArea()
9289         .parallels([29.5, 45.5])
9290         .scale(1070)
9291         .translate([480, 250])
9292         .rotate([96, 0])
9293         .center([-0.6, 38.7]);
9294   }
9295
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;
9300     return {
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(); }
9307     };
9308   }
9309
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() {
9316     var cache,
9317         cacheStream,
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]; }};
9322
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);
9329     }
9330
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);
9339     };
9340
9341     albersUsa.stream = function(stream) {
9342       return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
9343     };
9344
9345     albersUsa.precision = function(_) {
9346       if (!arguments.length) return lower48.precision();
9347       lower48.precision(_), alaska.precision(_), hawaii.precision(_);
9348       return reset();
9349     };
9350
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());
9355     };
9356
9357     albersUsa.translate = function(_) {
9358       if (!arguments.length) return lower48.translate();
9359       var k = lower48.scale(), x = +_[0], y = +_[1];
9360
9361       lower48Point = lower48
9362           .translate(_)
9363           .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
9364           .stream(pointStream);
9365
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);
9370
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);
9375
9376       return reset();
9377     };
9378
9379     albersUsa.fitExtent = function(extent, object) {
9380       return fitExtent(albersUsa, extent, object);
9381     };
9382
9383     albersUsa.fitSize = function(size, object) {
9384       return fitSize(albersUsa, size, object);
9385     };
9386
9387     albersUsa.fitWidth = function(width, object) {
9388       return fitWidth(albersUsa, width, object);
9389     };
9390
9391     albersUsa.fitHeight = function(height, object) {
9392       return fitHeight(albersUsa, height, object);
9393     };
9394
9395     function reset() {
9396       cache = cacheStream = null;
9397       return albersUsa;
9398     }
9399
9400     return albersUsa.scale(1070);
9401   }
9402
9403   function azimuthalRaw(scale) {
9404     return function(x, y) {
9405       var cx = cos$1(x),
9406           cy = cos$1(y),
9407           k = scale(cx * cy);
9408       return [
9409         k * cy * sin$1(x),
9410         k * sin$1(y)
9411       ];
9412     }
9413   }
9414
9415   function azimuthalInvert(angle) {
9416     return function(x, y) {
9417       var z = sqrt(x * x + y * y),
9418           c = angle(z),
9419           sc = sin$1(c),
9420           cc = cos$1(c);
9421       return [
9422         atan2(x * sc, z * cc),
9423         asin(z && y * sc / z)
9424       ];
9425     }
9426   }
9427
9428   var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
9429     return sqrt(2 / (1 + cxcy));
9430   });
9431
9432   azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
9433     return 2 * asin(z / 2);
9434   });
9435
9436   function azimuthalEqualArea() {
9437     return projection(azimuthalEqualAreaRaw)
9438         .scale(124.75)
9439         .clipAngle(180 - 1e-3);
9440   }
9441
9442   var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
9443     return (c = acos(c)) && c / sin$1(c);
9444   });
9445
9446   azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
9447     return z;
9448   });
9449
9450   function azimuthalEquidistant() {
9451     return projection(azimuthalEquidistantRaw)
9452         .scale(79.4188)
9453         .clipAngle(180 - 1e-3);
9454   }
9455
9456   function mercatorRaw(lambda, phi) {
9457     return [lambda, log(tan((halfPi$2 + phi) / 2))];
9458   }
9459
9460   mercatorRaw.invert = function(x, y) {
9461     return [x, 2 * atan(exp(y)) - halfPi$2];
9462   };
9463
9464   function mercator() {
9465     return mercatorProjection(mercatorRaw)
9466         .scale(961 / tau$3);
9467   }
9468
9469   function mercatorProjection(project) {
9470     var m = projection(project),
9471         center = m.center,
9472         scale = m.scale,
9473         translate = m.translate,
9474         clipExtent = m.clipExtent,
9475         x0 = null, y0, x1, y1; // clip extent
9476
9477     m.scale = function(_) {
9478       return arguments.length ? (scale(_), reclip()) : scale();
9479     };
9480
9481     m.translate = function(_) {
9482       return arguments.length ? (translate(_), reclip()) : translate();
9483     };
9484
9485     m.center = function(_) {
9486       return arguments.length ? (center(_), reclip()) : center();
9487     };
9488
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]];
9491     };
9492
9493     function reclip() {
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)]]);
9500     }
9501
9502     return reclip();
9503   }
9504
9505   function tany(y) {
9506     return tan((halfPi$2 + y) / 2);
9507   }
9508
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;
9513
9514     if (!n) return mercatorRaw;
9515
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)];
9521     }
9522
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];
9526     };
9527
9528     return project;
9529   }
9530
9531   function conicConformal() {
9532     return conicProjection(conicConformalRaw)
9533         .scale(109.5)
9534         .parallels([30, 30]);
9535   }
9536
9537   function equirectangularRaw(lambda, phi) {
9538     return [lambda, phi];
9539   }
9540
9541   equirectangularRaw.invert = equirectangularRaw;
9542
9543   function equirectangular() {
9544     return projection(equirectangularRaw)
9545         .scale(152.63);
9546   }
9547
9548   function conicEquidistantRaw(y0, y1) {
9549     var cy0 = cos$1(y0),
9550         n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0),
9551         g = cy0 / n + y0;
9552
9553     if (abs(n) < epsilon$2) return equirectangularRaw;
9554
9555     function project(x, y) {
9556       var gy = g - y, nx = n * x;
9557       return [gy * sin$1(nx), g - gy * cos$1(nx)];
9558     }
9559
9560     project.invert = function(x, y) {
9561       var gy = g - y;
9562       return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)];
9563     };
9564
9565     return project;
9566   }
9567
9568   function conicEquidistant() {
9569     return conicProjection(conicEquidistantRaw)
9570         .scale(131.154)
9571         .center([0, 13.9389]);
9572   }
9573
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];
9577   }
9578
9579   gnomonicRaw.invert = azimuthalInvert(atan);
9580
9581   function gnomonic() {
9582     return projection(gnomonicRaw)
9583         .scale(144.049)
9584         .clipAngle(60);
9585   }
9586
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);
9591       }
9592     });
9593   }
9594
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,
9599         cache,
9600         cacheStream,
9601         projection;
9602
9603     function reset() {
9604       cache = cacheStream = null;
9605       return projection;
9606     }
9607
9608     return projection = {
9609       stream: function(stream) {
9610         return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
9611       },
9612       postclip: function(_) {
9613         return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9614       },
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]];
9617       },
9618       scale: function(_) {
9619         return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k;
9620       },
9621       translate: function(_) {
9622         return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
9623       },
9624       reflectX: function(_) {
9625         return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
9626       },
9627       reflectY: function(_) {
9628         return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
9629       },
9630       fitExtent: function(extent, object) {
9631         return fitExtent(projection, extent, object);
9632       },
9633       fitSize: function(size, object) {
9634         return fitSize(projection, size, object);
9635       },
9636       fitWidth: function(width, object) {
9637         return fitWidth(projection, width, object);
9638       },
9639       fitHeight: function(height, object) {
9640         return fitHeight(projection, height, object);
9641       }
9642     };
9643   }
9644
9645   function naturalEarth1Raw(lambda, phi) {
9646     var phi2 = phi * phi, phi4 = phi2 * phi2;
9647     return [
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)))
9650     ];
9651   }
9652
9653   naturalEarth1Raw.invert = function(x, y) {
9654     var phi = y, i = 25, delta;
9655     do {
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);
9660     return [
9661       x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
9662       phi
9663     ];
9664   };
9665
9666   function naturalEarth1() {
9667     return projection(naturalEarth1Raw)
9668         .scale(175.295);
9669   }
9670
9671   function orthographicRaw(x, y) {
9672     return [cos$1(y) * sin$1(x), sin$1(y)];
9673   }
9674
9675   orthographicRaw.invert = azimuthalInvert(asin);
9676
9677   function orthographic() {
9678     return projection(orthographicRaw)
9679         .scale(249.5)
9680         .clipAngle(90 + epsilon$2);
9681   }
9682
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];
9686   }
9687
9688   stereographicRaw.invert = azimuthalInvert(function(z) {
9689     return 2 * atan(z);
9690   });
9691
9692   function stereographic() {
9693     return projection(stereographicRaw)
9694         .scale(250)
9695         .clipAngle(142);
9696   }
9697
9698   function transverseMercatorRaw(lambda, phi) {
9699     return [log(tan((halfPi$2 + phi) / 2)), -lambda];
9700   }
9701
9702   transverseMercatorRaw.invert = function(x, y) {
9703     return [-y, 2 * atan(exp(x)) - halfPi$2];
9704   };
9705
9706   function transverseMercator() {
9707     var m = mercatorProjection(transverseMercatorRaw),
9708         center = m.center,
9709         rotate = m.rotate;
9710
9711     m.center = function(_) {
9712       return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
9713     };
9714
9715     m.rotate = function(_) {
9716       return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
9717     };
9718
9719     return rotate([0, 0, 90])
9720         .scale(159.155);
9721   }
9722
9723   function defaultSeparation(a, b) {
9724     return a.parent === b.parent ? 1 : 2;
9725   }
9726
9727   function meanX(children) {
9728     return children.reduce(meanXReduce, 0) / children.length;
9729   }
9730
9731   function meanXReduce(x, c) {
9732     return x + c.x;
9733   }
9734
9735   function maxY(children) {
9736     return 1 + children.reduce(maxYReduce, 0);
9737   }
9738
9739   function maxYReduce(y, c) {
9740     return Math.max(y, c.y);
9741   }
9742
9743   function leafLeft(node) {
9744     var children;
9745     while (children = node.children) node = children[0];
9746     return node;
9747   }
9748
9749   function leafRight(node) {
9750     var children;
9751     while (children = node.children) node = children[children.length - 1];
9752     return node;
9753   }
9754
9755   function cluster() {
9756     var separation = defaultSeparation,
9757         dx = 1,
9758         dy = 1,
9759         nodeSize = false;
9760
9761     function cluster(root) {
9762       var previousNode,
9763           x = 0;
9764
9765       // First walk, computing the initial x & y values.
9766       root.eachAfter(function(node) {
9767         var children = node.children;
9768         if (children) {
9769           node.x = meanX(children);
9770           node.y = maxY(children);
9771         } else {
9772           node.x = previousNode ? x += separation(node, previousNode) : 0;
9773           node.y = 0;
9774           previousNode = node;
9775         }
9776       });
9777
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;
9782
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;
9790       });
9791     }
9792
9793     cluster.separation = function(x) {
9794       return arguments.length ? (separation = x, cluster) : separation;
9795     };
9796
9797     cluster.size = function(x) {
9798       return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
9799     };
9800
9801     cluster.nodeSize = function(x) {
9802       return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
9803     };
9804
9805     return cluster;
9806   }
9807
9808   function count(node) {
9809     var sum = 0,
9810         children = node.children,
9811         i = children && children.length;
9812     if (!i) sum = 1;
9813     else while (--i >= 0) sum += children[i].value;
9814     node.value = sum;
9815   }
9816
9817   function node_count() {
9818     return this.eachAfter(count);
9819   }
9820
9821   function node_each(callback) {
9822     var node = this, current, next = [node], children, i, n;
9823     do {
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]);
9829         }
9830       }
9831     } while (next.length);
9832     return this;
9833   }
9834
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]);
9841       }
9842     }
9843     return this;
9844   }
9845
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]);
9852       }
9853     }
9854     while (node = next.pop()) {
9855       callback(node);
9856     }
9857     return this;
9858   }
9859
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;
9866       node.value = sum;
9867     });
9868   }
9869
9870   function node_sort(compare) {
9871     return this.eachBefore(function(node) {
9872       if (node.children) {
9873         node.children.sort(compare);
9874       }
9875     });
9876   }
9877
9878   function node_path(end) {
9879     var start = this,
9880         ancestor = leastCommonAncestor(start, end),
9881         nodes = [start];
9882     while (start !== ancestor) {
9883       start = start.parent;
9884       nodes.push(start);
9885     }
9886     var k = nodes.length;
9887     while (end !== ancestor) {
9888       nodes.splice(k, 0, end);
9889       end = end.parent;
9890     }
9891     return nodes;
9892   }
9893
9894   function leastCommonAncestor(a, b) {
9895     if (a === b) return a;
9896     var aNodes = a.ancestors(),
9897         bNodes = b.ancestors(),
9898         c = null;
9899     a = aNodes.pop();
9900     b = bNodes.pop();
9901     while (a === b) {
9902       c = a;
9903       a = aNodes.pop();
9904       b = bNodes.pop();
9905     }
9906     return c;
9907   }
9908
9909   function node_ancestors() {
9910     var node = this, nodes = [node];
9911     while (node = node.parent) {
9912       nodes.push(node);
9913     }
9914     return nodes;
9915   }
9916
9917   function node_descendants() {
9918     var nodes = [];
9919     this.each(function(node) {
9920       nodes.push(node);
9921     });
9922     return nodes;
9923   }
9924
9925   function node_leaves() {
9926     var leaves = [];
9927     this.eachBefore(function(node) {
9928       if (!node.children) {
9929         leaves.push(node);
9930       }
9931     });
9932     return leaves;
9933   }
9934
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});
9940       }
9941     });
9942     return links;
9943   }
9944
9945   function hierarchy(data, children) {
9946     var root = new Node(data),
9947         valued = +data.value && (root.value = data.value),
9948         node,
9949         nodes = [root],
9950         child,
9951         childs,
9952         i,
9953         n;
9954
9955     if (children == null) children = defaultChildren;
9956
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;
9965         }
9966       }
9967     }
9968
9969     return root.eachBefore(computeHeight);
9970   }
9971
9972   function node_copy() {
9973     return hierarchy(this).eachBefore(copyData);
9974   }
9975
9976   function defaultChildren(d) {
9977     return d.children;
9978   }
9979
9980   function copyData(node) {
9981     node.data = node.data.data;
9982   }
9983
9984   function computeHeight(node) {
9985     var height = 0;
9986     do node.height = height;
9987     while ((node = node.parent) && (node.height < ++height));
9988   }
9989
9990   function Node(data) {
9991     this.data = data;
9992     this.depth =
9993     this.height = 0;
9994     this.parent = null;
9995   }
9996
9997   Node.prototype = hierarchy.prototype = {
9998     constructor: Node,
9999     count: node_count,
10000     each: node_each,
10001     eachAfter: node_eachAfter,
10002     eachBefore: node_eachBefore,
10003     sum: node_sum,
10004     sort: node_sort,
10005     path: node_path,
10006     ancestors: node_ancestors,
10007     descendants: node_descendants,
10008     leaves: node_leaves,
10009     links: node_links,
10010     copy: node_copy
10011   };
10012
10013   var slice$3 = Array.prototype.slice;
10014
10015   function shuffle$1(array) {
10016     var m = array.length,
10017         t,
10018         i;
10019
10020     while (m) {
10021       i = Math.random() * m-- | 0;
10022       t = array[m];
10023       array[m] = array[i];
10024       array[i] = t;
10025     }
10026
10027     return array;
10028   }
10029
10030   function enclose(circles) {
10031     var i = 0, n = (circles = shuffle$1(slice$3.call(circles))).length, B = [], p, e;
10032
10033     while (i < n) {
10034       p = circles[i];
10035       if (e && enclosesWeak(e, p)) ++i;
10036       else e = encloseBasis(B = extendBasis(B, p)), i = 0;
10037     }
10038
10039     return e;
10040   }
10041
10042   function extendBasis(B, p) {
10043     var i, j;
10044
10045     if (enclosesWeakAll(p, B)) return [p];
10046
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)) {
10051         return [B[i], p];
10052       }
10053     }
10054
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];
10063         }
10064       }
10065     }
10066
10067     // If we get here then something is very wrong.
10068     throw new Error;
10069   }
10070
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;
10074   }
10075
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;
10079   }
10080
10081   function enclosesWeakAll(a, B) {
10082     for (var i = 0; i < B.length; ++i) {
10083       if (!enclosesWeak(a, B[i])) {
10084         return false;
10085       }
10086     }
10087     return true;
10088   }
10089
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]);
10095     }
10096   }
10097
10098   function encloseBasis1(a) {
10099     return {
10100       x: a.x,
10101       y: a.y,
10102       r: a.r
10103     };
10104   }
10105
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);
10111     return {
10112       x: (x1 + x2 + x21 / l * r21) / 2,
10113       y: (y1 + y2 + y21 / l * r21) / 2,
10114       r: (l + r1 + r2) / 2
10115     };
10116   }
10117
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,
10122         a2 = x1 - x2,
10123         a3 = x1 - x3,
10124         b2 = y1 - y2,
10125         b3 = y1 - y3,
10126         c2 = r2 - r1,
10127         c3 = r3 - r1,
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);
10140     return {
10141       x: x1 + xa + xb * r,
10142       y: y1 + ya + yb * r,
10143       r: r
10144     };
10145   }
10146
10147   function place(a, b, c) {
10148     var ax = a.x,
10149         ay = a.y,
10150         da = b.r + c.r,
10151         db = a.r + c.r,
10152         dx = b.x - ax,
10153         dy = b.y - ay,
10154         dc = dx * dx + dy * dy;
10155     if (dc) {
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;
10160     } else {
10161       c.x = ax + db;
10162       c.y = ay;
10163     }
10164   }
10165
10166   function intersects(a, b) {
10167     var dx = b.x - a.x,
10168         dy = b.y - a.y,
10169         dr = a.r + b.r;
10170     return dr * dr - 1e-6 > dx * dx + dy * dy;
10171   }
10172
10173   function score(node) {
10174     var a = node._,
10175         b = node.next._,
10176         ab = a.r + b.r,
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;
10180   }
10181
10182   function Node$1(circle) {
10183     this._ = circle;
10184     this.next = null;
10185     this.previous = null;
10186   }
10187
10188   function packEnclose(circles) {
10189     if (!(n = circles.length)) return 0;
10190
10191     var a, b, c, n, aa, ca, i, j, k, sj, sk;
10192
10193     // Place the first circle.
10194     a = circles[0], a.x = 0, a.y = 0;
10195     if (!(n > 1)) return a.r;
10196
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;
10200
10201     // Place the third circle.
10202     place(b, a, c = circles[2]);
10203
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;
10209
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);
10213
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;
10218       do {
10219         if (sj <= sk) {
10220           if (intersects(j._, c._)) {
10221             b = j, a.next = b, b.previous = a, --i;
10222             continue pack;
10223           }
10224           sj += j._.r, j = j.next;
10225         } else {
10226           if (intersects(k._, c._)) {
10227             a = k, a.next = b, b.previous = a, --i;
10228             continue pack;
10229           }
10230           sk += k._.r, k = k.previous;
10231         }
10232       } while (j !== k.next);
10233
10234       // Success! Insert the new circle c between a and b.
10235       c.previous = a, c.next = b, a.next = b.previous = b = c;
10236
10237       // Compute the new closest circle pair to the centroid.
10238       aa = score(a);
10239       while ((c = c.next) !== b) {
10240         if ((ca = score(c)) < aa) {
10241           a = c, aa = ca;
10242         }
10243       }
10244       b = a.next;
10245     }
10246
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);
10249
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;
10252
10253     return c.r;
10254   }
10255
10256   function siblings(circles) {
10257     packEnclose(circles);
10258     return circles;
10259   }
10260
10261   function optional(f) {
10262     return f == null ? null : required(f);
10263   }
10264
10265   function required(f) {
10266     if (typeof f !== "function") throw new Error;
10267     return f;
10268   }
10269
10270   function constantZero() {
10271     return 0;
10272   }
10273
10274   function constant$8(x) {
10275     return function() {
10276       return x;
10277     };
10278   }
10279
10280   function defaultRadius$1(d) {
10281     return Math.sqrt(d.value);
10282   }
10283
10284   function index$1() {
10285     var radius = null,
10286         dx = 1,
10287         dy = 1,
10288         padding = constantZero;
10289
10290     function pack(root) {
10291       root.x = dx / 2, root.y = dy / 2;
10292       if (radius) {
10293         root.eachBefore(radiusLeaf(radius))
10294             .eachAfter(packChildren(padding, 0.5))
10295             .eachBefore(translateChild(1));
10296       } else {
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)));
10301       }
10302       return root;
10303     }
10304
10305     pack.radius = function(x) {
10306       return arguments.length ? (radius = optional(x), pack) : radius;
10307     };
10308
10309     pack.size = function(x) {
10310       return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
10311     };
10312
10313     pack.padding = function(x) {
10314       return arguments.length ? (padding = typeof x === "function" ? x : constant$8(+x), pack) : padding;
10315     };
10316
10317     return pack;
10318   }
10319
10320   function radiusLeaf(radius) {
10321     return function(node) {
10322       if (!node.children) {
10323         node.r = Math.max(0, +radius(node) || 0);
10324       }
10325     };
10326   }
10327
10328   function packChildren(padding, k) {
10329     return function(node) {
10330       if (children = node.children) {
10331         var children,
10332             i,
10333             n = children.length,
10334             r = padding(node) * k || 0,
10335             e;
10336
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;
10340         node.r = e + r;
10341       }
10342     };
10343   }
10344
10345   function translateChild(k) {
10346     return function(node) {
10347       var parent = node.parent;
10348       node.r *= k;
10349       if (parent) {
10350         node.x = parent.x + k * node.x;
10351         node.y = parent.y + k * node.y;
10352       }
10353     };
10354   }
10355
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);
10361   }
10362
10363   function treemapDice(parent, x0, y0, x1, y1) {
10364     var nodes = parent.children,
10365         node,
10366         i = -1,
10367         n = nodes.length,
10368         k = parent.value && (x1 - x0) / parent.value;
10369
10370     while (++i < n) {
10371       node = nodes[i], node.y0 = y0, node.y1 = y1;
10372       node.x0 = x0, node.x1 = x0 += node.value * k;
10373     }
10374   }
10375
10376   function partition() {
10377     var dx = 1,
10378         dy = 1,
10379         padding = 0,
10380         round = false;
10381
10382     function partition(root) {
10383       var n = root.height + 1;
10384       root.x0 =
10385       root.y0 = padding;
10386       root.x1 = dx;
10387       root.y1 = dy / n;
10388       root.eachBefore(positionNode(dy, n));
10389       if (round) root.eachBefore(roundNode);
10390       return root;
10391     }
10392
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);
10397         }
10398         var x0 = node.x0,
10399             y0 = node.y0,
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;
10404         node.x0 = x0;
10405         node.y0 = y0;
10406         node.x1 = x1;
10407         node.y1 = y1;
10408       };
10409     }
10410
10411     partition.round = function(x) {
10412       return arguments.length ? (round = !!x, partition) : round;
10413     };
10414
10415     partition.size = function(x) {
10416       return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
10417     };
10418
10419     partition.padding = function(x) {
10420       return arguments.length ? (padding = +x, partition) : padding;
10421     };
10422
10423     return partition;
10424   }
10425
10426   var keyPrefix$1 = "$", // Protect against keys like “__proto__”.
10427       preroot = {depth: -1},
10428       ambiguous = {};
10429
10430   function defaultId(d) {
10431     return d.id;
10432   }
10433
10434   function defaultParentId(d) {
10435     return d.parentId;
10436   }
10437
10438   function stratify() {
10439     var id = defaultId,
10440         parentId = defaultParentId;
10441
10442     function stratify(data) {
10443       var d,
10444           i,
10445           n = data.length,
10446           root,
10447           parent,
10448           node,
10449           nodes = new Array(n),
10450           nodeId,
10451           nodeKey,
10452           nodeByKey = {};
10453
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;
10459         }
10460       }
10461
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");
10466           root = node;
10467         } else {
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;
10474         }
10475       }
10476
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");
10482
10483       return root;
10484     }
10485
10486     stratify.id = function(x) {
10487       return arguments.length ? (id = required(x), stratify) : id;
10488     };
10489
10490     stratify.parentId = function(x) {
10491       return arguments.length ? (parentId = required(x), stratify) : parentId;
10492     };
10493
10494     return stratify;
10495   }
10496
10497   function defaultSeparation$1(a, b) {
10498     return a.parent === b.parent ? 1 : 2;
10499   }
10500
10501   // function radialSeparation(a, b) {
10502   //   return (a.parent === b.parent ? 1 : 2) / a.depth;
10503   // }
10504
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;
10512   }
10513
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;
10518   }
10519
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);
10524     wp.c -= change;
10525     wp.s += shift;
10526     wm.c += change;
10527     wp.z += shift;
10528     wp.m += shift;
10529   }
10530
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) {
10535     var shift = 0,
10536         change = 0,
10537         children = v.children,
10538         i = children.length,
10539         w;
10540     while (--i >= 0) {
10541       w = children[i];
10542       w.z += shift;
10543       w.m += shift;
10544       shift += w.s + (change += w.c);
10545     }
10546   }
10547
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;
10552   }
10553
10554   function TreeNode(node, i) {
10555     this._ = node;
10556     this.parent = null;
10557     this.children = null;
10558     this.A = null; // default ancestor
10559     this.a = this; // ancestor
10560     this.z = 0; // prelim
10561     this.m = 0; // mod
10562     this.c = 0; // change
10563     this.s = 0; // shift
10564     this.t = null; // thread
10565     this.i = i; // number
10566   }
10567
10568   TreeNode.prototype = Object.create(Node.prototype);
10569
10570   function treeRoot(root) {
10571     var tree = new TreeNode(root, 0),
10572         node,
10573         nodes = [tree],
10574         child,
10575         children,
10576         i,
10577         n;
10578
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;
10585         }
10586       }
10587     }
10588
10589     (tree.parent = new TreeNode(null, 0)).children = [tree];
10590     return tree;
10591   }
10592
10593   // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
10594   function tree() {
10595     var separation = defaultSeparation$1,
10596         dx = 1,
10597         dy = 1,
10598         nodeSize = null;
10599
10600     function tree(root) {
10601       var t = treeRoot(root);
10602
10603       // Compute the layout using Buchheim et al.’s algorithm.
10604       t.eachAfter(firstWalk), t.parent.m = -t.z;
10605       t.eachBefore(secondWalk);
10606
10607       // If a fixed node size is specified, scale x and y.
10608       if (nodeSize) root.eachBefore(sizeNode);
10609
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.
10612       else {
10613         var left = root,
10614             right = root,
10615             bottom = root;
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;
10620         });
10621         var s = left === right ? 1 : separation(left, right) / 2,
10622             tx = s - left.x,
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;
10628         });
10629       }
10630
10631       return root;
10632     }
10633
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;
10642       if (children) {
10643         executeShifts(v);
10644         var midpoint = (children[0].z + children[children.length - 1].z) / 2;
10645         if (w) {
10646           v.z = w.z + separation(v._, w._);
10647           v.m = v.z - midpoint;
10648         } else {
10649           v.z = midpoint;
10650         }
10651       } else if (w) {
10652         v.z = w.z + separation(v._, w._);
10653       }
10654       v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
10655     }
10656
10657     // Computes all real x-coordinates by summing up the modifiers recursively.
10658     function secondWalk(v) {
10659       v._.x = v.z + v.parent.m;
10660       v.m += v.parent.m;
10661     }
10662
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) {
10675       if (w) {
10676         var vip = v,
10677             vop = v,
10678             vim = w,
10679             vom = vip.parent.children[0],
10680             sip = vip.m,
10681             sop = vop.m,
10682             sim = vim.m,
10683             som = vom.m,
10684             shift;
10685         while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
10686           vom = nextLeft(vom);
10687           vop = nextRight(vop);
10688           vop.a = v;
10689           shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
10690           if (shift > 0) {
10691             moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
10692             sip += shift;
10693             sop += shift;
10694           }
10695           sim += vim.m;
10696           sip += vip.m;
10697           som += vom.m;
10698           sop += vop.m;
10699         }
10700         if (vim && !nextRight(vop)) {
10701           vop.t = vim;
10702           vop.m += sim - sop;
10703         }
10704         if (vip && !nextLeft(vom)) {
10705           vom.t = vip;
10706           vom.m += sip - som;
10707           ancestor = v;
10708         }
10709       }
10710       return ancestor;
10711     }
10712
10713     function sizeNode(node) {
10714       node.x *= dx;
10715       node.y = node.depth * dy;
10716     }
10717
10718     tree.separation = function(x) {
10719       return arguments.length ? (separation = x, tree) : separation;
10720     };
10721
10722     tree.size = function(x) {
10723       return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
10724     };
10725
10726     tree.nodeSize = function(x) {
10727       return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
10728     };
10729
10730     return tree;
10731   }
10732
10733   function treemapSlice(parent, x0, y0, x1, y1) {
10734     var nodes = parent.children,
10735         node,
10736         i = -1,
10737         n = nodes.length,
10738         k = parent.value && (y1 - y0) / parent.value;
10739
10740     while (++i < n) {
10741       node = nodes[i], node.x0 = x0, node.x1 = x1;
10742       node.y0 = y0, node.y1 = y0 += node.value * k;
10743     }
10744   }
10745
10746   var phi = (1 + Math.sqrt(5)) / 2;
10747
10748   function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
10749     var rows = [],
10750         nodes = parent.children,
10751         row,
10752         nodeValue,
10753         i0 = 0,
10754         i1 = 0,
10755         n = nodes.length,
10756         dx, dy,
10757         value = parent.value,
10758         sumValue,
10759         minValue,
10760         maxValue,
10761         newRatio,
10762         minRatio,
10763         alpha,
10764         beta;
10765
10766     while (i0 < n) {
10767       dx = x1 - x0, dy = y1 - y0;
10768
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);
10775
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;
10785       }
10786
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;
10792     }
10793
10794     return rows;
10795   }
10796
10797   var squarify = (function custom(ratio) {
10798
10799     function squarify(parent, x0, y0, x1, y1) {
10800       squarifyRatio(ratio, parent, x0, y0, x1, y1);
10801     }
10802
10803     squarify.ratio = function(x) {
10804       return custom((x = +x) > 1 ? x : 1);
10805     };
10806
10807     return squarify;
10808   })(phi);
10809
10810   function index$2() {
10811     var tile = squarify,
10812         round = false,
10813         dx = 1,
10814         dy = 1,
10815         paddingStack = [0],
10816         paddingInner = constantZero,
10817         paddingTop = constantZero,
10818         paddingRight = constantZero,
10819         paddingBottom = constantZero,
10820         paddingLeft = constantZero;
10821
10822     function treemap(root) {
10823       root.x0 =
10824       root.y0 = 0;
10825       root.x1 = dx;
10826       root.y1 = dy;
10827       root.eachBefore(positionNode);
10828       paddingStack = [0];
10829       if (round) root.eachBefore(roundNode);
10830       return root;
10831     }
10832
10833     function positionNode(node) {
10834       var p = paddingStack[node.depth],
10835           x0 = node.x0 + p,
10836           y0 = node.y0 + p,
10837           x1 = node.x1 - p,
10838           y1 = node.y1 - p;
10839       if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10840       if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10841       node.x0 = x0;
10842       node.y0 = y0;
10843       node.x1 = x1;
10844       node.y1 = y1;
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);
10854       }
10855     }
10856
10857     treemap.round = function(x) {
10858       return arguments.length ? (round = !!x, treemap) : round;
10859     };
10860
10861     treemap.size = function(x) {
10862       return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
10863     };
10864
10865     treemap.tile = function(x) {
10866       return arguments.length ? (tile = required(x), treemap) : tile;
10867     };
10868
10869     treemap.padding = function(x) {
10870       return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
10871     };
10872
10873     treemap.paddingInner = function(x) {
10874       return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$8(+x), treemap) : paddingInner;
10875     };
10876
10877     treemap.paddingOuter = function(x) {
10878       return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
10879     };
10880
10881     treemap.paddingTop = function(x) {
10882       return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$8(+x), treemap) : paddingTop;
10883     };
10884
10885     treemap.paddingRight = function(x) {
10886       return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$8(+x), treemap) : paddingRight;
10887     };
10888
10889     treemap.paddingBottom = function(x) {
10890       return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$8(+x), treemap) : paddingBottom;
10891     };
10892
10893     treemap.paddingLeft = function(x) {
10894       return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$8(+x), treemap) : paddingLeft;
10895     };
10896
10897     return treemap;
10898   }
10899
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);
10904
10905     for (sums[0] = sum = i = 0; i < n; ++i) {
10906       sums[i + 1] = sum += nodes[i].value;
10907     }
10908
10909     partition(0, n, parent.value, x0, y0, x1, y1);
10910
10911     function partition(i, j, value, x0, y0, x1, y1) {
10912       if (i >= j - 1) {
10913         var node = nodes[i];
10914         node.x0 = x0, node.y0 = y0;
10915         node.x1 = x1, node.y1 = y1;
10916         return;
10917       }
10918
10919       var valueOffset = sums[i],
10920           valueTarget = (value / 2) + valueOffset,
10921           k = i + 1,
10922           hi = j - 1;
10923
10924       while (k < hi) {
10925         var mid = k + hi >>> 1;
10926         if (sums[mid] < valueTarget) k = mid + 1;
10927         else hi = mid;
10928       }
10929
10930       if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
10931
10932       var valueLeft = sums[k] - valueOffset,
10933           valueRight = value - valueLeft;
10934
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);
10939       } else {
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);
10943       }
10944     }
10945   }
10946
10947   function sliceDice(parent, x0, y0, x1, y1) {
10948     (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
10949   }
10950
10951   var resquarify = (function custom(ratio) {
10952
10953     function resquarify(parent, x0, y0, x1, y1) {
10954       if ((rows = parent._squarify) && (rows.ratio === ratio)) {
10955         var rows,
10956             row,
10957             nodes,
10958             i,
10959             j = -1,
10960             n,
10961             m = rows.length,
10962             value = parent.value;
10963
10964         while (++j < m) {
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;
10970         }
10971       } else {
10972         parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
10973         rows.ratio = ratio;
10974       }
10975     }
10976
10977     resquarify.ratio = function(x) {
10978       return custom((x = +x) > 1 ? x : 1);
10979     };
10980
10981     return resquarify;
10982   })(phi);
10983
10984   function d3_polygonArea(polygon) {
10985     var i = -1,
10986         n = polygon.length,
10987         a,
10988         b = polygon[n - 1],
10989         area = 0;
10990
10991     while (++i < n) {
10992       a = b;
10993       b = polygon[i];
10994       area += a[1] * b[0] - a[0] * b[1];
10995     }
10996
10997     return area / 2;
10998   }
10999
11000   function d3_polygonCentroid(polygon) {
11001     var i = -1,
11002         n = polygon.length,
11003         x = 0,
11004         y = 0,
11005         a,
11006         b = polygon[n - 1],
11007         c,
11008         k = 0;
11009
11010     while (++i < n) {
11011       a = b;
11012       b = polygon[i];
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;
11016     }
11017
11018     return k *= 3, [x / k, y / k];
11019   }
11020
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]);
11027   }
11028
11029   function lexicographicOrder(a, b) {
11030     return a[0] - b[0] || a[1] - b[1];
11031   }
11032
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,
11038         indexes = [0, 1],
11039         size = 2;
11040
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;
11044     }
11045
11046     return indexes.slice(0, size); // remove popped points
11047   }
11048
11049   function d3_polygonHull(points) {
11050     if ((n = points.length) < 3) return null;
11051
11052     var i,
11053         n,
11054         sortedPoints = new Array(n),
11055         flippedPoints = new Array(n);
11056
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]];
11060
11061     var upperIndexes = computeUpperHullIndexes(sortedPoints),
11062         lowerIndexes = computeUpperHullIndexes(flippedPoints);
11063
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],
11067         hull = [];
11068
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]]);
11073
11074     return hull;
11075   }
11076
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],
11082         x1, y1,
11083         inside = false;
11084
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;
11088       x0 = x1, y0 = y1;
11089     }
11090
11091     return inside;
11092   }
11093
11094   function length$2(polygon) {
11095     var i = -1,
11096         n = polygon.length,
11097         b = polygon[n - 1],
11098         xa,
11099         ya,
11100         xb = b[0],
11101         yb = b[1],
11102         perimeter = 0;
11103
11104     while (++i < n) {
11105       xa = xb;
11106       ya = yb;
11107       b = polygon[i];
11108       xb = b[0];
11109       yb = b[1];
11110       xa -= xb;
11111       ya -= yb;
11112       perimeter += Math.sqrt(xa * xa + ya * ya);
11113     }
11114
11115     return perimeter;
11116   }
11117
11118   var slice$4 = [].slice;
11119
11120   var noabort = {};
11121
11122   function Queue(size) {
11123     this._size = size;
11124     this._call =
11125     this._error = null;
11126     this._tasks = [];
11127     this._data = [];
11128     this._waiting =
11129     this._active =
11130     this._ended =
11131     this._start = 0; // inside a synchronous task callback?
11132   }
11133
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);
11141       t.push(callback);
11142       ++this._waiting, this._tasks.push(t);
11143       poke$1(this);
11144       return this;
11145     },
11146     abort: function() {
11147       if (this._error == null) abort(this, new Error("abort"));
11148       return this;
11149     },
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)); };
11154       maybeNotify(this);
11155       return this;
11156     },
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;
11161       maybeNotify(this);
11162       return this;
11163     }
11164   };
11165
11166   function poke$1(q) {
11167     if (!q._start) {
11168       try { start$1(q); } // let the current task complete
11169       catch (e) {
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
11172       }
11173     }
11174   }
11175
11176   function start$1(q) {
11177     while (q._start = q._waiting && q._active < q._size) {
11178       var i = q._ended + q._active,
11179           t = q._tasks[i],
11180           j = t.length - 1,
11181           c = t[j];
11182       t[j] = end(q, i);
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;
11187     }
11188   }
11189
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
11196       if (e != null) {
11197         abort(q, e);
11198       } else {
11199         q._data[i] = r;
11200         if (q._waiting) poke$1(q);
11201         else maybeNotify(q);
11202       }
11203     };
11204   }
11205
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
11211
11212     while (--i >= 0) {
11213       if (t = q._tasks[i]) {
11214         q._tasks[i] = null;
11215         if (t.abort) {
11216           try { t.abort(); }
11217           catch (e) { /* ignore */ }
11218         }
11219       }
11220     }
11221
11222     q._active = NaN; // allow notification
11223     maybeNotify(q);
11224   }
11225
11226   function maybeNotify(q) {
11227     if (!q._active && q._call) {
11228       var d = q._data;
11229       q._data = undefined; // allow gc
11230       q._call(q._error, d);
11231     }
11232   }
11233
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);
11238   }
11239
11240   function defaultSource$1() {
11241     return Math.random();
11242   }
11243
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;
11249       else max -= min;
11250       return function() {
11251         return source() * max + min;
11252       };
11253     }
11254
11255     randomUniform.source = sourceRandomUniform;
11256
11257     return randomUniform;
11258   })(defaultSource$1);
11259
11260   var normal = (function sourceRandomNormal(source) {
11261     function randomNormal(mu, sigma) {
11262       var x, r;
11263       mu = mu == null ? 0 : +mu;
11264       sigma = sigma == null ? 1 : +sigma;
11265       return function() {
11266         var y;
11267
11268         // If available, use the second previously-generated uniform random.
11269         if (x != null) y = x, x = null;
11270
11271         // Otherwise, generate a new x and y.
11272         else do {
11273           x = source() * 2 - 1;
11274           y = source() * 2 - 1;
11275           r = x * x + y * y;
11276         } while (!r || r > 1);
11277
11278         return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
11279       };
11280     }
11281
11282     randomNormal.source = sourceRandomNormal;
11283
11284     return randomNormal;
11285   })(defaultSource$1);
11286
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());
11292       };
11293     }
11294
11295     randomLogNormal.source = sourceRandomLogNormal;
11296
11297     return randomLogNormal;
11298   })(defaultSource$1);
11299
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();
11304         return sum;
11305       };
11306     }
11307
11308     randomIrwinHall.source = sourceRandomIrwinHall;
11309
11310     return randomIrwinHall;
11311   })(defaultSource$1);
11312
11313   var bates = (function sourceRandomBates(source) {
11314     function randomBates(n) {
11315       var randomIrwinHall = irwinHall.source(source)(n);
11316       return function() {
11317         return randomIrwinHall() / n;
11318       };
11319     }
11320
11321     randomBates.source = sourceRandomBates;
11322
11323     return randomBates;
11324   })(defaultSource$1);
11325
11326   var exponential$1 = (function sourceRandomExponential(source) {
11327     function randomExponential(lambda) {
11328       return function() {
11329         return -Math.log(1 - source()) / lambda;
11330       };
11331     }
11332
11333     randomExponential.source = sourceRandomExponential;
11334
11335     return randomExponential;
11336   })(defaultSource$1);
11337
11338   function request(url, callback) {
11339     var request,
11340         event = dispatch("beforesend", "progress", "load", "error"),
11341         mimeType,
11342         headers = map$1(),
11343         xhr = new XMLHttpRequest,
11344         user = null,
11345         password = null,
11346         response,
11347         responseType,
11348         timeout = 0;
11349
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;
11354
11355     "onload" in xhr
11356         ? xhr.onload = xhr.onerror = xhr.ontimeout = respond
11357         : xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); };
11358
11359     function respond(o) {
11360       var status = xhr.status, result;
11361       if (!status && hasResponse(xhr)
11362           || status >= 200 && status < 300
11363           || status === 304) {
11364         if (response) {
11365           try {
11366             result = response.call(request, xhr);
11367           } catch (e) {
11368             event.call("error", request, e);
11369             return;
11370           }
11371         } else {
11372           result = xhr;
11373         }
11374         event.call("load", request, result);
11375       } else {
11376         event.call("error", request, o);
11377       }
11378     }
11379
11380     xhr.onprogress = function(e) {
11381       event.call("progress", request, e);
11382     };
11383
11384     request = {
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 + "");
11390         return request;
11391       },
11392
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 + "";
11397         return request;
11398       },
11399
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;
11405         return request;
11406       },
11407
11408       timeout: function(value) {
11409         if (!arguments.length) return timeout;
11410         timeout = +value;
11411         return request;
11412       },
11413
11414       user: function(value) {
11415         return arguments.length < 1 ? user : (user = value == null ? null : value + "", request);
11416       },
11417
11418       password: function(value) {
11419         return arguments.length < 1 ? password : (password = value == null ? null : value + "", request);
11420       },
11421
11422       // Specify how to convert the response content to a specific type;
11423       // changes the callback value on "load" events.
11424       response: function(value) {
11425         response = value;
11426         return request;
11427       },
11428
11429       // Alias for send("GET", …).
11430       get: function(data, callback) {
11431         return request.send("GET", data, callback);
11432       },
11433
11434       // Alias for send("POST", …).
11435       post: function(data, callback) {
11436         return request.send("POST", data, callback);
11437       },
11438
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);
11452         return request;
11453       },
11454
11455       abort: function() {
11456         xhr.abort();
11457         return request;
11458       },
11459
11460       on: function() {
11461         var value = event.on.apply(event, arguments);
11462         return value === event ? request : value;
11463       }
11464     };
11465
11466     if (callback != null) {
11467       if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11468       return request.get(callback);
11469     }
11470
11471     return request;
11472   }
11473
11474   function fixCallback(callback) {
11475     return function(error, xhr) {
11476       callback(error == null ? xhr : null);
11477     };
11478   }
11479
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
11485   }
11486
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);
11493       }
11494       return r;
11495     };
11496   }
11497
11498   var html = type$1("text/html", function(xhr) {
11499     return document.createRange().createContextualFragment(xhr.responseText);
11500   });
11501
11502   var d3_json = type$1("application/json", function(xhr) {
11503     return JSON.parse(xhr.responseText);
11504   });
11505
11506   var d3_text = type$1("text/plain", function(xhr) {
11507     return xhr.responseText;
11508   });
11509
11510   var d3_xml = type$1("application/xml", function(xhr) {
11511     var xml = xhr.responseXML;
11512     if (!xml) throw new Error("parse error");
11513     return xml;
11514   });
11515
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; };
11521       r.row(row);
11522       return callback ? r.get(callback) : r;
11523     };
11524   }
11525
11526   function responseOf(parse, row) {
11527     return function(request) {
11528       return parse(request.responseText, row);
11529     };
11530   }
11531
11532   var csv$1 = dsv$1("text/csv", csvParse);
11533
11534   var tsv$1 = dsv$1("text/tab-separated-values", tsvParse);
11535
11536   var array$2 = Array.prototype;
11537
11538   var map$2 = array$2.map;
11539   var slice$5 = array$2.slice;
11540
11541   var implicit = {name: "implicit"};
11542
11543   function ordinal(range) {
11544     var index = map$1(),
11545         domain = [],
11546         unknown = implicit;
11547
11548     range = range == null ? [] : slice$5.call(range);
11549
11550     function scale(d) {
11551       var key = d + "", i = index.get(key);
11552       if (!i) {
11553         if (unknown !== implicit) return unknown;
11554         index.set(key, i = domain.push(d));
11555       }
11556       return range[(i - 1) % range.length];
11557     }
11558
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));
11564       return scale;
11565     };
11566
11567     scale.range = function(_) {
11568       return arguments.length ? (range = slice$5.call(_), scale) : range.slice();
11569     };
11570
11571     scale.unknown = function(_) {
11572       return arguments.length ? (unknown = _, scale) : unknown;
11573     };
11574
11575     scale.copy = function() {
11576       return ordinal()
11577           .domain(domain)
11578           .range(range)
11579           .unknown(unknown);
11580     };
11581
11582     return scale;
11583   }
11584
11585   function band() {
11586     var scale = ordinal().unknown(undefined),
11587         domain = scale.domain,
11588         ordinalRange = scale.range,
11589         range$1 = [0, 1],
11590         step,
11591         bandwidth,
11592         round = false,
11593         paddingInner = 0,
11594         paddingOuter = 0,
11595         align = 0.5;
11596
11597     delete scale.unknown;
11598
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);
11611     }
11612
11613     scale.domain = function(_) {
11614       return arguments.length ? (domain(_), rescale()) : domain();
11615     };
11616
11617     scale.range = function(_) {
11618       return arguments.length ? (range$1 = [+_[0], +_[1]], rescale()) : range$1.slice();
11619     };
11620
11621     scale.rangeRound = function(_) {
11622       return range$1 = [+_[0], +_[1]], round = true, rescale();
11623     };
11624
11625     scale.bandwidth = function() {
11626       return bandwidth;
11627     };
11628
11629     scale.step = function() {
11630       return step;
11631     };
11632
11633     scale.round = function(_) {
11634       return arguments.length ? (round = !!_, rescale()) : round;
11635     };
11636
11637     scale.padding = function(_) {
11638       return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11639     };
11640
11641     scale.paddingInner = function(_) {
11642       return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11643     };
11644
11645     scale.paddingOuter = function(_) {
11646       return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;
11647     };
11648
11649     scale.align = function(_) {
11650       return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
11651     };
11652
11653     scale.copy = function() {
11654       return band()
11655           .domain(domain())
11656           .range(range$1)
11657           .round(round)
11658           .paddingInner(paddingInner)
11659           .paddingOuter(paddingOuter)
11660           .align(align);
11661     };
11662
11663     return rescale();
11664   }
11665
11666   function pointish(scale) {
11667     var copy = scale.copy;
11668
11669     scale.padding = scale.paddingOuter;
11670     delete scale.paddingInner;
11671     delete scale.paddingOuter;
11672
11673     scale.copy = function() {
11674       return pointish(copy());
11675     };
11676
11677     return scale;
11678   }
11679
11680   function point$1() {
11681     return pointish(band().paddingInner(1));
11682   }
11683
11684   function constant$9(x) {
11685     return function() {
11686       return x;
11687     };
11688   }
11689
11690   function number$2(x) {
11691     return +x;
11692   }
11693
11694   var unit = [0, 1];
11695
11696   function deinterpolateLinear(a, b) {
11697     return (b -= (a = +a))
11698         ? function(x) { return (x - a) / b; }
11699         : constant$9(b);
11700   }
11701
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); };
11706     };
11707   }
11708
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); };
11713     };
11714   }
11715
11716   function bimap(domain, range, deinterpolate, reinterpolate) {
11717     var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[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)); };
11721   }
11722
11723   function polymap(domain, range, deinterpolate, reinterpolate) {
11724     var j = Math.min(domain.length, range.length) - 1,
11725         d = new Array(j),
11726         r = new Array(j),
11727         i = -1;
11728
11729     // Reverse descending domains.
11730     if (domain[j] < domain[0]) {
11731       domain = domain.slice().reverse();
11732       range = range.slice().reverse();
11733     }
11734
11735     while (++i < j) {
11736       d[i] = deinterpolate(domain[i], domain[i + 1]);
11737       r[i] = reinterpolate(range[i], range[i + 1]);
11738     }
11739
11740     return function(x) {
11741       var i = bisectRight(domain, x, 1, j) - 1;
11742       return r[i](d[i](x));
11743     };
11744   }
11745
11746   function copy(source, target) {
11747     return target
11748         .domain(source.domain())
11749         .range(source.range())
11750         .interpolate(source.interpolate())
11751         .clamp(source.clamp());
11752   }
11753
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) {
11757     var domain = unit,
11758         range = unit,
11759         interpolate$1 = interpolate,
11760         clamp = false,
11761         piecewise,
11762         output,
11763         input;
11764
11765     function rescale() {
11766       piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
11767       output = input = null;
11768       return scale;
11769     }
11770
11771     function scale(x) {
11772       return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate$1)))(+x);
11773     }
11774
11775     scale.invert = function(y) {
11776       return (input || (input = piecewise(range, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);
11777     };
11778
11779     scale.domain = function(_) {
11780       return arguments.length ? (domain = map$2.call(_, number$2), rescale()) : domain.slice();
11781     };
11782
11783     scale.range = function(_) {
11784       return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice();
11785     };
11786
11787     scale.rangeRound = function(_) {
11788       return range = slice$5.call(_), interpolate$1 = interpolateRound, rescale();
11789     };
11790
11791     scale.clamp = function(_) {
11792       return arguments.length ? (clamp = !!_, rescale()) : clamp;
11793     };
11794
11795     scale.interpolate = function(_) {
11796       return arguments.length ? (interpolate$1 = _, rescale()) : interpolate$1;
11797     };
11798
11799     return rescale();
11800   }
11801
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),
11806         precision;
11807     specifier = formatSpecifier(specifier == null ? ",f" : specifier);
11808     switch (specifier.type) {
11809       case "s": {
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);
11813       }
11814       case "":
11815       case "e":
11816       case "g":
11817       case "p":
11818       case "r": {
11819         if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
11820         break;
11821       }
11822       case "f":
11823       case "%": {
11824         if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
11825         break;
11826       }
11827     }
11828     return format(specifier);
11829   }
11830
11831   function linearish(scale) {
11832     var domain = scale.domain;
11833
11834     scale.ticks = function(count) {
11835       var d = domain();
11836       return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
11837     };
11838
11839     scale.tickFormat = function(count, specifier) {
11840       return tickFormat(domain(), count, specifier);
11841     };
11842
11843     scale.nice = function(count) {
11844       if (count == null) count = 10;
11845
11846       var d = domain(),
11847           i0 = 0,
11848           i1 = d.length - 1,
11849           start = d[i0],
11850           stop = d[i1],
11851           step;
11852
11853       if (stop < start) {
11854         step = start, start = stop, stop = step;
11855         step = i0, i0 = i1, i1 = step;
11856       }
11857
11858       step = tickIncrement(start, stop, count);
11859
11860       if (step > 0) {
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);
11868       }
11869
11870       if (step > 0) {
11871         d[i0] = Math.floor(start / step) * step;
11872         d[i1] = Math.ceil(stop / step) * step;
11873         domain(d);
11874       } else if (step < 0) {
11875         d[i0] = Math.ceil(start * step) / step;
11876         d[i1] = Math.floor(stop * step) / step;
11877         domain(d);
11878       }
11879
11880       return scale;
11881     };
11882
11883     return scale;
11884   }
11885
11886   function linear$2() {
11887     var scale = continuous(deinterpolateLinear, interpolateNumber);
11888
11889     scale.copy = function() {
11890       return copy(scale, linear$2());
11891     };
11892
11893     return linearish(scale);
11894   }
11895
11896   function identity$5() {
11897     var domain = [0, 1];
11898
11899     function scale(x) {
11900       return +x;
11901     }
11902
11903     scale.invert = scale;
11904
11905     scale.domain = scale.range = function(_) {
11906       return arguments.length ? (domain = map$2.call(_, number$2), scale) : domain.slice();
11907     };
11908
11909     scale.copy = function() {
11910       return identity$5().domain(domain);
11911     };
11912
11913     return linearish(scale);
11914   }
11915
11916   function nice(domain, interval) {
11917     domain = domain.slice();
11918
11919     var i0 = 0,
11920         i1 = domain.length - 1,
11921         x0 = domain[i0],
11922         x1 = domain[i1],
11923         t;
11924
11925     if (x1 < x0) {
11926       t = i0, i0 = i1, i1 = t;
11927       t = x0, x0 = x1, x1 = t;
11928     }
11929
11930     domain[i0] = interval.floor(x0);
11931     domain[i1] = interval.ceil(x1);
11932     return domain;
11933   }
11934
11935   function deinterpolate(a, b) {
11936     return (b = Math.log(b / a))
11937         ? function(x) { return Math.log(x / a) / b; }
11938         : constant$9(b);
11939   }
11940
11941   function reinterpolate(a, b) {
11942     return a < 0
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); };
11945   }
11946
11947   function pow10(x) {
11948     return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
11949   }
11950
11951   function powp(base) {
11952     return base === 10 ? pow10
11953         : base === Math.E ? Math.exp
11954         : function(x) { return Math.pow(base, x); };
11955   }
11956
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; });
11962   }
11963
11964   function reflect(f) {
11965     return function(x) {
11966       return -f(-x);
11967     };
11968   }
11969
11970   function log$1() {
11971     var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),
11972         domain = scale.domain,
11973         base = 10,
11974         logs = logp(10),
11975         pows = powp(10);
11976
11977     function rescale() {
11978       logs = logp(base), pows = powp(base);
11979       if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);
11980       return scale;
11981     }
11982
11983     scale.base = function(_) {
11984       return arguments.length ? (base = +_, rescale()) : base;
11985     };
11986
11987     scale.domain = function(_) {
11988       return arguments.length ? (domain(_), rescale()) : domain();
11989     };
11990
11991     scale.ticks = function(count) {
11992       var d = domain(),
11993           u = d[0],
11994           v = d[d.length - 1],
11995           r;
11996
11997       if (r = v < u) i = u, u = v, v = i;
11998
11999       var i = logs(u),
12000           j = logs(v),
12001           p,
12002           k,
12003           t,
12004           n = count == null ? 10 : +count,
12005           z = [];
12006
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) {
12011             t = p * k;
12012             if (t < u) continue;
12013             if (t > v) break;
12014             z.push(t);
12015           }
12016         } else for (; i < j; ++i) {
12017           for (k = base - 1, p = pows(i); k >= 1; --k) {
12018             t = p * k;
12019             if (t < u) continue;
12020             if (t > v) break;
12021             z.push(t);
12022           }
12023         }
12024       } else {
12025         z = ticks(i, j, Math.min(j - i, n)).map(pows);
12026       }
12027
12028       return r ? z.reverse() : z;
12029     };
12030
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) : "";
12041       };
12042     };
12043
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))); }
12048       }));
12049     };
12050
12051     scale.copy = function() {
12052       return copy(scale, log$1().base(base));
12053     };
12054
12055     return scale;
12056   }
12057
12058   function raise$1(x, exponent) {
12059     return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
12060   }
12061
12062   function pow$1() {
12063     var exponent = 1,
12064         scale = continuous(deinterpolate, reinterpolate),
12065         domain = scale.domain;
12066
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; }
12070           : constant$9(b);
12071     }
12072
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); };
12076     }
12077
12078     scale.exponent = function(_) {
12079       return arguments.length ? (exponent = +_, domain(domain())) : exponent;
12080     };
12081
12082     scale.copy = function() {
12083       return copy(scale, pow$1().exponent(exponent));
12084     };
12085
12086     return linearish(scale);
12087   }
12088
12089   function sqrt$1() {
12090     return pow$1().exponent(0.5);
12091   }
12092
12093   function quantile$1() {
12094     var domain = [],
12095         range = [],
12096         thresholds = [];
12097
12098     function rescale() {
12099       var i = 0, n = Math.max(1, range.length);
12100       thresholds = new Array(n - 1);
12101       while (++i < n) thresholds[i - 1] = quantile(domain, i / n);
12102       return scale;
12103     }
12104
12105     function scale(x) {
12106       if (!isNaN(x = +x)) return range[bisectRight(thresholds, x)];
12107     }
12108
12109     scale.invertExtent = function(y) {
12110       var i = range.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]
12114       ];
12115     };
12116
12117     scale.domain = function(_) {
12118       if (!arguments.length) return domain.slice();
12119       domain = [];
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);
12122       return rescale();
12123     };
12124
12125     scale.range = function(_) {
12126       return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice();
12127     };
12128
12129     scale.quantiles = function() {
12130       return thresholds.slice();
12131     };
12132
12133     scale.copy = function() {
12134       return quantile$1()
12135           .domain(domain)
12136           .range(range);
12137     };
12138
12139     return scale;
12140   }
12141
12142   function quantize() {
12143     var x0 = 0,
12144         x1 = 1,
12145         n = 1,
12146         domain = [0.5],
12147         range = [0, 1];
12148
12149     function scale(x) {
12150       if (x <= x) return range[bisectRight(domain, x, 0, n)];
12151     }
12152
12153     function rescale() {
12154       var i = -1;
12155       domain = new Array(n);
12156       while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
12157       return scale;
12158     }
12159
12160     scale.domain = function(_) {
12161       return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
12162     };
12163
12164     scale.range = function(_) {
12165       return arguments.length ? (n = (range = slice$5.call(_)).length - 1, rescale()) : range.slice();
12166     };
12167
12168     scale.invertExtent = function(y) {
12169       var i = range.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]];
12174     };
12175
12176     scale.copy = function() {
12177       return quantize()
12178           .domain([x0, x1])
12179           .range(range);
12180     };
12181
12182     return linearish(scale);
12183   }
12184
12185   function threshold() {
12186     var domain = [0.5],
12187         range = [0, 1],
12188         n = 1;
12189
12190     function scale(x) {
12191       if (x <= x) return range[bisectRight(domain, x, 0, n)];
12192     }
12193
12194     scale.domain = function(_) {
12195       return arguments.length ? (domain = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();
12196     };
12197
12198     scale.range = function(_) {
12199       return arguments.length ? (range = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
12200     };
12201
12202     scale.invertExtent = function(y) {
12203       var i = range.indexOf(y);
12204       return [domain[i - 1], domain[i]];
12205     };
12206
12207     scale.copy = function() {
12208       return threshold()
12209           .domain(domain)
12210           .range(range);
12211     };
12212
12213     return scale;
12214   }
12215
12216   var t0$1 = new Date,
12217       t1$1 = new Date;
12218
12219   function newInterval(floori, offseti, count, field) {
12220
12221     function interval(date) {
12222       return floori(date = new Date(+date)), date;
12223     }
12224
12225     interval.floor = interval;
12226
12227     interval.ceil = function(date) {
12228       return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
12229     };
12230
12231     interval.round = function(date) {
12232       var d0 = interval(date),
12233           d1 = interval.ceil(date);
12234       return date - d0 < d1 - date ? d0 : d1;
12235     };
12236
12237     interval.offset = function(date, step) {
12238       return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
12239     };
12240
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);
12248       return range;
12249     };
12250
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
12260           }
12261         }
12262       });
12263     };
12264
12265     if (count) {
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));
12270       };
12271
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; });
12279       };
12280     }
12281
12282     return interval;
12283   }
12284
12285   var millisecond = newInterval(function() {
12286     // noop
12287   }, function(date, step) {
12288     date.setTime(+date + step);
12289   }, function(start, end) {
12290     return end - start;
12291   });
12292
12293   // An optimized implementation for this simple case.
12294   millisecond.every = function(k) {
12295     k = Math.floor(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;
12304     });
12305   };
12306   var milliseconds = millisecond.range;
12307
12308   var durationSecond = 1e3;
12309   var durationMinute = 6e4;
12310   var durationHour = 36e5;
12311   var durationDay = 864e5;
12312   var durationWeek = 6048e5;
12313
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();
12322   });
12323   var seconds = second.range;
12324
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();
12333   });
12334   var minutes = minute.range;
12335
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();
12346   });
12347   var hours = hour.range;
12348
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;
12357   });
12358   var days = day.range;
12359
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;
12368     });
12369   }
12370
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);
12378
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;
12386
12387   var month = newInterval(function(date) {
12388     date.setDate(1);
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();
12396   });
12397   var months = month.range;
12398
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();
12408   });
12409
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);
12418     });
12419   };
12420   var years = year.range;
12421
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();
12430   });
12431   var utcMinutes = utcMinute.range;
12432
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();
12441   });
12442   var utcHours = utcHour.range;
12443
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;
12452   });
12453   var utcDays = utcDay.range;
12454
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;
12463     });
12464   }
12465
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);
12473
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;
12481
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();
12491   });
12492   var utcMonths = utcMonth.range;
12493
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();
12503   });
12504
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);
12513     });
12514   };
12515   var utcYears = utcYear.range;
12516
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);
12521       return date;
12522     }
12523     return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
12524   }
12525
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);
12530       return date;
12531     }
12532     return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
12533   }
12534
12535   function newYear(y) {
12536     return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
12537   }
12538
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;
12548
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);
12559
12560     var formats = {
12561       "a": formatShortWeekday,
12562       "A": formatWeekday,
12563       "b": formatShortMonth,
12564       "B": formatMonth,
12565       "c": null,
12566       "d": formatDayOfMonth,
12567       "e": formatDayOfMonth,
12568       "f": formatMicroseconds,
12569       "H": formatHour24,
12570       "I": formatHour12,
12571       "j": formatDayOfYear,
12572       "L": formatMilliseconds,
12573       "m": formatMonthNumber,
12574       "M": formatMinutes,
12575       "p": formatPeriod,
12576       "Q": formatUnixTimestamp,
12577       "s": formatUnixTimestampSeconds,
12578       "S": formatSeconds,
12579       "u": formatWeekdayNumberMonday,
12580       "U": formatWeekNumberSunday,
12581       "V": formatWeekNumberISO,
12582       "w": formatWeekdayNumberSunday,
12583       "W": formatWeekNumberMonday,
12584       "x": null,
12585       "X": null,
12586       "y": formatYear,
12587       "Y": formatFullYear,
12588       "Z": formatZone,
12589       "%": formatLiteralPercent
12590     };
12591
12592     var utcFormats = {
12593       "a": formatUTCShortWeekday,
12594       "A": formatUTCWeekday,
12595       "b": formatUTCShortMonth,
12596       "B": formatUTCMonth,
12597       "c": null,
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,
12616       "x": null,
12617       "X": null,
12618       "y": formatUTCYear,
12619       "Y": formatUTCFullYear,
12620       "Z": formatUTCZone,
12621       "%": formatLiteralPercent
12622     };
12623
12624     var parses = {
12625       "a": parseShortWeekday,
12626       "A": parseWeekday,
12627       "b": parseShortMonth,
12628       "B": parseMonth,
12629       "c": parseLocaleDateTime,
12630       "d": parseDayOfMonth,
12631       "e": parseDayOfMonth,
12632       "f": parseMicroseconds,
12633       "H": parseHour24,
12634       "I": parseHour24,
12635       "j": parseDayOfYear,
12636       "L": parseMilliseconds,
12637       "m": parseMonthNumber,
12638       "M": parseMinutes,
12639       "p": parsePeriod,
12640       "Q": parseUnixTimestamp,
12641       "s": parseUnixTimestampSeconds,
12642       "S": parseSeconds,
12643       "u": parseWeekdayNumberMonday,
12644       "U": parseWeekNumberSunday,
12645       "V": parseWeekNumberISO,
12646       "w": parseWeekdayNumberSunday,
12647       "W": parseWeekNumberMonday,
12648       "x": parseLocaleDate,
12649       "X": parseLocaleTime,
12650       "y": parseYear,
12651       "Y": parseFullYear,
12652       "Z": parseZone,
12653       "%": parseLiteralPercent
12654     };
12655
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);
12663
12664     function newFormat(specifier, formats) {
12665       return function(date) {
12666         var string = [],
12667             i = -1,
12668             j = 0,
12669             n = specifier.length,
12670             c,
12671             pad,
12672             format;
12673
12674         if (!(date instanceof Date)) date = new Date(+date);
12675
12676         while (++i < n) {
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);
12682             string.push(c);
12683             j = i + 1;
12684           }
12685         }
12686
12687         string.push(specifier.slice(j, i));
12688         return string.join("");
12689       };
12690     }
12691
12692     function newParse(specifier, newDate) {
12693       return function(string) {
12694         var d = newYear(1900),
12695             i = parseSpecifier(d, specifier, string += "", 0),
12696             week, day$1;
12697         if (i != string.length) return null;
12698
12699         // If a UNIX timestamp is specified, return it.
12700         if ("Q" in d) return new Date(d.Q);
12701
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;
12704
12705         // Convert day-of-week and week-of-year to day-of-year.
12706         if ("V" in d) {
12707           if (d.V < 1 || d.V > 53) return null;
12708           if (!("w" in d)) d.w = 1;
12709           if ("Z" in d) {
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;
12716           } else {
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;
12723           }
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();
12727           d.m = 0;
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;
12729         }
12730
12731         // If a time zone is specified, all fields are interpreted as UTC and then
12732         // offset according to the specified time zone.
12733         if ("Z" in d) {
12734           d.H += d.Z / 100 | 0;
12735           d.M += d.Z % 100;
12736           return utcDate(d);
12737         }
12738
12739         // Otherwise, all fields are in local time.
12740         return newDate(d);
12741       };
12742     }
12743
12744     function parseSpecifier(d, specifier, string, j) {
12745       var i = 0,
12746           n = specifier.length,
12747           m = string.length,
12748           c,
12749           parse;
12750
12751       while (i < n) {
12752         if (j >= m) return -1;
12753         c = specifier.charCodeAt(i++);
12754         if (c === 37) {
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++)) {
12759           return -1;
12760         }
12761       }
12762
12763       return j;
12764     }
12765
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;
12769     }
12770
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;
12774     }
12775
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;
12779     }
12780
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;
12784     }
12785
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;
12789     }
12790
12791     function parseLocaleDateTime(d, string, i) {
12792       return parseSpecifier(d, locale_dateTime, string, i);
12793     }
12794
12795     function parseLocaleDate(d, string, i) {
12796       return parseSpecifier(d, locale_date, string, i);
12797     }
12798
12799     function parseLocaleTime(d, string, i) {
12800       return parseSpecifier(d, locale_time, string, i);
12801     }
12802
12803     function formatShortWeekday(d) {
12804       return locale_shortWeekdays[d.getDay()];
12805     }
12806
12807     function formatWeekday(d) {
12808       return locale_weekdays[d.getDay()];
12809     }
12810
12811     function formatShortMonth(d) {
12812       return locale_shortMonths[d.getMonth()];
12813     }
12814
12815     function formatMonth(d) {
12816       return locale_months[d.getMonth()];
12817     }
12818
12819     function formatPeriod(d) {
12820       return locale_periods[+(d.getHours() >= 12)];
12821     }
12822
12823     function formatUTCShortWeekday(d) {
12824       return locale_shortWeekdays[d.getUTCDay()];
12825     }
12826
12827     function formatUTCWeekday(d) {
12828       return locale_weekdays[d.getUTCDay()];
12829     }
12830
12831     function formatUTCShortMonth(d) {
12832       return locale_shortMonths[d.getUTCMonth()];
12833     }
12834
12835     function formatUTCMonth(d) {
12836       return locale_months[d.getUTCMonth()];
12837     }
12838
12839     function formatUTCPeriod(d) {
12840       return locale_periods[+(d.getUTCHours() >= 12)];
12841     }
12842
12843     return {
12844       format: function(specifier) {
12845         var f = newFormat(specifier += "", formats);
12846         f.toString = function() { return specifier; };
12847         return f;
12848       },
12849       parse: function(specifier) {
12850         var p = newParse(specifier += "", localDate);
12851         p.toString = function() { return specifier; };
12852         return p;
12853       },
12854       utcFormat: function(specifier) {
12855         var f = newFormat(specifier += "", utcFormats);
12856         f.toString = function() { return specifier; };
12857         return f;
12858       },
12859       utcParse: function(specifier) {
12860         var p = newParse(specifier, utcDate);
12861         p.toString = function() { return specifier; };
12862         return p;
12863       }
12864     };
12865   }
12866
12867   var pads = {"-": "", "_": " ", "0": "0"},
12868       numberRe = /^\s*\d+/, // note: ignores next directive
12869       percentRe = /^%/,
12870       requoteRe = /[\\^$*+?|[\]().{}]/g;
12871
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);
12877   }
12878
12879   function requote(s) {
12880     return s.replace(requoteRe, "\\$&");
12881   }
12882
12883   function formatRe(names) {
12884     return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
12885   }
12886
12887   function formatLookup(names) {
12888     var map = {}, i = -1, n = names.length;
12889     while (++i < n) map[names[i].toLowerCase()] = i;
12890     return map;
12891   }
12892
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;
12896   }
12897
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;
12901   }
12902
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;
12906   }
12907
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;
12911   }
12912
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;
12916   }
12917
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;
12921   }
12922
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;
12926   }
12927
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;
12931   }
12932
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;
12936   }
12937
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;
12941   }
12942
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;
12946   }
12947
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;
12951   }
12952
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;
12956   }
12957
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;
12961   }
12962
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;
12966   }
12967
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;
12971   }
12972
12973   function parseLiteralPercent(d, string, i) {
12974     var n = percentRe.exec(string.slice(i, i + 1));
12975     return n ? i + n[0].length : -1;
12976   }
12977
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;
12981   }
12982
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;
12986   }
12987
12988   function formatDayOfMonth(d, p) {
12989     return pad(d.getDate(), p, 2);
12990   }
12991
12992   function formatHour24(d, p) {
12993     return pad(d.getHours(), p, 2);
12994   }
12995
12996   function formatHour12(d, p) {
12997     return pad(d.getHours() % 12 || 12, p, 2);
12998   }
12999
13000   function formatDayOfYear(d, p) {
13001     return pad(1 + day.count(year(d), d), p, 3);
13002   }
13003
13004   function formatMilliseconds(d, p) {
13005     return pad(d.getMilliseconds(), p, 3);
13006   }
13007
13008   function formatMicroseconds(d, p) {
13009     return formatMilliseconds(d, p) + "000";
13010   }
13011
13012   function formatMonthNumber(d, p) {
13013     return pad(d.getMonth() + 1, p, 2);
13014   }
13015
13016   function formatMinutes(d, p) {
13017     return pad(d.getMinutes(), p, 2);
13018   }
13019
13020   function formatSeconds(d, p) {
13021     return pad(d.getSeconds(), p, 2);
13022   }
13023
13024   function formatWeekdayNumberMonday(d) {
13025     var day = d.getDay();
13026     return day === 0 ? 7 : day;
13027   }
13028
13029   function formatWeekNumberSunday(d, p) {
13030     return pad(sunday.count(year(d), d), p, 2);
13031   }
13032
13033   function formatWeekNumberISO(d, p) {
13034     var day = d.getDay();
13035     d = (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d);
13036     return pad(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2);
13037   }
13038
13039   function formatWeekdayNumberSunday(d) {
13040     return d.getDay();
13041   }
13042
13043   function formatWeekNumberMonday(d, p) {
13044     return pad(monday.count(year(d), d), p, 2);
13045   }
13046
13047   function formatYear(d, p) {
13048     return pad(d.getFullYear() % 100, p, 2);
13049   }
13050
13051   function formatFullYear(d, p) {
13052     return pad(d.getFullYear() % 10000, p, 4);
13053   }
13054
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);
13060   }
13061
13062   function formatUTCDayOfMonth(d, p) {
13063     return pad(d.getUTCDate(), p, 2);
13064   }
13065
13066   function formatUTCHour24(d, p) {
13067     return pad(d.getUTCHours(), p, 2);
13068   }
13069
13070   function formatUTCHour12(d, p) {
13071     return pad(d.getUTCHours() % 12 || 12, p, 2);
13072   }
13073
13074   function formatUTCDayOfYear(d, p) {
13075     return pad(1 + utcDay.count(utcYear(d), d), p, 3);
13076   }
13077
13078   function formatUTCMilliseconds(d, p) {
13079     return pad(d.getUTCMilliseconds(), p, 3);
13080   }
13081
13082   function formatUTCMicroseconds(d, p) {
13083     return formatUTCMilliseconds(d, p) + "000";
13084   }
13085
13086   function formatUTCMonthNumber(d, p) {
13087     return pad(d.getUTCMonth() + 1, p, 2);
13088   }
13089
13090   function formatUTCMinutes(d, p) {
13091     return pad(d.getUTCMinutes(), p, 2);
13092   }
13093
13094   function formatUTCSeconds(d, p) {
13095     return pad(d.getUTCSeconds(), p, 2);
13096   }
13097
13098   function formatUTCWeekdayNumberMonday(d) {
13099     var dow = d.getUTCDay();
13100     return dow === 0 ? 7 : dow;
13101   }
13102
13103   function formatUTCWeekNumberSunday(d, p) {
13104     return pad(utcSunday.count(utcYear(d), d), p, 2);
13105   }
13106
13107   function formatUTCWeekNumberISO(d, p) {
13108     var day = d.getUTCDay();
13109     d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);
13110     return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);
13111   }
13112
13113   function formatUTCWeekdayNumberSunday(d) {
13114     return d.getUTCDay();
13115   }
13116
13117   function formatUTCWeekNumberMonday(d, p) {
13118     return pad(utcMonday.count(utcYear(d), d), p, 2);
13119   }
13120
13121   function formatUTCYear(d, p) {
13122     return pad(d.getUTCFullYear() % 100, p, 2);
13123   }
13124
13125   function formatUTCFullYear(d, p) {
13126     return pad(d.getUTCFullYear() % 10000, p, 4);
13127   }
13128
13129   function formatUTCZone() {
13130     return "+0000";
13131   }
13132
13133   function formatLiteralPercent() {
13134     return "%";
13135   }
13136
13137   function formatUnixTimestamp(d) {
13138     return +d;
13139   }
13140
13141   function formatUnixTimestampSeconds(d) {
13142     return Math.floor(+d / 1000);
13143   }
13144
13145   var locale$1;
13146   var timeFormat;
13147   var timeParse;
13148   var utcFormat;
13149   var utcParse;
13150
13151   defaultLocale$1({
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"]
13160   });
13161
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;
13168     return locale$1;
13169   }
13170
13171   var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
13172
13173   function formatIsoNative(date) {
13174     return date.toISOString();
13175   }
13176
13177   var formatIso = Date.prototype.toISOString
13178       ? formatIsoNative
13179       : utcFormat(isoSpecifier);
13180
13181   function parseIsoNative(string) {
13182     var date = new Date(string);
13183     return isNaN(date) ? null : date;
13184   }
13185
13186   var parseIso = +new Date("2000-01-01T00:00:00.000Z")
13187       ? parseIsoNative
13188       : utcParse(isoSpecifier);
13189
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;
13197
13198   function date$1(t) {
13199     return new Date(t);
13200   }
13201
13202   function number$3(t) {
13203     return t instanceof Date ? +t : +new Date(+t);
13204   }
13205
13206   function calendar(year, month, week, day, hour, minute, second, millisecond, format) {
13207     var scale = continuous(deinterpolateLinear, interpolateNumber),
13208         invert = scale.invert,
13209         domain = scale.domain;
13210
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");
13219
13220     var tickIntervals = [
13221       [second,  1,      durationSecond$1],
13222       [second,  5,  5 * durationSecond$1],
13223       [second, 15, 15 * durationSecond$1],
13224       [second, 30, 30 * durationSecond$1],
13225       [minute,  1,      durationMinute$1],
13226       [minute,  5,  5 * durationMinute$1],
13227       [minute, 15, 15 * durationMinute$1],
13228       [minute, 30, 30 * durationMinute$1],
13229       [  hour,  1,      durationHour$1  ],
13230       [  hour,  3,  3 * durationHour$1  ],
13231       [  hour,  6,  6 * durationHour$1  ],
13232       [  hour, 12, 12 * durationHour$1  ],
13233       [   day,  1,      durationDay$1   ],
13234       [   day,  2,  2 * durationDay$1   ],
13235       [  week,  1,      durationWeek$1  ],
13236       [ month,  1,      durationMonth ],
13237       [ month,  3,  3 * durationMonth ],
13238       [  year,  1,      durationYear  ]
13239     ];
13240
13241     function tickFormat(date) {
13242       return (second(date) < date ? formatMillisecond
13243           : minute(date) < date ? formatSecond
13244           : hour(date) < date ? formatMinute
13245           : day(date) < date ? formatHour
13246           : month(date) < date ? (week(date) < date ? formatDay : formatWeek)
13247           : year(date) < date ? formatMonth
13248           : formatYear)(date);
13249     }
13250
13251     function tickInterval(interval, start, stop, step) {
13252       if (interval == null) interval = 10;
13253
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;
13263         } else if (i) {
13264           i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
13265           step = i[1];
13266           interval = i[0];
13267         } else {
13268           step = Math.max(tickStep(start, stop, interval), 1);
13269           interval = millisecond;
13270         }
13271       }
13272
13273       return step == null ? interval : interval.every(step);
13274     }
13275
13276     scale.invert = function(y) {
13277       return new Date(invert(y));
13278     };
13279
13280     scale.domain = function(_) {
13281       return arguments.length ? domain(map$2.call(_, number$3)) : domain().map(date$1);
13282     };
13283
13284     scale.ticks = function(interval, step) {
13285       var d = domain(),
13286           t0 = d[0],
13287           t1 = d[d.length - 1],
13288           r = t1 < t0,
13289           t;
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;
13294     };
13295
13296     scale.tickFormat = function(count, specifier) {
13297       return specifier == null ? tickFormat : format(specifier);
13298     };
13299
13300     scale.nice = function(interval, step) {
13301       var d = domain();
13302       return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
13303           ? domain(nice(d, interval))
13304           : scale;
13305     };
13306
13307     scale.copy = function() {
13308       return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));
13309     };
13310
13311     return scale;
13312   }
13313
13314   function time() {
13315     return calendar(year, month, sunday, day, hour, minute, second, millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);
13316   }
13317
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)]);
13320   }
13321
13322   function colors(s) {
13323     return s.match(/.{6}/g).map(function(x) {
13324       return "#" + x;
13325     });
13326   }
13327
13328   var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
13329
13330   var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6");
13331
13332   var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9");
13333
13334   var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5");
13335
13336   var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
13337
13338   var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13339
13340   var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13341
13342   var rainbow = cubehelix();
13343
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 + "";
13351   }
13352
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)))];
13357     };
13358   }
13359
13360   var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
13361
13362   var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
13363
13364   var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
13365
13366   var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
13367
13368   function sequential(interpolator) {
13369     var x0 = 0,
13370         x1 = 1,
13371         clamp = false;
13372
13373     function scale(x) {
13374       var t = (x - x0) / (x1 - x0);
13375       return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);
13376     }
13377
13378     scale.domain = function(_) {
13379       return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1];
13380     };
13381
13382     scale.clamp = function(_) {
13383       return arguments.length ? (clamp = !!_, scale) : clamp;
13384     };
13385
13386     scale.interpolator = function(_) {
13387       return arguments.length ? (interpolator = _, scale) : interpolator;
13388     };
13389
13390     scale.copy = function() {
13391       return sequential(interpolator).domain([x0, x1]).clamp(clamp);
13392     };
13393
13394     return linearish(scale);
13395   }
13396
13397   function constant$a(x) {
13398     return function constant() {
13399       return x;
13400     };
13401   }
13402
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;
13410
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;
13415
13416   function acos$1(x) {
13417     return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x);
13418   }
13419
13420   function asin$1(x) {
13421     return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
13422   }
13423
13424   function arcInnerRadius(d) {
13425     return d.innerRadius;
13426   }
13427
13428   function arcOuterRadius(d) {
13429     return d.outerRadius;
13430   }
13431
13432   function arcStartAngle(d) {
13433     return d.startAngle;
13434   }
13435
13436   function arcEndAngle(d) {
13437     return d.endAngle;
13438   }
13439
13440   function arcPadAngle(d) {
13441     return d && d.padAngle; // Note: optional!
13442   }
13443
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];
13449   }
13450
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) {
13454     var x01 = x0 - x1,
13455         y01 = y0 - y1,
13456         lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01),
13457         ox = lo * y01,
13458         oy = -lo * x01,
13459         x11 = x0 + ox,
13460         y11 = y0 + oy,
13461         x10 = x1 + ox,
13462         y10 = y1 + oy,
13463         x00 = (x11 + x10) / 2,
13464         y00 = (y11 + y10) / 2,
13465         dx = x10 - x11,
13466         dy = y10 - y11,
13467         d2 = dx * dx + dy * dy,
13468         r = r1 - rc,
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,
13475         dx0 = cx0 - x00,
13476         dy0 = cy0 - y00,
13477         dx1 = cx1 - x00,
13478         dy1 = cy1 - y00;
13479
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;
13483
13484     return {
13485       cx: cx0,
13486       cy: cy0,
13487       x01: -ox,
13488       y01: -oy,
13489       x11: cx0 * (r1 / r - 1),
13490       y11: cy0 * (r1 / r - 1)
13491     };
13492   }
13493
13494   function arc() {
13495     var innerRadius = arcInnerRadius,
13496         outerRadius = arcOuterRadius,
13497         cornerRadius = constant$a(0),
13498         padRadius = null,
13499         startAngle = arcStartAngle,
13500         endAngle = arcEndAngle,
13501         padAngle = arcPadAngle,
13502         context = null;
13503
13504     function arc() {
13505       var buffer,
13506           r,
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),
13512           cw = a1 > a0;
13513
13514       if (!context) context = buffer = path();
13515
13516       // Ensure that the outer radius is always larger than the inner radius.
13517       if (r1 < r0) r = r1, r1 = r0, r0 = r;
13518
13519       // Is it a point?
13520       if (!(r1 > epsilon$3)) context.moveTo(0, 0);
13521
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);
13529         }
13530       }
13531
13532       // Or is it a circular or annular sector?
13533       else {
13534         var a01 = a0,
13535             a11 = a1,
13536             a00 = a0,
13537             a10 = a1,
13538             da0 = da,
13539             da1 = da,
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)),
13543             rc0 = rc,
13544             rc1 = rc,
13545             t0,
13546             t1;
13547
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;
13556         }
13557
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);
13562
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);
13569
13570           // Restrict the corner radius according to the sector angle.
13571           if (da < pi$4) {
13572             var oc = da0 > epsilon$3 ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10],
13573                 ax = x01 - oc[0],
13574                 ay = y01 - oc[1],
13575                 bx = x11 - oc[0],
13576                 by = y11 - oc[1],
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));
13581           }
13582         }
13583
13584         // Is the sector collapsed to a line?
13585         if (!(da1 > epsilon$3)) context.moveTo(x01, y01);
13586
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);
13591
13592           context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
13593
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);
13596
13597           // Otherwise, draw the two corners and the ring.
13598           else {
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);
13602           }
13603         }
13604
13605         // Or is the outer ring just a circular arc?
13606         else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
13607
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);
13611
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);
13616
13617           context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
13618
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);
13621
13622           // Otherwise, draw the two corners and the ring.
13623           else {
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);
13627           }
13628         }
13629
13630         // Or is the inner ring just a circular arc?
13631         else context.arc(0, 0, r0, a10, a00, cw);
13632       }
13633
13634       context.closePath();
13635
13636       if (buffer) return context = null, buffer + "" || null;
13637     }
13638
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];
13643     };
13644
13645     arc.innerRadius = function(_) {
13646       return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : innerRadius;
13647     };
13648
13649     arc.outerRadius = function(_) {
13650       return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : outerRadius;
13651     };
13652
13653     arc.cornerRadius = function(_) {
13654       return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : cornerRadius;
13655     };
13656
13657     arc.padRadius = function(_) {
13658       return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), arc) : padRadius;
13659     };
13660
13661     arc.startAngle = function(_) {
13662       return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : startAngle;
13663     };
13664
13665     arc.endAngle = function(_) {
13666       return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : endAngle;
13667     };
13668
13669     arc.padAngle = function(_) {
13670       return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : padAngle;
13671     };
13672
13673     arc.context = function(_) {
13674       return arguments.length ? ((context = _ == null ? null : _), arc) : context;
13675     };
13676
13677     return arc;
13678   }
13679
13680   function Linear(context) {
13681     this._context = context;
13682   }
13683
13684   Linear.prototype = {
13685     areaStart: function() {
13686       this._line = 0;
13687     },
13688     areaEnd: function() {
13689       this._line = NaN;
13690     },
13691     lineStart: function() {
13692       this._point = 0;
13693     },
13694     lineEnd: function() {
13695       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
13696       this._line = 1 - this._line;
13697     },
13698     point: function(x, y) {
13699       x = +x, y = +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;
13704       }
13705     }
13706   };
13707
13708   function curveLinear(context) {
13709     return new Linear(context);
13710   }
13711
13712   function x$3(p) {
13713     return p[0];
13714   }
13715
13716   function y$3(p) {
13717     return p[1];
13718   }
13719
13720   function line() {
13721     var x = x$3,
13722         y = y$3,
13723         defined = constant$a(true),
13724         context = null,
13725         curve = curveLinear,
13726         output = null;
13727
13728     function line(data) {
13729       var i,
13730           n = data.length,
13731           d,
13732           defined0 = false,
13733           buffer;
13734
13735       if (context == null) output = curve(buffer = path());
13736
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();
13741         }
13742         if (defined0) output.point(+x(d, i, data), +y(d, i, data));
13743       }
13744
13745       if (buffer) return output = null, buffer + "" || null;
13746     }
13747
13748     line.x = function(_) {
13749       return arguments.length ? (x = typeof _ === "function" ? _ : constant$a(+_), line) : x;
13750     };
13751
13752     line.y = function(_) {
13753       return arguments.length ? (y = typeof _ === "function" ? _ : constant$a(+_), line) : y;
13754     };
13755
13756     line.defined = function(_) {
13757       return arguments.length ? (defined = typeof _ === "function" ? _ : constant$a(!!_), line) : defined;
13758     };
13759
13760     line.curve = function(_) {
13761       return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
13762     };
13763
13764     line.context = function(_) {
13765       return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
13766     };
13767
13768     return line;
13769   }
13770
13771   function area() {
13772     var x0 = x$3,
13773         x1 = null,
13774         y0 = constant$a(0),
13775         y1 = y$3,
13776         defined = constant$a(true),
13777         context = null,
13778         curve = curveLinear,
13779         output = null;
13780
13781     function area(data) {
13782       var i,
13783           j,
13784           k,
13785           n = data.length,
13786           d,
13787           defined0 = false,
13788           buffer,
13789           x0z = new Array(n),
13790           y0z = new Array(n);
13791
13792       if (context == null) output = curve(buffer = path());
13793
13794       for (i = 0; i <= n; ++i) {
13795         if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13796           if (defined0 = !defined0) {
13797             j = i;
13798             output.areaStart();
13799             output.lineStart();
13800           } else {
13801             output.lineEnd();
13802             output.lineStart();
13803             for (k = i - 1; k >= j; --k) {
13804               output.point(x0z[k], y0z[k]);
13805             }
13806             output.lineEnd();
13807             output.areaEnd();
13808           }
13809         }
13810         if (defined0) {
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]);
13813         }
13814       }
13815
13816       if (buffer) return output = null, buffer + "" || null;
13817     }
13818
13819     function arealine() {
13820       return line().defined(defined).curve(curve).context(context);
13821     }
13822
13823     area.x = function(_) {
13824       return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$a(+_), x1 = null, area) : x0;
13825     };
13826
13827     area.x0 = function(_) {
13828       return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$a(+_), area) : x0;
13829     };
13830
13831     area.x1 = function(_) {
13832       return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), area) : x1;
13833     };
13834
13835     area.y = function(_) {
13836       return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$a(+_), y1 = null, area) : y0;
13837     };
13838
13839     area.y0 = function(_) {
13840       return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$a(+_), area) : y0;
13841     };
13842
13843     area.y1 = function(_) {
13844       return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), area) : y1;
13845     };
13846
13847     area.lineX0 =
13848     area.lineY0 = function() {
13849       return arealine().x(x0).y(y0);
13850     };
13851
13852     area.lineY1 = function() {
13853       return arealine().x(x0).y(y1);
13854     };
13855
13856     area.lineX1 = function() {
13857       return arealine().x(x1).y(y0);
13858     };
13859
13860     area.defined = function(_) {
13861       return arguments.length ? (defined = typeof _ === "function" ? _ : constant$a(!!_), area) : defined;
13862     };
13863
13864     area.curve = function(_) {
13865       return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
13866     };
13867
13868     area.context = function(_) {
13869       return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
13870     };
13871
13872     return area;
13873   }
13874
13875   function descending(a, b) {
13876     return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
13877   }
13878
13879   function identity$6(d) {
13880     return d;
13881   }
13882
13883   function pie() {
13884     var value = identity$6,
13885         sortValues = descending,
13886         sort = null,
13887         startAngle = constant$a(0),
13888         endAngle = constant$a(tau$4),
13889         padAngle = constant$a(0);
13890
13891     function pie(data) {
13892       var i,
13893           n = data.length,
13894           j,
13895           k,
13896           sum = 0,
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)),
13901           a1,
13902           p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
13903           pa = p * (da < 0 ? -1 : 1),
13904           v;
13905
13906       for (i = 0; i < n; ++i) {
13907         if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
13908           sum += v;
13909         }
13910       }
13911
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]); });
13915
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] = {
13919           data: data[j],
13920           index: i,
13921           value: v,
13922           startAngle: a0,
13923           endAngle: a1,
13924           padAngle: p
13925         };
13926       }
13927
13928       return arcs;
13929     }
13930
13931     pie.value = function(_) {
13932       return arguments.length ? (value = typeof _ === "function" ? _ : constant$a(+_), pie) : value;
13933     };
13934
13935     pie.sortValues = function(_) {
13936       return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
13937     };
13938
13939     pie.sort = function(_) {
13940       return arguments.length ? (sort = _, sortValues = null, pie) : sort;
13941     };
13942
13943     pie.startAngle = function(_) {
13944       return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : startAngle;
13945     };
13946
13947     pie.endAngle = function(_) {
13948       return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : endAngle;
13949     };
13950
13951     pie.padAngle = function(_) {
13952       return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : padAngle;
13953     };
13954
13955     return pie;
13956   }
13957
13958   var curveRadialLinear = curveRadial(curveLinear);
13959
13960   function Radial(curve) {
13961     this._curve = curve;
13962   }
13963
13964   Radial.prototype = {
13965     areaStart: function() {
13966       this._curve.areaStart();
13967     },
13968     areaEnd: function() {
13969       this._curve.areaEnd();
13970     },
13971     lineStart: function() {
13972       this._curve.lineStart();
13973     },
13974     lineEnd: function() {
13975       this._curve.lineEnd();
13976     },
13977     point: function(a, r) {
13978       this._curve.point(r * Math.sin(a), r * -Math.cos(a));
13979     }
13980   };
13981
13982   function curveRadial(curve) {
13983
13984     function radial(context) {
13985       return new Radial(curve(context));
13986     }
13987
13988     radial._curve = curve;
13989
13990     return radial;
13991   }
13992
13993   function lineRadial(l) {
13994     var c = l.curve;
13995
13996     l.angle = l.x, delete l.x;
13997     l.radius = l.y, delete l.y;
13998
13999     l.curve = function(_) {
14000       return arguments.length ? c(curveRadial(_)) : c()._curve;
14001     };
14002
14003     return l;
14004   }
14005
14006   function lineRadial$1() {
14007     return lineRadial(line().curve(curveRadialLinear));
14008   }
14009
14010   function areaRadial() {
14011     var a = area().curve(curveRadialLinear),
14012         c = a.curve,
14013         x0 = a.lineX0,
14014         x1 = a.lineX1,
14015         y0 = a.lineY0,
14016         y1 = a.lineY1;
14017
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;
14028
14029     a.curve = function(_) {
14030       return arguments.length ? c(curveRadial(_)) : c()._curve;
14031     };
14032
14033     return a;
14034   }
14035
14036   function pointRadial(x, y) {
14037     return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
14038   }
14039
14040   var slice$6 = Array.prototype.slice;
14041
14042   function linkSource(d) {
14043     return d.source;
14044   }
14045
14046   function linkTarget(d) {
14047     return d.target;
14048   }
14049
14050   function link$2(curve) {
14051     var source = linkSource,
14052         target = linkTarget,
14053         x = x$3,
14054         y = y$3,
14055         context = null;
14056
14057     function link() {
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.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));
14061       if (buffer) return context = null, buffer + "" || null;
14062     }
14063
14064     link.source = function(_) {
14065       return arguments.length ? (source = _, link) : source;
14066     };
14067
14068     link.target = function(_) {
14069       return arguments.length ? (target = _, link) : target;
14070     };
14071
14072     link.x = function(_) {
14073       return arguments.length ? (x = typeof _ === "function" ? _ : constant$a(+_), link) : x;
14074     };
14075
14076     link.y = function(_) {
14077       return arguments.length ? (y = typeof _ === "function" ? _ : constant$a(+_), link) : y;
14078     };
14079
14080     link.context = function(_) {
14081       return arguments.length ? ((context = _ == null ? null : _), link) : context;
14082     };
14083
14084     return link;
14085   }
14086
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);
14090   }
14091
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);
14095   }
14096
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]);
14104   }
14105
14106   function linkHorizontal() {
14107     return link$2(curveHorizontal);
14108   }
14109
14110   function linkVertical() {
14111     return link$2(curveVertical);
14112   }
14113
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;
14118     return l;
14119   }
14120
14121   var circle$2 = {
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);
14126     }
14127   };
14128
14129   var cross$2 = {
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();
14145     }
14146   };
14147
14148   var tan30 = Math.sqrt(1 / 3),
14149       tan30_2 = tan30 * 2;
14150
14151   var diamond = {
14152     draw: function(context, size) {
14153       var y = Math.sqrt(size / tan30_2),
14154           x = y * tan30;
14155       context.moveTo(0, -y);
14156       context.lineTo(x, 0);
14157       context.lineTo(0, y);
14158       context.lineTo(-x, 0);
14159       context.closePath();
14160     }
14161   };
14162
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;
14167
14168   var star = {
14169     draw: function(context, size) {
14170       var r = Math.sqrt(size * ka),
14171           x = kx * r,
14172           y = ky * r;
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,
14177             c = Math.cos(a),
14178             s = Math.sin(a);
14179         context.lineTo(s * r, -c * r);
14180         context.lineTo(c * x - s * y, s * x + c * y);
14181       }
14182       context.closePath();
14183     }
14184   };
14185
14186   var square = {
14187     draw: function(context, size) {
14188       var w = Math.sqrt(size),
14189           x = -w / 2;
14190       context.rect(x, x, w, w);
14191     }
14192   };
14193
14194   var sqrt3 = Math.sqrt(3);
14195
14196   var triangle = {
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();
14203     }
14204   };
14205
14206   var c = -0.5,
14207       s = Math.sqrt(3) / 2,
14208       k = 1 / Math.sqrt(12),
14209       a = (k / 2 + 1) * 3;
14210
14211   var wye = {
14212     draw: function(context, size) {
14213       var r = Math.sqrt(size / a),
14214           x0 = r / 2,
14215           y0 = r * k,
14216           x1 = x0,
14217           y1 = r * k + r,
14218           x2 = -x1,
14219           y2 = y1;
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();
14230     }
14231   };
14232
14233   var symbols = [
14234     circle$2,
14235     cross$2,
14236     diamond,
14237     square,
14238     star,
14239     triangle,
14240     wye
14241   ];
14242
14243   function symbol() {
14244     var type = constant$a(circle$2),
14245         size = constant$a(64),
14246         context = null;
14247
14248     function symbol() {
14249       var buffer;
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;
14253     }
14254
14255     symbol.type = function(_) {
14256       return arguments.length ? (type = typeof _ === "function" ? _ : constant$a(_), symbol) : type;
14257     };
14258
14259     symbol.size = function(_) {
14260       return arguments.length ? (size = typeof _ === "function" ? _ : constant$a(+_), symbol) : size;
14261     };
14262
14263     symbol.context = function(_) {
14264       return arguments.length ? (context = _ == null ? null : _, symbol) : context;
14265     };
14266
14267     return symbol;
14268   }
14269
14270   function noop$2() {}
14271
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
14280     );
14281   }
14282
14283   function Basis(context) {
14284     this._context = context;
14285   }
14286
14287   Basis.prototype = {
14288     areaStart: function() {
14289       this._line = 0;
14290     },
14291     areaEnd: function() {
14292       this._line = NaN;
14293     },
14294     lineStart: function() {
14295       this._x0 = this._x1 =
14296       this._y0 = this._y1 = NaN;
14297       this._point = 0;
14298     },
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;
14303       }
14304       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14305       this._line = 1 - this._line;
14306     },
14307     point: function(x, y) {
14308       x = +x, y = +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;
14314       }
14315       this._x0 = this._x1, this._x1 = x;
14316       this._y0 = this._y1, this._y1 = y;
14317     }
14318   };
14319
14320   function basis$2(context) {
14321     return new Basis(context);
14322   }
14323
14324   function BasisClosed(context) {
14325     this._context = context;
14326   }
14327
14328   BasisClosed.prototype = {
14329     areaStart: noop$2,
14330     areaEnd: noop$2,
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;
14334       this._point = 0;
14335     },
14336     lineEnd: function() {
14337       switch (this._point) {
14338         case 1: {
14339           this._context.moveTo(this._x2, this._y2);
14340           this._context.closePath();
14341           break;
14342         }
14343         case 2: {
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();
14347           break;
14348         }
14349         case 3: {
14350           this.point(this._x2, this._y2);
14351           this.point(this._x3, this._y3);
14352           this.point(this._x4, this._y4);
14353           break;
14354         }
14355       }
14356     },
14357     point: function(x, y) {
14358       x = +x, y = +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;
14364       }
14365       this._x0 = this._x1, this._x1 = x;
14366       this._y0 = this._y1, this._y1 = y;
14367     }
14368   };
14369
14370   function basisClosed$1(context) {
14371     return new BasisClosed(context);
14372   }
14373
14374   function BasisOpen(context) {
14375     this._context = context;
14376   }
14377
14378   BasisOpen.prototype = {
14379     areaStart: function() {
14380       this._line = 0;
14381     },
14382     areaEnd: function() {
14383       this._line = NaN;
14384     },
14385     lineStart: function() {
14386       this._x0 = this._x1 =
14387       this._y0 = this._y1 = NaN;
14388       this._point = 0;
14389     },
14390     lineEnd: function() {
14391       if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14392       this._line = 1 - this._line;
14393     },
14394     point: function(x, y) {
14395       x = +x, y = +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;
14402       }
14403       this._x0 = this._x1, this._x1 = x;
14404       this._y0 = this._y1, this._y1 = y;
14405     }
14406   };
14407
14408   function basisOpen(context) {
14409     return new BasisOpen(context);
14410   }
14411
14412   function Bundle(context, beta) {
14413     this._basis = new Basis(context);
14414     this._beta = beta;
14415   }
14416
14417   Bundle.prototype = {
14418     lineStart: function() {
14419       this._x = [];
14420       this._y = [];
14421       this._basis.lineStart();
14422     },
14423     lineEnd: function() {
14424       var x = this._x,
14425           y = this._y,
14426           j = x.length - 1;
14427
14428       if (j > 0) {
14429         var x0 = x[0],
14430             y0 = y[0],
14431             dx = x[j] - x0,
14432             dy = y[j] - y0,
14433             i = -1,
14434             t;
14435
14436         while (++i <= j) {
14437           t = i / j;
14438           this._basis.point(
14439             this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
14440             this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
14441           );
14442         }
14443       }
14444
14445       this._x = this._y = null;
14446       this._basis.lineEnd();
14447     },
14448     point: function(x, y) {
14449       this._x.push(+x);
14450       this._y.push(+y);
14451     }
14452   };
14453
14454   var bundle = (function custom(beta) {
14455
14456     function bundle(context) {
14457       return beta === 1 ? new Basis(context) : new Bundle(context, beta);
14458     }
14459
14460     bundle.beta = function(beta) {
14461       return custom(+beta);
14462     };
14463
14464     return bundle;
14465   })(0.85);
14466
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),
14473       that._x2,
14474       that._y2
14475     );
14476   }
14477
14478   function Cardinal(context, tension) {
14479     this._context = context;
14480     this._k = (1 - tension) / 6;
14481   }
14482
14483   Cardinal.prototype = {
14484     areaStart: function() {
14485       this._line = 0;
14486     },
14487     areaEnd: function() {
14488       this._line = NaN;
14489     },
14490     lineStart: function() {
14491       this._x0 = this._x1 = this._x2 =
14492       this._y0 = this._y1 = this._y2 = NaN;
14493       this._point = 0;
14494     },
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;
14499       }
14500       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14501       this._line = 1 - this._line;
14502     },
14503     point: function(x, y) {
14504       x = +x, y = +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;
14510       }
14511       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14512       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14513     }
14514   };
14515
14516   var cardinal = (function custom(tension) {
14517
14518     function cardinal(context) {
14519       return new Cardinal(context, tension);
14520     }
14521
14522     cardinal.tension = function(tension) {
14523       return custom(+tension);
14524     };
14525
14526     return cardinal;
14527   })(0);
14528
14529   function CardinalClosed(context, tension) {
14530     this._context = context;
14531     this._k = (1 - tension) / 6;
14532   }
14533
14534   CardinalClosed.prototype = {
14535     areaStart: noop$2,
14536     areaEnd: noop$2,
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;
14540       this._point = 0;
14541     },
14542     lineEnd: function() {
14543       switch (this._point) {
14544         case 1: {
14545           this._context.moveTo(this._x3, this._y3);
14546           this._context.closePath();
14547           break;
14548         }
14549         case 2: {
14550           this._context.lineTo(this._x3, this._y3);
14551           this._context.closePath();
14552           break;
14553         }
14554         case 3: {
14555           this.point(this._x3, this._y3);
14556           this.point(this._x4, this._y4);
14557           this.point(this._x5, this._y5);
14558           break;
14559         }
14560       }
14561     },
14562     point: function(x, y) {
14563       x = +x, y = +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;
14569       }
14570       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14571       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14572     }
14573   };
14574
14575   var cardinalClosed = (function custom(tension) {
14576
14577     function cardinal(context) {
14578       return new CardinalClosed(context, tension);
14579     }
14580
14581     cardinal.tension = function(tension) {
14582       return custom(+tension);
14583     };
14584
14585     return cardinal;
14586   })(0);
14587
14588   function CardinalOpen(context, tension) {
14589     this._context = context;
14590     this._k = (1 - tension) / 6;
14591   }
14592
14593   CardinalOpen.prototype = {
14594     areaStart: function() {
14595       this._line = 0;
14596     },
14597     areaEnd: function() {
14598       this._line = NaN;
14599     },
14600     lineStart: function() {
14601       this._x0 = this._x1 = this._x2 =
14602       this._y0 = this._y1 = this._y2 = NaN;
14603       this._point = 0;
14604     },
14605     lineEnd: function() {
14606       if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14607       this._line = 1 - this._line;
14608     },
14609     point: function(x, y) {
14610       x = +x, y = +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;
14617       }
14618       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14619       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14620     }
14621   };
14622
14623   var cardinalOpen = (function custom(tension) {
14624
14625     function cardinal(context) {
14626       return new CardinalOpen(context, tension);
14627     }
14628
14629     cardinal.tension = function(tension) {
14630       return custom(+tension);
14631     };
14632
14633     return cardinal;
14634   })(0);
14635
14636   function point$4(that, x, y) {
14637     var x1 = that._x1,
14638         y1 = that._y1,
14639         x2 = that._x2,
14640         y2 = that._y2;
14641
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;
14647     }
14648
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;
14654     }
14655
14656     that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
14657   }
14658
14659   function CatmullRom(context, alpha) {
14660     this._context = context;
14661     this._alpha = alpha;
14662   }
14663
14664   CatmullRom.prototype = {
14665     areaStart: function() {
14666       this._line = 0;
14667     },
14668     areaEnd: function() {
14669       this._line = NaN;
14670     },
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 =
14676       this._point = 0;
14677     },
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;
14682       }
14683       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14684       this._line = 1 - this._line;
14685     },
14686     point: function(x, y) {
14687       x = +x, y = +y;
14688
14689       if (this._point) {
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));
14693       }
14694
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;
14700       }
14701
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;
14706     }
14707   };
14708
14709   var catmullRom = (function custom(alpha) {
14710
14711     function catmullRom(context) {
14712       return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
14713     }
14714
14715     catmullRom.alpha = function(alpha) {
14716       return custom(+alpha);
14717     };
14718
14719     return catmullRom;
14720   })(0.5);
14721
14722   function CatmullRomClosed(context, alpha) {
14723     this._context = context;
14724     this._alpha = alpha;
14725   }
14726
14727   CatmullRomClosed.prototype = {
14728     areaStart: noop$2,
14729     areaEnd: noop$2,
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 =
14735       this._point = 0;
14736     },
14737     lineEnd: function() {
14738       switch (this._point) {
14739         case 1: {
14740           this._context.moveTo(this._x3, this._y3);
14741           this._context.closePath();
14742           break;
14743         }
14744         case 2: {
14745           this._context.lineTo(this._x3, this._y3);
14746           this._context.closePath();
14747           break;
14748         }
14749         case 3: {
14750           this.point(this._x3, this._y3);
14751           this.point(this._x4, this._y4);
14752           this.point(this._x5, this._y5);
14753           break;
14754         }
14755       }
14756     },
14757     point: function(x, y) {
14758       x = +x, y = +y;
14759
14760       if (this._point) {
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));
14764       }
14765
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;
14771       }
14772
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;
14777     }
14778   };
14779
14780   var catmullRomClosed = (function custom(alpha) {
14781
14782     function catmullRom(context) {
14783       return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
14784     }
14785
14786     catmullRom.alpha = function(alpha) {
14787       return custom(+alpha);
14788     };
14789
14790     return catmullRom;
14791   })(0.5);
14792
14793   function CatmullRomOpen(context, alpha) {
14794     this._context = context;
14795     this._alpha = alpha;
14796   }
14797
14798   CatmullRomOpen.prototype = {
14799     areaStart: function() {
14800       this._line = 0;
14801     },
14802     areaEnd: function() {
14803       this._line = NaN;
14804     },
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 =
14810       this._point = 0;
14811     },
14812     lineEnd: function() {
14813       if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14814       this._line = 1 - this._line;
14815     },
14816     point: function(x, y) {
14817       x = +x, y = +y;
14818
14819       if (this._point) {
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));
14823       }
14824
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;
14831       }
14832
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;
14837     }
14838   };
14839
14840   var catmullRomOpen = (function custom(alpha) {
14841
14842     function catmullRom(context) {
14843       return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
14844     }
14845
14846     catmullRom.alpha = function(alpha) {
14847       return custom(+alpha);
14848     };
14849
14850     return catmullRom;
14851   })(0.5);
14852
14853   function LinearClosed(context) {
14854     this._context = context;
14855   }
14856
14857   LinearClosed.prototype = {
14858     areaStart: noop$2,
14859     areaEnd: noop$2,
14860     lineStart: function() {
14861       this._point = 0;
14862     },
14863     lineEnd: function() {
14864       if (this._point) this._context.closePath();
14865     },
14866     point: function(x, y) {
14867       x = +x, y = +y;
14868       if (this._point) this._context.lineTo(x, y);
14869       else this._point = 1, this._context.moveTo(x, y);
14870     }
14871   };
14872
14873   function linearClosed(context) {
14874     return new LinearClosed(context);
14875   }
14876
14877   function sign$1(x) {
14878     return x < 0 ? -1 : 1;
14879   }
14880
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;
14892   }
14893
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;
14898   }
14899
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) {
14904     var x0 = that._x0,
14905         y0 = that._y0,
14906         x1 = that._x1,
14907         y1 = that._y1,
14908         dx = (x1 - x0) / 3;
14909     that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
14910   }
14911
14912   function MonotoneX(context) {
14913     this._context = context;
14914   }
14915
14916   MonotoneX.prototype = {
14917     areaStart: function() {
14918       this._line = 0;
14919     },
14920     areaEnd: function() {
14921       this._line = NaN;
14922     },
14923     lineStart: function() {
14924       this._x0 = this._x1 =
14925       this._y0 = this._y1 =
14926       this._t0 = NaN;
14927       this._point = 0;
14928     },
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;
14933       }
14934       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14935       this._line = 1 - this._line;
14936     },
14937     point: function(x, y) {
14938       var t1 = NaN;
14939
14940       x = +x, y = +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;
14947       }
14948
14949       this._x0 = this._x1, this._x1 = x;
14950       this._y0 = this._y1, this._y1 = y;
14951       this._t0 = t1;
14952     }
14953   };
14954
14955   function MonotoneY(context) {
14956     this._context = new ReflectContext(context);
14957   }
14958
14959   (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
14960     MonotoneX.prototype.point.call(this, y, x);
14961   };
14962
14963   function ReflectContext(context) {
14964     this._context = context;
14965   }
14966
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); }
14972   };
14973
14974   function monotoneX(context) {
14975     return new MonotoneX(context);
14976   }
14977
14978   function monotoneY(context) {
14979     return new MonotoneY(context);
14980   }
14981
14982   function Natural(context) {
14983     this._context = context;
14984   }
14985
14986   Natural.prototype = {
14987     areaStart: function() {
14988       this._line = 0;
14989     },
14990     areaEnd: function() {
14991       this._line = NaN;
14992     },
14993     lineStart: function() {
14994       this._x = [];
14995       this._y = [];
14996     },
14997     lineEnd: function() {
14998       var x = this._x,
14999           y = this._y,
15000           n = x.length;
15001
15002       if (n) {
15003         this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
15004         if (n === 2) {
15005           this._context.lineTo(x[1], y[1]);
15006         } else {
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]);
15011           }
15012         }
15013       }
15014
15015       if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
15016       this._line = 1 - this._line;
15017       this._x = this._y = null;
15018     },
15019     point: function(x, y) {
15020       this._x.push(+x);
15021       this._y.push(+y);
15022     }
15023   };
15024
15025   // See https://www.particleincell.com/2012/bezier-splines/ for derivation.
15026   function controlPoints(x) {
15027     var i,
15028         n = x.length - 1,
15029         m,
15030         a = new Array(n),
15031         b = new Array(n),
15032         r = new Array(n);
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];
15041     return [a, b];
15042   }
15043
15044   function natural(context) {
15045     return new Natural(context);
15046   }
15047
15048   function Step(context, t) {
15049     this._context = context;
15050     this._t = t;
15051   }
15052
15053   Step.prototype = {
15054     areaStart: function() {
15055       this._line = 0;
15056     },
15057     areaEnd: function() {
15058       this._line = NaN;
15059     },
15060     lineStart: function() {
15061       this._x = this._y = NaN;
15062       this._point = 0;
15063     },
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;
15068     },
15069     point: function(x, y) {
15070       x = +x, y = +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
15074         default: {
15075           if (this._t <= 0) {
15076             this._context.lineTo(this._x, y);
15077             this._context.lineTo(x, y);
15078           } else {
15079             var x1 = this._x * (1 - this._t) + x * this._t;
15080             this._context.lineTo(x1, this._y);
15081             this._context.lineTo(x1, y);
15082           }
15083           break;
15084         }
15085       }
15086       this._x = x, this._y = y;
15087     }
15088   };
15089
15090   function step(context) {
15091     return new Step(context, 0.5);
15092   }
15093
15094   function stepBefore(context) {
15095     return new Step(context, 0);
15096   }
15097
15098   function stepAfter(context) {
15099     return new Step(context, 1);
15100   }
15101
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];
15108       }
15109     }
15110   }
15111
15112   function none$2(series) {
15113     var n = series.length, o = new Array(n);
15114     while (--n >= 0) o[n] = n;
15115     return o;
15116   }
15117
15118   function stackValue(d, key) {
15119     return d[key];
15120   }
15121
15122   function stack() {
15123     var keys = constant$a([]),
15124         order = none$2,
15125         offset = none$1,
15126         value = stackValue;
15127
15128     function stack(data) {
15129       var kz = keys.apply(this, arguments),
15130           i,
15131           m = data.length,
15132           n = kz.length,
15133           sz = new Array(n),
15134           oz;
15135
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];
15140         }
15141         si.key = ki;
15142       }
15143
15144       for (i = 0, oz = order(sz); i < n; ++i) {
15145         sz[oz[i]].index = i;
15146       }
15147
15148       offset(sz, oz);
15149       return sz;
15150     }
15151
15152     stack.keys = function(_) {
15153       return arguments.length ? (keys = typeof _ === "function" ? _ : constant$a(slice$6.call(_)), stack) : keys;
15154     };
15155
15156     stack.value = function(_) {
15157       return arguments.length ? (value = typeof _ === "function" ? _ : constant$a(+_), stack) : value;
15158     };
15159
15160     stack.order = function(_) {
15161       return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$a(slice$6.call(_)), stack) : order;
15162     };
15163
15164     stack.offset = function(_) {
15165       return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset;
15166     };
15167
15168     return stack;
15169   }
15170
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;
15176     }
15177     none$1(series, order);
15178   }
15179
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;
15188         } else {
15189           d[0] = yp;
15190         }
15191       }
15192     }
15193   }
15194
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;
15200     }
15201     none$1(series, order);
15202   }
15203
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;
15216           s3 += skj0 - skj1;
15217         }
15218         s1 += sij0, s2 += s3 * sij0;
15219       }
15220       s0[j - 1][1] += s0[j - 1][0] = y;
15221       if (s1) y -= s2 / s1;
15222     }
15223     s0[j - 1][1] += s0[j - 1][0] = y;
15224     none$1(series, order);
15225   }
15226
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]; });
15230   }
15231
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;
15235     return s;
15236   }
15237
15238   function descending$1(series) {
15239     return ascending$2(series).reverse();
15240   }
15241
15242   function insideOut(series) {
15243     var n = series.length,
15244         i,
15245         j,
15246         sums = series.map(sum$2),
15247         order = none$2(series).sort(function(a, b) { return sums[b] - sums[a]; }),
15248         top = 0,
15249         bottom = 0,
15250         tops = [],
15251         bottoms = [];
15252
15253     for (i = 0; i < n; ++i) {
15254       j = order[i];
15255       if (top < bottom) {
15256         top += sums[j];
15257         tops.push(j);
15258       } else {
15259         bottom += sums[j];
15260         bottoms.push(j);
15261       }
15262     }
15263
15264     return bottoms.reverse().concat(tops);
15265   }
15266
15267   function reverse(series) {
15268     return none$2(series).reverse();
15269   }
15270
15271   function constant$b(x) {
15272     return function() {
15273       return x;
15274     };
15275   }
15276
15277   function x$4(d) {
15278     return d[0];
15279   }
15280
15281   function y$4(d) {
15282     return d[1];
15283   }
15284
15285   function RedBlackTree() {
15286     this._ = null; // root node
15287   }
15288
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
15296   }
15297
15298   RedBlackTree.prototype = {
15299     constructor: RedBlackTree,
15300
15301     insert: function(after, node) {
15302       var parent, grandpa, uncle;
15303
15304       if (after) {
15305         node.P = after;
15306         node.N = after.N;
15307         if (after.N) after.N.P = node;
15308         after.N = node;
15309         if (after.R) {
15310           after = after.R;
15311           while (after.L) after = after.L;
15312           after.L = node;
15313         } else {
15314           after.R = node;
15315         }
15316         parent = after;
15317       } else if (this._) {
15318         after = RedBlackFirst(this._);
15319         node.P = null;
15320         node.N = after;
15321         after.P = after.L = node;
15322         parent = after;
15323       } else {
15324         node.P = node.N = null;
15325         this._ = node;
15326         parent = null;
15327       }
15328       node.L = node.R = null;
15329       node.U = parent;
15330       node.C = true;
15331
15332       after = node;
15333       while (parent && parent.C) {
15334         grandpa = parent.U;
15335         if (parent === grandpa.L) {
15336           uncle = grandpa.R;
15337           if (uncle && uncle.C) {
15338             parent.C = uncle.C = false;
15339             grandpa.C = true;
15340             after = grandpa;
15341           } else {
15342             if (after === parent.R) {
15343               RedBlackRotateLeft(this, parent);
15344               after = parent;
15345               parent = after.U;
15346             }
15347             parent.C = false;
15348             grandpa.C = true;
15349             RedBlackRotateRight(this, grandpa);
15350           }
15351         } else {
15352           uncle = grandpa.L;
15353           if (uncle && uncle.C) {
15354             parent.C = uncle.C = false;
15355             grandpa.C = true;
15356             after = grandpa;
15357           } else {
15358             if (after === parent.L) {
15359               RedBlackRotateRight(this, parent);
15360               after = parent;
15361               parent = after.U;
15362             }
15363             parent.C = false;
15364             grandpa.C = true;
15365             RedBlackRotateLeft(this, grandpa);
15366           }
15367         }
15368         parent = after.U;
15369       }
15370       this._.C = false;
15371     },
15372
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;
15377
15378       var parent = node.U,
15379           sibling,
15380           left = node.L,
15381           right = node.R,
15382           next,
15383           red;
15384
15385       if (!left) next = right;
15386       else if (!right) next = left;
15387       else next = RedBlackFirst(right);
15388
15389       if (parent) {
15390         if (parent.L === node) parent.L = next;
15391         else parent.R = next;
15392       } else {
15393         this._ = next;
15394       }
15395
15396       if (left && right) {
15397         red = next.C;
15398         next.C = node.C;
15399         next.L = left;
15400         left.U = next;
15401         if (next !== right) {
15402           parent = next.U;
15403           next.U = node.U;
15404           node = next.R;
15405           parent.L = node;
15406           next.R = right;
15407           right.U = next;
15408         } else {
15409           next.U = parent;
15410           parent = next;
15411           node = next.R;
15412         }
15413       } else {
15414         red = node.C;
15415         node = next;
15416       }
15417
15418       if (node) node.U = parent;
15419       if (red) return;
15420       if (node && node.C) { node.C = false; return; }
15421
15422       do {
15423         if (node === this._) break;
15424         if (node === parent.L) {
15425           sibling = parent.R;
15426           if (sibling.C) {
15427             sibling.C = false;
15428             parent.C = true;
15429             RedBlackRotateLeft(this, parent);
15430             sibling = parent.R;
15431           }
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;
15436               sibling.C = true;
15437               RedBlackRotateRight(this, sibling);
15438               sibling = parent.R;
15439             }
15440             sibling.C = parent.C;
15441             parent.C = sibling.R.C = false;
15442             RedBlackRotateLeft(this, parent);
15443             node = this._;
15444             break;
15445           }
15446         } else {
15447           sibling = parent.L;
15448           if (sibling.C) {
15449             sibling.C = false;
15450             parent.C = true;
15451             RedBlackRotateRight(this, parent);
15452             sibling = parent.L;
15453           }
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;
15458               sibling.C = true;
15459               RedBlackRotateLeft(this, sibling);
15460               sibling = parent.L;
15461             }
15462             sibling.C = parent.C;
15463             parent.C = sibling.L.C = false;
15464             RedBlackRotateRight(this, parent);
15465             node = this._;
15466             break;
15467           }
15468         }
15469         sibling.C = true;
15470         node = parent;
15471         parent = parent.U;
15472       } while (!node.C);
15473
15474       if (node) node.C = false;
15475     }
15476   };
15477
15478   function RedBlackRotateLeft(tree, node) {
15479     var p = node,
15480         q = node.R,
15481         parent = p.U;
15482
15483     if (parent) {
15484       if (parent.L === p) parent.L = q;
15485       else parent.R = q;
15486     } else {
15487       tree._ = q;
15488     }
15489
15490     q.U = parent;
15491     p.U = q;
15492     p.R = q.L;
15493     if (p.R) p.R.U = p;
15494     q.L = p;
15495   }
15496
15497   function RedBlackRotateRight(tree, node) {
15498     var p = node,
15499         q = node.L,
15500         parent = p.U;
15501
15502     if (parent) {
15503       if (parent.L === p) parent.L = q;
15504       else parent.R = q;
15505     } else {
15506       tree._ = q;
15507     }
15508
15509     q.U = parent;
15510     p.U = q;
15511     p.L = q.R;
15512     if (p.L) p.L.U = p;
15513     q.R = p;
15514   }
15515
15516   function RedBlackFirst(node) {
15517     while (node.L) node = node.L;
15518     return node;
15519   }
15520
15521   function createEdge(left, right, v0, v1) {
15522     var edge = [null, null],
15523         index = edges.push(edge) - 1;
15524     edge.left = left;
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);
15530     return edge;
15531   }
15532
15533   function createBorderEdge(left, v0, v1) {
15534     var edge = [v0, v1];
15535     edge.left = left;
15536     return edge;
15537   }
15538
15539   function setEdgeEnd(edge, left, right, vertex) {
15540     if (!edge[0] && !edge[1]) {
15541       edge[0] = vertex;
15542       edge.left = left;
15543       edge.right = right;
15544     } else if (edge.left === right) {
15545       edge[1] = vertex;
15546     } else {
15547       edge[0] = vertex;
15548     }
15549   }
15550
15551   // Liang–Barsky line clipping.
15552   function clipEdge(edge, x0, y0, x1, y1) {
15553     var a = edge[0],
15554         b = edge[1],
15555         ax = a[0],
15556         ay = a[1],
15557         bx = b[0],
15558         by = b[1],
15559         t0 = 0,
15560         t1 = 1,
15561         dx = bx - ax,
15562         dy = by - ay,
15563         r;
15564
15565     r = x0 - ax;
15566     if (!dx && r > 0) return;
15567     r /= dx;
15568     if (dx < 0) {
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;
15574     }
15575
15576     r = x1 - ax;
15577     if (!dx && r < 0) return;
15578     r /= dx;
15579     if (dx < 0) {
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;
15585     }
15586
15587     r = y0 - ay;
15588     if (!dy && r > 0) return;
15589     r /= dy;
15590     if (dy < 0) {
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;
15596     }
15597
15598     r = y1 - ay;
15599     if (!dy && r < 0) return;
15600     r /= dy;
15601     if (dy < 0) {
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;
15607     }
15608
15609     if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
15610
15611     if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
15612     if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
15613     return true;
15614   }
15615
15616   function connectEdge(edge, x0, y0, x1, y1) {
15617     var v1 = edge[1];
15618     if (v1) return true;
15619
15620     var v0 = edge[0],
15621         left = edge.left,
15622         right = edge.right,
15623         lx = left[0],
15624         ly = left[1],
15625         rx = right[0],
15626         ry = right[1],
15627         fx = (lx + rx) / 2,
15628         fy = (ly + ry) / 2,
15629         fm,
15630         fb;
15631
15632     if (ry === ly) {
15633       if (fx < x0 || fx >= x1) return;
15634       if (lx > rx) {
15635         if (!v0) v0 = [fx, y0];
15636         else if (v0[1] >= y1) return;
15637         v1 = [fx, y1];
15638       } else {
15639         if (!v0) v0 = [fx, y1];
15640         else if (v0[1] < y0) return;
15641         v1 = [fx, y0];
15642       }
15643     } else {
15644       fm = (lx - rx) / (ry - ly);
15645       fb = fy - fm * fx;
15646       if (fm < -1 || fm > 1) {
15647         if (lx > rx) {
15648           if (!v0) v0 = [(y0 - fb) / fm, y0];
15649           else if (v0[1] >= y1) return;
15650           v1 = [(y1 - fb) / fm, y1];
15651         } else {
15652           if (!v0) v0 = [(y1 - fb) / fm, y1];
15653           else if (v0[1] < y0) return;
15654           v1 = [(y0 - fb) / fm, y0];
15655         }
15656       } else {
15657         if (ly < ry) {
15658           if (!v0) v0 = [x0, fm * x0 + fb];
15659           else if (v0[0] >= x1) return;
15660           v1 = [x1, fm * x1 + fb];
15661         } else {
15662           if (!v0) v0 = [x1, fm * x1 + fb];
15663           else if (v0[0] < x0) return;
15664           v1 = [x0, fm * x0 + fb];
15665         }
15666       }
15667     }
15668
15669     edge[0] = v0;
15670     edge[1] = v1;
15671     return true;
15672   }
15673
15674   function clipEdges(x0, y0, x1, y1) {
15675     var i = edges.length,
15676         edge;
15677
15678     while (i--) {
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)) {
15683         delete edges[i];
15684       }
15685     }
15686   }
15687
15688   function createCell(site) {
15689     return cells[site.index] = {
15690       site: site,
15691       halfedges: []
15692     };
15693   }
15694
15695   function cellHalfedgeAngle(cell, edge) {
15696     var site = cell.site,
15697         va = edge.left,
15698         vb = edge.right;
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]);
15704   }
15705
15706   function cellHalfedgeStart(cell, edge) {
15707     return edge[+(edge.left !== cell.site)];
15708   }
15709
15710   function cellHalfedgeEnd(cell, edge) {
15711     return edge[+(edge.left === cell.site)];
15712   }
15713
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];
15723       }
15724     }
15725   }
15726
15727   function clipCells(x0, y0, x1, y1) {
15728     var nCells = cells.length,
15729         iCell,
15730         cell,
15731         site,
15732         iHalfedge,
15733         halfedges,
15734         nHalfedges,
15735         start,
15736         startX,
15737         startY,
15738         end,
15739         endX,
15740         endY,
15741         cover = true;
15742
15743     for (iCell = 0; iCell < nCells; ++iCell) {
15744       if (cell = cells[iCell]) {
15745         site = cell.site;
15746         halfedges = cell.halfedges;
15747         iHalfedge = halfedges.length;
15748
15749         // Remove any dangling clipped edges.
15750         while (iHalfedge--) {
15751           if (!edges[halfedges[iHalfedge]]) {
15752             halfedges.splice(iHalfedge, 1);
15753           }
15754         }
15755
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]
15767                 : null)) - 1);
15768             ++nHalfedges;
15769           }
15770         }
15771
15772         if (nHalfedges) cover = false;
15773       }
15774     }
15775
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!
15778     if (cover) {
15779       var dx, dy, d2, dc = Infinity;
15780
15781       for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
15782         if (cell = cells[iCell]) {
15783           site = cell.site;
15784           dx = site[0] - x0;
15785           dy = site[1] - y0;
15786           d2 = dx * dx + dy * dy;
15787           if (d2 < dc) dc = d2, cover = cell;
15788         }
15789       }
15790
15791       if (cover) {
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
15798         );
15799       }
15800     }
15801
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];
15807         }
15808       }
15809     }
15810   }
15811
15812   var circlePool = [];
15813
15814   var firstCircle;
15815
15816   function Circle() {
15817     RedBlackNode(this);
15818     this.x =
15819     this.y =
15820     this.arc =
15821     this.site =
15822     this.cy = null;
15823   }
15824
15825   function attachCircle(arc) {
15826     var lArc = arc.P,
15827         rArc = arc.N;
15828
15829     if (!lArc || !rArc) return;
15830
15831     var lSite = lArc.site,
15832         cSite = arc.site,
15833         rSite = rArc.site;
15834
15835     if (lSite === rSite) return;
15836
15837     var bx = cSite[0],
15838         by = cSite[1],
15839         ax = lSite[0] - bx,
15840         ay = lSite[1] - by,
15841         cx = rSite[0] - bx,
15842         cy = rSite[1] - by;
15843
15844     var d = 2 * (ax * cy - ay * cx);
15845     if (d >= -epsilon2$2) return;
15846
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;
15851
15852     var circle = circlePool.pop() || new Circle;
15853     circle.arc = arc;
15854     circle.site = cSite;
15855     circle.x = x + bx;
15856     circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
15857
15858     arc.circle = circle;
15859
15860     var before = null,
15861         node = circles._;
15862
15863     while (node) {
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; }
15867       } else {
15868         if (node.R) node = node.R;
15869         else { before = node; break; }
15870       }
15871     }
15872
15873     circles.insert(before, circle);
15874     if (!before) firstCircle = circle;
15875   }
15876
15877   function detachCircle(arc) {
15878     var circle = arc.circle;
15879     if (circle) {
15880       if (!circle.P) firstCircle = circle.N;
15881       circles.remove(circle);
15882       circlePool.push(circle);
15883       RedBlackNode(circle);
15884       arc.circle = null;
15885     }
15886   }
15887
15888   var beachPool = [];
15889
15890   function Beach() {
15891     RedBlackNode(this);
15892     this.edge =
15893     this.site =
15894     this.circle = null;
15895   }
15896
15897   function createBeach(site) {
15898     var beach = beachPool.pop() || new Beach;
15899     beach.site = site;
15900     return beach;
15901   }
15902
15903   function detachBeach(beach) {
15904     detachCircle(beach);
15905     beaches.remove(beach);
15906     beachPool.push(beach);
15907     RedBlackNode(beach);
15908   }
15909
15910   function removeBeach(beach) {
15911     var circle = beach.circle,
15912         x = circle.x,
15913         y = circle.cy,
15914         vertex = [x, y],
15915         previous = beach.P,
15916         next = beach.N,
15917         disappearing = [beach];
15918
15919     detachBeach(beach);
15920
15921     var lArc = previous;
15922     while (lArc.circle
15923         && Math.abs(x - lArc.circle.x) < epsilon$4
15924         && Math.abs(y - lArc.circle.cy) < epsilon$4) {
15925       previous = lArc.P;
15926       disappearing.unshift(lArc);
15927       detachBeach(lArc);
15928       lArc = previous;
15929     }
15930
15931     disappearing.unshift(lArc);
15932     detachCircle(lArc);
15933
15934     var rArc = next;
15935     while (rArc.circle
15936         && Math.abs(x - rArc.circle.x) < epsilon$4
15937         && Math.abs(y - rArc.circle.cy) < epsilon$4) {
15938       next = rArc.N;
15939       disappearing.push(rArc);
15940       detachBeach(rArc);
15941       rArc = next;
15942     }
15943
15944     disappearing.push(rArc);
15945     detachCircle(rArc);
15946
15947     var nArcs = disappearing.length,
15948         iArc;
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);
15953     }
15954
15955     lArc = disappearing[0];
15956     rArc = disappearing[nArcs - 1];
15957     rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
15958
15959     attachCircle(lArc);
15960     attachCircle(rArc);
15961   }
15962
15963   function addBeach(site) {
15964     var x = site[0],
15965         directrix = site[1],
15966         lArc,
15967         rArc,
15968         dxl,
15969         dxr,
15970         node = beaches._;
15971
15972     while (node) {
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) {
15977           if (!node.R) {
15978             lArc = node;
15979             break;
15980           }
15981           node = node.R;
15982         } else {
15983           if (dxl > -epsilon$4) {
15984             lArc = node.P;
15985             rArc = node;
15986           } else if (dxr > -epsilon$4) {
15987             lArc = node;
15988             rArc = node.N;
15989           } else {
15990             lArc = rArc = node;
15991           }
15992           break;
15993         }
15994       }
15995     }
15996
15997     createCell(site);
15998     var newArc = createBeach(site);
15999     beaches.insert(lArc, newArc);
16000
16001     if (!lArc && !rArc) return;
16002
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);
16010       return;
16011     }
16012
16013     if (!rArc) { // && lArc
16014       newArc.edge = createEdge(lArc.site, newArc.site);
16015       return;
16016     }
16017
16018     // else lArc !== rArc
16019     detachCircle(lArc);
16020     detachCircle(rArc);
16021
16022     var lSite = lArc.site,
16023         ax = lSite[0],
16024         ay = lSite[1],
16025         bx = site[0] - ax,
16026         by = site[1] - ay,
16027         rSite = rArc.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];
16034
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);
16040   }
16041
16042   function leftBreakPoint(arc, directrix) {
16043     var site = arc.site,
16044         rfocx = site[0],
16045         rfocy = site[1],
16046         pby2 = rfocy - directrix;
16047
16048     if (!pby2) return rfocx;
16049
16050     var lArc = arc.P;
16051     if (!lArc) return -Infinity;
16052
16053     site = lArc.site;
16054     var lfocx = site[0],
16055         lfocy = site[1],
16056         plby2 = lfocy - directrix;
16057
16058     if (!plby2) return lfocx;
16059
16060     var hl = lfocx - rfocx,
16061         aby2 = 1 / pby2 - 1 / plby2,
16062         b = hl / plby2;
16063
16064     if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
16065
16066     return (rfocx + lfocx) / 2;
16067   }
16068
16069   function rightBreakPoint(arc, directrix) {
16070     var rArc = arc.N;
16071     if (rArc) return leftBreakPoint(rArc, directrix);
16072     var site = arc.site;
16073     return site[1] === directrix ? site[0] : Infinity;
16074   }
16075
16076   var epsilon$4 = 1e-6;
16077   var epsilon2$2 = 1e-12;
16078   var beaches;
16079   var cells;
16080   var circles;
16081   var edges;
16082
16083   function triangleArea(a, b, c) {
16084     return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
16085   }
16086
16087   function lexicographic(a, b) {
16088     return b[1] - a[1]
16089         || b[0] - a[0];
16090   }
16091
16092   function Diagram(sites, extent) {
16093     var site = sites.sort(lexicographic).pop(),
16094         x,
16095         y,
16096         circle;
16097
16098     edges = [];
16099     cells = new Array(sites.length);
16100     beaches = new RedBlackTree;
16101     circles = new RedBlackTree;
16102
16103     while (true) {
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) {
16107           addBeach(site);
16108           x = site[0], y = site[1];
16109         }
16110         site = sites.pop();
16111       } else if (circle) {
16112         removeBeach(circle.arc);
16113       } else {
16114         break;
16115       }
16116     }
16117
16118     sortCellHalfedges();
16119
16120     if (extent) {
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);
16127     }
16128
16129     this.edges = edges;
16130     this.cells = cells;
16131
16132     beaches =
16133     circles =
16134     edges =
16135     cells = null;
16136   }
16137
16138   Diagram.prototype = {
16139     constructor: Diagram,
16140
16141     polygons: function() {
16142       var edges = this.edges;
16143
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;
16147         return polygon;
16148       });
16149     },
16150
16151     triangles: function() {
16152       var triangles = [],
16153           edges = this.edges;
16154
16155       this.cells.forEach(function(cell, i) {
16156         if (!(m = (halfedges = cell.halfedges).length)) return;
16157         var site = cell.site,
16158             halfedges,
16159             j = -1,
16160             m,
16161             s0,
16162             e1 = edges[halfedges[m - 1]],
16163             s1 = e1.left === site ? e1.right : e1.left;
16164
16165         while (++j < m) {
16166           s0 = s1;
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]);
16171           }
16172         }
16173       });
16174
16175       return triangles;
16176     },
16177
16178     links: function() {
16179       return this.edges.filter(function(edge) {
16180         return edge.right;
16181       }).map(function(edge) {
16182         return {
16183           source: edge.left.data,
16184           target: edge.right.data
16185         };
16186       });
16187     },
16188
16189     find: function(x, y, radius) {
16190       var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
16191
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;
16195
16196       // Traverse the half-edges to find a closer cell, if any.
16197       do {
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;
16204         });
16205       } while (i1 !== null);
16206
16207       that._found = i0;
16208
16209       return radius == null || d2 <= radius * radius ? cell.site : null;
16210     }
16211   };
16212
16213   function voronoi() {
16214     var x = x$4,
16215         y = y$4,
16216         extent = null;
16217
16218     function voronoi(data) {
16219       return new Diagram(data.map(function(d, i) {
16220         var s = [Math.round(x(d, i, data) / epsilon$4) * epsilon$4, Math.round(y(d, i, data) / epsilon$4) * epsilon$4];
16221         s.index = i;
16222         s.data = d;
16223         return s;
16224       }), extent);
16225     }
16226
16227     voronoi.polygons = function(data) {
16228       return voronoi(data).polygons();
16229     };
16230
16231     voronoi.links = function(data) {
16232       return voronoi(data).links();
16233     };
16234
16235     voronoi.triangles = function(data) {
16236       return voronoi(data).triangles();
16237     };
16238
16239     voronoi.x = function(_) {
16240       return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), voronoi) : x;
16241     };
16242
16243     voronoi.y = function(_) {
16244       return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), voronoi) : y;
16245     };
16246
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]]];
16249     };
16250
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]];
16253     };
16254
16255     return voronoi;
16256   }
16257
16258   function constant$c(x) {
16259     return function() {
16260       return x;
16261     };
16262   }
16263
16264   function ZoomEvent(target, type, transform) {
16265     this.target = target;
16266     this.type = type;
16267     this.transform = transform;
16268   }
16269
16270   function Transform(k, x, y) {
16271     this.k = k;
16272     this.x = x;
16273     this.y = y;
16274   }
16275
16276   Transform.prototype = {
16277     constructor: Transform,
16278     scale: function(k) {
16279       return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
16280     },
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);
16283     },
16284     apply: function(point) {
16285       return [point[0] * this.k + this.x, point[1] * this.k + this.y];
16286     },
16287     applyX: function(x) {
16288       return x * this.k + this.x;
16289     },
16290     applyY: function(y) {
16291       return y * this.k + this.y;
16292     },
16293     invert: function(location) {
16294       return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
16295     },
16296     invertX: function(x) {
16297       return (x - this.x) / this.k;
16298     },
16299     invertY: function(y) {
16300       return (y - this.y) / this.k;
16301     },
16302     rescaleX: function(x) {
16303       return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
16304     },
16305     rescaleY: function(y) {
16306       return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
16307     },
16308     toString: function() {
16309       return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
16310     }
16311   };
16312
16313   var identity$7 = new Transform(1, 0, 0);
16314
16315   transform.prototype = Transform.prototype;
16316
16317   function transform(node) {
16318     return node.__zoom || identity$7;
16319   }
16320
16321   function nopropagation$2() {
16322     event.stopImmediatePropagation();
16323   }
16324
16325   function noevent$2() {
16326     event.preventDefault();
16327     event.stopImmediatePropagation();
16328   }
16329
16330   // Ignore right-click, since that should open the context menu.
16331   function defaultFilter$2() {
16332     return !event.button;
16333   }
16334
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;
16341     } else {
16342       w = e.clientWidth;
16343       h = e.clientHeight;
16344     }
16345     return [[0, 0], [w, h]];
16346   }
16347
16348   function defaultTransform() {
16349     return this.__zoom || identity$7;
16350   }
16351
16352   function defaultWheelDelta() {
16353     return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
16354   }
16355
16356   function defaultTouchable$1() {
16357     return "ontouchstart" in this;
16358   }
16359
16360   function defaultConstrain(transform, extent, translateExtent) {
16361     var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],
16362         dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],
16363         dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],
16364         dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];
16365     return transform.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)
16368     );
16369   }
16370
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]],
16379         duration = 250,
16380         interpolate = interpolateZoom,
16381         gestures = [],
16382         listeners = dispatch("start", "zoom", "end"),
16383         touchstarting,
16384         touchending,
16385         touchDelay = 500,
16386         wheelDelay = 150,
16387         clickDistance2 = 0;
16388
16389     function zoom(selection) {
16390       selection
16391           .property("__zoom", defaultTransform)
16392           .on("wheel.zoom", wheeled)
16393           .on("mousedown.zoom", mousedowned)
16394           .on("dblclick.zoom", dblclicked)
16395         .filter(touchable)
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)");
16401     }
16402
16403     zoom.transform = function(collection, transform) {
16404       var selection = collection.selection ? collection.selection() : collection;
16405       selection.property("__zoom", defaultTransform);
16406       if (collection !== selection) {
16407         schedule(collection, transform);
16408       } else {
16409         selection.interrupt().each(function() {
16410           gesture(this, arguments)
16411               .start()
16412               .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform)
16413               .end();
16414         });
16415       }
16416     };
16417
16418     zoom.scaleBy = function(selection, k) {
16419       zoom.scaleTo(selection, function() {
16420         var k0 = this.__zoom.k,
16421             k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16422         return k0 * k1;
16423       });
16424     };
16425
16426     zoom.scaleTo = function(selection, k) {
16427       zoom.transform(selection, function() {
16428         var e = extent.apply(this, arguments),
16429             t0 = this.__zoom,
16430             p0 = centroid(e),
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);
16434       });
16435     };
16436
16437     zoom.translateBy = function(selection, x, y) {
16438       zoom.transform(selection, 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);
16443       });
16444     };
16445
16446     zoom.translateTo = function(selection, x, y) {
16447       zoom.transform(selection, function() {
16448         var e = extent.apply(this, arguments),
16449             t = this.__zoom,
16450             p = centroid(e);
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);
16455       });
16456     };
16457
16458     function scale(transform, k) {
16459       k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
16460       return k === transform.k ? transform : new Transform(k, transform.x, transform.y);
16461     }
16462
16463     function translate(transform, p0, p1) {
16464       var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;
16465       return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);
16466     }
16467
16468     function centroid(extent) {
16469       return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
16470     }
16471
16472     function schedule(transition, transform, center) {
16473       transition
16474           .on("start.zoom", function() { gesture(this, arguments).start(); })
16475           .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
16476           .tween("zoom", function() {
16477             var that = this,
16478                 args = arguments,
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]),
16483                 a = that.__zoom,
16484                 b = typeof transform === "function" ? transform.apply(that, args) : transform,
16485                 i = interpolate(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); }
16489               g.zoom(null, t);
16490             };
16491           });
16492     }
16493
16494     function gesture(that, args) {
16495       for (var i = 0, n = gestures.length, g; i < n; ++i) {
16496         if ((g = gestures[i]).that === that) {
16497           return g;
16498         }
16499       }
16500       return new Gesture(that, args);
16501     }
16502
16503     function Gesture(that, args) {
16504       this.that = that;
16505       this.args = args;
16506       this.index = -1;
16507       this.active = 0;
16508       this.extent = extent.apply(that, args);
16509     }
16510
16511     Gesture.prototype = {
16512       start: function() {
16513         if (++this.active === 1) {
16514           this.index = gestures.push(this) - 1;
16515           this.emit("start");
16516         }
16517         return this;
16518       },
16519       zoom: function(key, transform) {
16520         if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]);
16521         if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]);
16522         if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]);
16523         this.that.__zoom = transform;
16524         this.emit("zoom");
16525         return this;
16526       },
16527       end: function() {
16528         if (--this.active === 0) {
16529           gestures.splice(this.index, 1);
16530           this.index = -1;
16531           this.emit("end");
16532         }
16533         return this;
16534       },
16535       emit: function(type) {
16536         customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
16537       }
16538     };
16539
16540     function wheeled() {
16541       if (!filter.apply(this, arguments)) return;
16542       var g = gesture(this, arguments),
16543           t = this.__zoom,
16544           k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
16545           p = mouse(this);
16546
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.
16549       if (g.wheel) {
16550         if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
16551           g.mouse[1] = t.invert(g.mouse[0] = p);
16552         }
16553         clearTimeout(g.wheel);
16554       }
16555
16556       // If this wheel event won’t trigger a transform change, ignore it.
16557       else if (t.k === k) return;
16558
16559       // Otherwise, capture the mouse point and location at the start.
16560       else {
16561         g.mouse = [p, t.invert(p)];
16562         interrupt(this);
16563         g.start();
16564       }
16565
16566       noevent$2();
16567       g.wheel = setTimeout(wheelidled, wheelDelay);
16568       g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
16569
16570       function wheelidled() {
16571         g.wheel = null;
16572         g.end();
16573       }
16574     }
16575
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),
16580           p = mouse(this),
16581           x0 = event.clientX,
16582           y0 = event.clientY;
16583
16584       dragDisable(event.view);
16585       nopropagation$2();
16586       g.mouse = [p, this.__zoom.invert(p)];
16587       interrupt(this);
16588       g.start();
16589
16590       function mousemoved() {
16591         noevent$2();
16592         if (!g.moved) {
16593           var dx = event.clientX - x0, dy = event.clientY - y0;
16594           g.moved = dx * dx + dy * dy > clickDistance2;
16595         }
16596         g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent, translateExtent));
16597       }
16598
16599       function mouseupped() {
16600         v.on("mousemove.zoom mouseup.zoom", null);
16601         yesdrag(event.view, g.moved);
16602         noevent$2();
16603         g.end();
16604       }
16605     }
16606
16607     function dblclicked() {
16608       if (!filter.apply(this, arguments)) return;
16609       var t0 = this.__zoom,
16610           p0 = mouse(this),
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);
16614
16615       noevent$2();
16616       if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0);
16617       else select(this).call(zoom.transform, t1);
16618     }
16619
16620     function touchstarted() {
16621       if (!filter.apply(this, arguments)) return;
16622       var g = gesture(this, arguments),
16623           touches = event.changedTouches,
16624           started,
16625           n = touches.length, i, t, p;
16626
16627       nopropagation$2();
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;
16633       }
16634
16635       // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
16636       if (touchstarting) {
16637         touchstarting = clearTimeout(touchstarting);
16638         if (!g.touch1) {
16639           g.end();
16640           p = select(this).on("dblclick.zoom");
16641           if (p) p.apply(this, arguments);
16642           return;
16643         }
16644       }
16645
16646       if (started) {
16647         touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
16648         interrupt(this);
16649         g.start();
16650       }
16651     }
16652
16653     function touchmoved() {
16654       var g = gesture(this, arguments),
16655           touches = event.changedTouches,
16656           n = touches.length, i, t, p, l;
16657
16658       noevent$2();
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;
16664       }
16665       t = g.that.__zoom;
16666       if (g.touch1) {
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];
16674       }
16675       else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
16676       else return;
16677       g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
16678     }
16679
16680     function touchended() {
16681       var g = gesture(this, arguments),
16682           touches = event.changedTouches,
16683           n = touches.length, i, t;
16684
16685       nopropagation$2();
16686       if (touchending) clearTimeout(touchending);
16687       touchending = setTimeout(function() { touchending = null; }, touchDelay);
16688       for (i = 0; i < n; ++i) {
16689         t = touches[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;
16692       }
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]);
16695       else g.end();
16696     }
16697
16698     zoom.wheelDelta = function(_) {
16699       return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$c(+_), zoom) : wheelDelta;
16700     };
16701
16702     zoom.filter = function(_) {
16703       return arguments.length ? (filter = typeof _ === "function" ? _ : constant$c(!!_), zoom) : filter;
16704     };
16705
16706     zoom.touchable = function(_) {
16707       return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$c(!!_), zoom) : touchable;
16708     };
16709
16710     zoom.extent = function(_) {
16711       return arguments.length ? (extent = typeof _ === "function" ? _ : constant$c([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
16712     };
16713
16714     zoom.scaleExtent = function(_) {
16715       return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
16716     };
16717
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]]];
16720     };
16721
16722     zoom.constrain = function(_) {
16723       return arguments.length ? (constrain = _, zoom) : constrain;
16724     };
16725
16726     zoom.duration = function(_) {
16727       return arguments.length ? (duration = +_, zoom) : duration;
16728     };
16729
16730     zoom.interpolate = function(_) {
16731       return arguments.length ? (interpolate = _, zoom) : interpolate;
16732     };
16733
16734     zoom.on = function() {
16735       var value = listeners.on.apply(listeners, arguments);
16736       return value === listeners ? zoom : value;
16737     };
16738
16739     zoom.clickDistance = function(_) {
16740       return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
16741     };
16742
16743     return zoom;
16744   }
16745
16746
16747
16748   var index$3 = /*#__PURE__*/Object.freeze({
16749     version: version,
16750     bisect: bisectRight,
16751     bisectRight: bisectRight,
16752     bisectLeft: bisectLeft,
16753     ascending: ascending,
16754     bisector: bisector,
16755     cross: cross,
16756     descending: d3_descending,
16757     deviation: deviation,
16758     extent: extent,
16759     histogram: histogram,
16760     thresholdFreedmanDiaconis: freedmanDiaconis,
16761     thresholdScott: scott,
16762     thresholdSturges: sturges,
16763     max: max,
16764     mean: mean,
16765     median: d3_median,
16766     merge: merge,
16767     min: min,
16768     pairs: pairs,
16769     permute: permute,
16770     quantile: quantile,
16771     range: range,
16772     scan: scan,
16773     shuffle: shuffle,
16774     sum: sum,
16775     ticks: ticks,
16776     tickIncrement: tickIncrement,
16777     tickStep: tickStep,
16778     transpose: transpose,
16779     variance: variance,
16780     zip: zip,
16781     axisTop: axisTop,
16782     axisRight: axisRight,
16783     axisBottom: axisBottom,
16784     axisLeft: axisLeft,
16785     brush: brush,
16786     brushX: brushX,
16787     brushY: brushY,
16788     brushSelection: brushSelection,
16789     chord: chord,
16790     ribbon: ribbon,
16791     nest: nest,
16792     set: set$2,
16793     map: map$1,
16794     keys: keys,
16795     values: values,
16796     entries: entries,
16797     color: color,
16798     rgb: rgb,
16799     hsl: hsl,
16800     lab: lab,
16801     hcl: hcl,
16802     cubehelix: cubehelix,
16803     dispatch: dispatch,
16804     drag: d3_drag,
16805     dragDisable: dragDisable,
16806     dragEnable: yesdrag,
16807     dsvFormat: dsv,
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,
16829     easeSin: sinInOut,
16830     easeSinIn: sinIn,
16831     easeSinOut: sinOut,
16832     easeSinInOut: sinInOut,
16833     easeExp: expInOut,
16834     easeExpIn: expIn,
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,
16855     forceLink: link,
16856     forceManyBody: manyBody,
16857     forceRadial: radial,
16858     forceSimulation: simulation,
16859     forceX: x$2,
16860     forceY: y$2,
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,
16872     geoCircle: circle,
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,
16884     geoAlbers: albers,
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,
16916     cluster: cluster,
16917     hierarchy: hierarchy,
16918     pack: index$1,
16919     packSiblings: siblings,
16920     packEnclose: enclose,
16921     partition: partition,
16922     stratify: stratify,
16923     tree: tree,
16924     treemap: index$2,
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,
16954     path: path,
16955     polygonArea: d3_polygonArea,
16956     polygonCentroid: d3_polygonCentroid,
16957     polygonHull: d3_polygonHull,
16958     polygonContains: contains$1,
16959     polygonLength: length$2,
16960     quadtree: quadtree,
16961     queue: queue,
16962     randomUniform: uniform,
16963     randomNormal: normal,
16964     randomLogNormal: logNormal,
16965     randomBates: bates,
16966     randomIrwinHall: irwinHall,
16967     randomExponential: exponential$1,
16968     request: request,
16969     html: html,
16970     json: d3_json,
16971     text: d3_text,
16972     xml: d3_xml,
16973     csv: csv$1,
16974     tsv: tsv$1,
16975     scaleBand: band,
16976     scalePoint: point$1,
16977     scaleIdentity: identity$5,
16978     scaleLinear: linear$2,
16979     scaleLog: log$1,
16980     scaleOrdinal: ordinal,
16981     scaleImplicit: implicit,
16982     scalePow: pow$1,
16983     scaleSqrt: sqrt$1,
16984     scaleQuantile: quantile$1,
16985     scaleQuantize: quantize,
16986     scaleThreshold: threshold,
16987     scaleTime: time,
16988     scaleUtc: utcTime,
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,
17002     create: create,
17003     creator: creator,
17004     local: local,
17005     matcher: matcher$1,
17006     mouse: mouse,
17007     namespace: namespace,
17008     namespaces: namespaces,
17009     clientPoint: point,
17010     select: select,
17011     selectAll: d3_selectAll,
17012     selection: selection,
17013     selector: selector,
17014     selectorAll: selectorAll,
17015     style: styleValue,
17016     touch: touch,
17017     touches: d3_touches,
17018     window: defaultView,
17019     get event () { return event; },
17020     customEvent: customEvent,
17021     arc: arc,
17022     area: area,
17023     line: line,
17024     pie: pie,
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,
17033     symbol: symbol,
17034     symbols: symbols,
17035     symbolCircle: circle$2,
17036     symbolCross: cross$2,
17037     symbolDiamond: diamond,
17038     symbolSquare: square,
17039     symbolStar: star,
17040     symbolTriangle: triangle,
17041     symbolWye: wye,
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,
17057     curveStep: step,
17058     curveStepAfter: stepAfter,
17059     curveStepBefore: stepBefore,
17060     stack: stack,
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,
17078     utcSecond: second,
17079     utcSeconds: seconds,
17080     timeMinute: minute,
17081     timeMinutes: minutes,
17082     timeHour: hour,
17083     timeHours: hours,
17084     timeDay: day,
17085     timeDays: days,
17086     timeWeek: sunday,
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,
17102     timeMonth: month,
17103     timeMonths: months,
17104     timeYear: year,
17105     timeYears: years,
17106     utcMinute: utcMinute,
17107     utcMinutes: utcMinutes,
17108     utcHour: utcHour,
17109     utcHours: utcHours,
17110     utcDay: utcDay,
17111     utcDays: utcDays,
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,
17130     utcYear: utcYear,
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,
17140     now: now,
17141     timer: timer,
17142     timerFlush: timerFlush,
17143     timeout: timeout$1,
17144     interval: interval$1,
17145     transition: transition,
17146     active: active,
17147     interrupt: interrupt,
17148     voronoi: voronoi,
17149     zoom: d3_zoom,
17150     zoomTransform: transform,
17151     zoomIdentity: identity$7
17152   });
17153
17154   function actionAddEntity(way) {
17155       return function(graph) {
17156           return graph.replace(way);
17157       };
17158   }
17159
17160   /**
17161    * Removes all key-value entries from the list cache.
17162    *
17163    * @private
17164    * @name clear
17165    * @memberOf ListCache
17166    */
17167   function listCacheClear() {
17168     this.__data__ = [];
17169     this.size = 0;
17170   }
17171
17172   /**
17173    * Performs a
17174    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
17175    * comparison between two values to determine if they are equivalent.
17176    *
17177    * @static
17178    * @memberOf _
17179    * @since 4.0.0
17180    * @category Lang
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`.
17184    * @example
17185    *
17186    * var object = { 'a': 1 };
17187    * var other = { 'a': 1 };
17188    *
17189    * _.eq(object, object);
17190    * // => true
17191    *
17192    * _.eq(object, other);
17193    * // => false
17194    *
17195    * _.eq('a', 'a');
17196    * // => true
17197    *
17198    * _.eq('a', Object('a'));
17199    * // => false
17200    *
17201    * _.eq(NaN, NaN);
17202    * // => true
17203    */
17204   function eq(value, other) {
17205     return value === other || (value !== value && other !== other);
17206   }
17207
17208   /**
17209    * Gets the index at which the `key` is found in `array` of key-value pairs.
17210    *
17211    * @private
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`.
17215    */
17216   function assocIndexOf(array, key) {
17217     var length = array.length;
17218     while (length--) {
17219       if (eq(array[length][0], key)) {
17220         return length;
17221       }
17222     }
17223     return -1;
17224   }
17225
17226   /** Used for built-in method references. */
17227   var arrayProto = Array.prototype;
17228
17229   /** Built-in value references. */
17230   var splice = arrayProto.splice;
17231
17232   /**
17233    * Removes `key` and its value from the list cache.
17234    *
17235    * @private
17236    * @name delete
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`.
17240    */
17241   function listCacheDelete(key) {
17242     var data = this.__data__,
17243         index = assocIndexOf(data, key);
17244
17245     if (index < 0) {
17246       return false;
17247     }
17248     var lastIndex = data.length - 1;
17249     if (index == lastIndex) {
17250       data.pop();
17251     } else {
17252       splice.call(data, index, 1);
17253     }
17254     --this.size;
17255     return true;
17256   }
17257
17258   /**
17259    * Gets the list cache value for `key`.
17260    *
17261    * @private
17262    * @name get
17263    * @memberOf ListCache
17264    * @param {string} key The key of the value to get.
17265    * @returns {*} Returns the entry value.
17266    */
17267   function listCacheGet(key) {
17268     var data = this.__data__,
17269         index = assocIndexOf(data, key);
17270
17271     return index < 0 ? undefined : data[index][1];
17272   }
17273
17274   /**
17275    * Checks if a list cache value for `key` exists.
17276    *
17277    * @private
17278    * @name has
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`.
17282    */
17283   function listCacheHas(key) {
17284     return assocIndexOf(this.__data__, key) > -1;
17285   }
17286
17287   /**
17288    * Sets the list cache `key` to `value`.
17289    *
17290    * @private
17291    * @name set
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.
17296    */
17297   function listCacheSet(key, value) {
17298     var data = this.__data__,
17299         index = assocIndexOf(data, key);
17300
17301     if (index < 0) {
17302       ++this.size;
17303       data.push([key, value]);
17304     } else {
17305       data[index][1] = value;
17306     }
17307     return this;
17308   }
17309
17310   /**
17311    * Creates an list cache object.
17312    *
17313    * @private
17314    * @constructor
17315    * @param {Array} [entries] The key-value pairs to cache.
17316    */
17317   function ListCache(entries) {
17318     var index = -1,
17319         length = entries == null ? 0 : entries.length;
17320
17321     this.clear();
17322     while (++index < length) {
17323       var entry = entries[index];
17324       this.set(entry[0], entry[1]);
17325     }
17326   }
17327
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;
17334
17335   /**
17336    * Removes all key-value entries from the stack.
17337    *
17338    * @private
17339    * @name clear
17340    * @memberOf Stack
17341    */
17342   function stackClear() {
17343     this.__data__ = new ListCache;
17344     this.size = 0;
17345   }
17346
17347   /**
17348    * Removes `key` and its value from the stack.
17349    *
17350    * @private
17351    * @name delete
17352    * @memberOf Stack
17353    * @param {string} key The key of the value to remove.
17354    * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17355    */
17356   function stackDelete(key) {
17357     var data = this.__data__,
17358         result = data['delete'](key);
17359
17360     this.size = data.size;
17361     return result;
17362   }
17363
17364   /**
17365    * Gets the stack value for `key`.
17366    *
17367    * @private
17368    * @name get
17369    * @memberOf Stack
17370    * @param {string} key The key of the value to get.
17371    * @returns {*} Returns the entry value.
17372    */
17373   function stackGet(key) {
17374     return this.__data__.get(key);
17375   }
17376
17377   /**
17378    * Checks if a stack value for `key` exists.
17379    *
17380    * @private
17381    * @name has
17382    * @memberOf Stack
17383    * @param {string} key The key of the entry to check.
17384    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17385    */
17386   function stackHas(key) {
17387     return this.__data__.has(key);
17388   }
17389
17390   /** Detect free variable `global` from Node.js. */
17391   var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
17392
17393   /** Detect free variable `self`. */
17394   var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
17395
17396   /** Used as a reference to the global object. */
17397   var root$2 = freeGlobal || freeSelf || Function('return this')();
17398
17399   /** Built-in value references. */
17400   var Symbol = root$2.Symbol;
17401
17402   /** Used for built-in method references. */
17403   var objectProto = Object.prototype;
17404
17405   /** Used to check objects for own properties. */
17406   var hasOwnProperty = objectProto.hasOwnProperty;
17407
17408   /**
17409    * Used to resolve the
17410    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17411    * of values.
17412    */
17413   var nativeObjectToString = objectProto.toString;
17414
17415   /** Built-in value references. */
17416   var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
17417
17418   /**
17419    * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
17420    *
17421    * @private
17422    * @param {*} value The value to query.
17423    * @returns {string} Returns the raw `toStringTag`.
17424    */
17425   function getRawTag(value) {
17426     var isOwn = hasOwnProperty.call(value, symToStringTag),
17427         tag = value[symToStringTag];
17428
17429     try {
17430       value[symToStringTag] = undefined;
17431       var unmasked = true;
17432     } catch (e) {}
17433
17434     var result = nativeObjectToString.call(value);
17435     if (unmasked) {
17436       if (isOwn) {
17437         value[symToStringTag] = tag;
17438       } else {
17439         delete value[symToStringTag];
17440       }
17441     }
17442     return result;
17443   }
17444
17445   /** Used for built-in method references. */
17446   var objectProto$1 = Object.prototype;
17447
17448   /**
17449    * Used to resolve the
17450    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17451    * of values.
17452    */
17453   var nativeObjectToString$1 = objectProto$1.toString;
17454
17455   /**
17456    * Converts `value` to a string using `Object.prototype.toString`.
17457    *
17458    * @private
17459    * @param {*} value The value to convert.
17460    * @returns {string} Returns the converted string.
17461    */
17462   function objectToString(value) {
17463     return nativeObjectToString$1.call(value);
17464   }
17465
17466   /** `Object#toString` result references. */
17467   var nullTag = '[object Null]',
17468       undefinedTag = '[object Undefined]';
17469
17470   /** Built-in value references. */
17471   var symToStringTag$1 = Symbol ? Symbol.toStringTag : undefined;
17472
17473   /**
17474    * The base implementation of `getTag` without fallbacks for buggy environments.
17475    *
17476    * @private
17477    * @param {*} value The value to query.
17478    * @returns {string} Returns the `toStringTag`.
17479    */
17480   function baseGetTag(value) {
17481     if (value == null) {
17482       return value === undefined ? undefinedTag : nullTag;
17483     }
17484     return (symToStringTag$1 && symToStringTag$1 in Object(value))
17485       ? getRawTag(value)
17486       : objectToString(value);
17487   }
17488
17489   /**
17490    * Checks if `value` is the
17491    * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
17492    * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
17493    *
17494    * @static
17495    * @memberOf _
17496    * @since 0.1.0
17497    * @category Lang
17498    * @param {*} value The value to check.
17499    * @returns {boolean} Returns `true` if `value` is an object, else `false`.
17500    * @example
17501    *
17502    * _.isObject({});
17503    * // => true
17504    *
17505    * _.isObject([1, 2, 3]);
17506    * // => true
17507    *
17508    * _.isObject(_.noop);
17509    * // => true
17510    *
17511    * _.isObject(null);
17512    * // => false
17513    */
17514   function isObject(value) {
17515     var type = typeof value;
17516     return value != null && (type == 'object' || type == 'function');
17517   }
17518
17519   /** `Object#toString` result references. */
17520   var asyncTag = '[object AsyncFunction]',
17521       funcTag = '[object Function]',
17522       genTag = '[object GeneratorFunction]',
17523       proxyTag = '[object Proxy]';
17524
17525   /**
17526    * Checks if `value` is classified as a `Function` object.
17527    *
17528    * @static
17529    * @memberOf _
17530    * @since 0.1.0
17531    * @category Lang
17532    * @param {*} value The value to check.
17533    * @returns {boolean} Returns `true` if `value` is a function, else `false`.
17534    * @example
17535    *
17536    * _.isFunction(_);
17537    * // => true
17538    *
17539    * _.isFunction(/abc/);
17540    * // => false
17541    */
17542   function isFunction(value) {
17543     if (!isObject(value)) {
17544       return false;
17545     }
17546     // The use of `Object#toString` avoids issues with the `typeof` operator
17547     // in Safari 9 which returns 'object' for typed arrays and other constructors.
17548     var tag = baseGetTag(value);
17549     return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
17550   }
17551
17552   /** Used to detect overreaching core-js shims. */
17553   var coreJsData = root$2['__core-js_shared__'];
17554
17555   /** Used to detect methods masquerading as native. */
17556   var maskSrcKey = (function() {
17557     var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
17558     return uid ? ('Symbol(src)_1.' + uid) : '';
17559   }());
17560
17561   /**
17562    * Checks if `func` has its source masked.
17563    *
17564    * @private
17565    * @param {Function} func The function to check.
17566    * @returns {boolean} Returns `true` if `func` is masked, else `false`.
17567    */
17568   function isMasked(func) {
17569     return !!maskSrcKey && (maskSrcKey in func);
17570   }
17571
17572   /** Used for built-in method references. */
17573   var funcProto = Function.prototype;
17574
17575   /** Used to resolve the decompiled source of functions. */
17576   var funcToString = funcProto.toString;
17577
17578   /**
17579    * Converts `func` to its source code.
17580    *
17581    * @private
17582    * @param {Function} func The function to convert.
17583    * @returns {string} Returns the source code.
17584    */
17585   function toSource(func) {
17586     if (func != null) {
17587       try {
17588         return funcToString.call(func);
17589       } catch (e) {}
17590       try {
17591         return (func + '');
17592       } catch (e) {}
17593     }
17594     return '';
17595   }
17596
17597   /**
17598    * Used to match `RegExp`
17599    * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
17600    */
17601   var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
17602
17603   /** Used to detect host constructors (Safari). */
17604   var reIsHostCtor = /^\[object .+?Constructor\]$/;
17605
17606   /** Used for built-in method references. */
17607   var funcProto$1 = Function.prototype,
17608       objectProto$2 = Object.prototype;
17609
17610   /** Used to resolve the decompiled source of functions. */
17611   var funcToString$1 = funcProto$1.toString;
17612
17613   /** Used to check objects for own properties. */
17614   var hasOwnProperty$1 = objectProto$2.hasOwnProperty;
17615
17616   /** Used to detect if a method is native. */
17617   var reIsNative = RegExp('^' +
17618     funcToString$1.call(hasOwnProperty$1).replace(reRegExpChar, '\\$&')
17619     .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
17620   );
17621
17622   /**
17623    * The base implementation of `_.isNative` without bad shim checks.
17624    *
17625    * @private
17626    * @param {*} value The value to check.
17627    * @returns {boolean} Returns `true` if `value` is a native function,
17628    *  else `false`.
17629    */
17630   function baseIsNative(value) {
17631     if (!isObject(value) || isMasked(value)) {
17632       return false;
17633     }
17634     var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
17635     return pattern.test(toSource(value));
17636   }
17637
17638   /**
17639    * Gets the value at `key` of `object`.
17640    *
17641    * @private
17642    * @param {Object} [object] The object to query.
17643    * @param {string} key The key of the property to get.
17644    * @returns {*} Returns the property value.
17645    */
17646   function getValue(object, key) {
17647     return object == null ? undefined : object[key];
17648   }
17649
17650   /**
17651    * Gets the native function at `key` of `object`.
17652    *
17653    * @private
17654    * @param {Object} object The object to query.
17655    * @param {string} key The key of the method to get.
17656    * @returns {*} Returns the function if it's native, else `undefined`.
17657    */
17658   function getNative(object, key) {
17659     var value = getValue(object, key);
17660     return baseIsNative(value) ? value : undefined;
17661   }
17662
17663   /* Built-in method references that are verified to be native. */
17664   var Map$1 = getNative(root$2, 'Map');
17665
17666   /* Built-in method references that are verified to be native. */
17667   var nativeCreate = getNative(Object, 'create');
17668
17669   /**
17670    * Removes all key-value entries from the hash.
17671    *
17672    * @private
17673    * @name clear
17674    * @memberOf Hash
17675    */
17676   function hashClear() {
17677     this.__data__ = nativeCreate ? nativeCreate(null) : {};
17678     this.size = 0;
17679   }
17680
17681   /**
17682    * Removes `key` and its value from the hash.
17683    *
17684    * @private
17685    * @name delete
17686    * @memberOf Hash
17687    * @param {Object} hash The hash to modify.
17688    * @param {string} key The key of the value to remove.
17689    * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17690    */
17691   function hashDelete(key) {
17692     var result = this.has(key) && delete this.__data__[key];
17693     this.size -= result ? 1 : 0;
17694     return result;
17695   }
17696
17697   /** Used to stand-in for `undefined` hash values. */
17698   var HASH_UNDEFINED = '__lodash_hash_undefined__';
17699
17700   /** Used for built-in method references. */
17701   var objectProto$3 = Object.prototype;
17702
17703   /** Used to check objects for own properties. */
17704   var hasOwnProperty$2 = objectProto$3.hasOwnProperty;
17705
17706   /**
17707    * Gets the hash value for `key`.
17708    *
17709    * @private
17710    * @name get
17711    * @memberOf Hash
17712    * @param {string} key The key of the value to get.
17713    * @returns {*} Returns the entry value.
17714    */
17715   function hashGet(key) {
17716     var data = this.__data__;
17717     if (nativeCreate) {
17718       var result = data[key];
17719       return result === HASH_UNDEFINED ? undefined : result;
17720     }
17721     return hasOwnProperty$2.call(data, key) ? data[key] : undefined;
17722   }
17723
17724   /** Used for built-in method references. */
17725   var objectProto$4 = Object.prototype;
17726
17727   /** Used to check objects for own properties. */
17728   var hasOwnProperty$3 = objectProto$4.hasOwnProperty;
17729
17730   /**
17731    * Checks if a hash value for `key` exists.
17732    *
17733    * @private
17734    * @name has
17735    * @memberOf Hash
17736    * @param {string} key The key of the entry to check.
17737    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17738    */
17739   function hashHas(key) {
17740     var data = this.__data__;
17741     return nativeCreate ? (data[key] !== undefined) : hasOwnProperty$3.call(data, key);
17742   }
17743
17744   /** Used to stand-in for `undefined` hash values. */
17745   var HASH_UNDEFINED$1 = '__lodash_hash_undefined__';
17746
17747   /**
17748    * Sets the hash `key` to `value`.
17749    *
17750    * @private
17751    * @name set
17752    * @memberOf Hash
17753    * @param {string} key The key of the value to set.
17754    * @param {*} value The value to set.
17755    * @returns {Object} Returns the hash instance.
17756    */
17757   function hashSet(key, value) {
17758     var data = this.__data__;
17759     this.size += this.has(key) ? 0 : 1;
17760     data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value;
17761     return this;
17762   }
17763
17764   /**
17765    * Creates a hash object.
17766    *
17767    * @private
17768    * @constructor
17769    * @param {Array} [entries] The key-value pairs to cache.
17770    */
17771   function Hash(entries) {
17772     var index = -1,
17773         length = entries == null ? 0 : entries.length;
17774
17775     this.clear();
17776     while (++index < length) {
17777       var entry = entries[index];
17778       this.set(entry[0], entry[1]);
17779     }
17780   }
17781
17782   // Add methods to `Hash`.
17783   Hash.prototype.clear = hashClear;
17784   Hash.prototype['delete'] = hashDelete;
17785   Hash.prototype.get = hashGet;
17786   Hash.prototype.has = hashHas;
17787   Hash.prototype.set = hashSet;
17788
17789   /**
17790    * Removes all key-value entries from the map.
17791    *
17792    * @private
17793    * @name clear
17794    * @memberOf MapCache
17795    */
17796   function mapCacheClear() {
17797     this.size = 0;
17798     this.__data__ = {
17799       'hash': new Hash,
17800       'map': new (Map$1 || ListCache),
17801       'string': new Hash
17802     };
17803   }
17804
17805   /**
17806    * Checks if `value` is suitable for use as unique object key.
17807    *
17808    * @private
17809    * @param {*} value The value to check.
17810    * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
17811    */
17812   function isKeyable(value) {
17813     var type = typeof value;
17814     return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
17815       ? (value !== '__proto__')
17816       : (value === null);
17817   }
17818
17819   /**
17820    * Gets the data for `map`.
17821    *
17822    * @private
17823    * @param {Object} map The map to query.
17824    * @param {string} key The reference key.
17825    * @returns {*} Returns the map data.
17826    */
17827   function getMapData(map, key) {
17828     var data = map.__data__;
17829     return isKeyable(key)
17830       ? data[typeof key == 'string' ? 'string' : 'hash']
17831       : data.map;
17832   }
17833
17834   /**
17835    * Removes `key` and its value from the map.
17836    *
17837    * @private
17838    * @name delete
17839    * @memberOf MapCache
17840    * @param {string} key The key of the value to remove.
17841    * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17842    */
17843   function mapCacheDelete(key) {
17844     var result = getMapData(this, key)['delete'](key);
17845     this.size -= result ? 1 : 0;
17846     return result;
17847   }
17848
17849   /**
17850    * Gets the map value for `key`.
17851    *
17852    * @private
17853    * @name get
17854    * @memberOf MapCache
17855    * @param {string} key The key of the value to get.
17856    * @returns {*} Returns the entry value.
17857    */
17858   function mapCacheGet(key) {
17859     return getMapData(this, key).get(key);
17860   }
17861
17862   /**
17863    * Checks if a map value for `key` exists.
17864    *
17865    * @private
17866    * @name has
17867    * @memberOf MapCache
17868    * @param {string} key The key of the entry to check.
17869    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17870    */
17871   function mapCacheHas(key) {
17872     return getMapData(this, key).has(key);
17873   }
17874
17875   /**
17876    * Sets the map `key` to `value`.
17877    *
17878    * @private
17879    * @name set
17880    * @memberOf MapCache
17881    * @param {string} key The key of the value to set.
17882    * @param {*} value The value to set.
17883    * @returns {Object} Returns the map cache instance.
17884    */
17885   function mapCacheSet(key, value) {
17886     var data = getMapData(this, key),
17887         size = data.size;
17888
17889     data.set(key, value);
17890     this.size += data.size == size ? 0 : 1;
17891     return this;
17892   }
17893
17894   /**
17895    * Creates a map cache object to store key-value pairs.
17896    *
17897    * @private
17898    * @constructor
17899    * @param {Array} [entries] The key-value pairs to cache.
17900    */
17901   function MapCache(entries) {
17902     var index = -1,
17903         length = entries == null ? 0 : entries.length;
17904
17905     this.clear();
17906     while (++index < length) {
17907       var entry = entries[index];
17908       this.set(entry[0], entry[1]);
17909     }
17910   }
17911
17912   // Add methods to `MapCache`.
17913   MapCache.prototype.clear = mapCacheClear;
17914   MapCache.prototype['delete'] = mapCacheDelete;
17915   MapCache.prototype.get = mapCacheGet;
17916   MapCache.prototype.has = mapCacheHas;
17917   MapCache.prototype.set = mapCacheSet;
17918
17919   /** Used as the size to enable large array optimizations. */
17920   var LARGE_ARRAY_SIZE = 200;
17921
17922   /**
17923    * Sets the stack `key` to `value`.
17924    *
17925    * @private
17926    * @name set
17927    * @memberOf Stack
17928    * @param {string} key The key of the value to set.
17929    * @param {*} value The value to set.
17930    * @returns {Object} Returns the stack cache instance.
17931    */
17932   function stackSet(key, value) {
17933     var data = this.__data__;
17934     if (data instanceof ListCache) {
17935       var pairs = data.__data__;
17936       if (!Map$1 || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
17937         pairs.push([key, value]);
17938         this.size = ++data.size;
17939         return this;
17940       }
17941       data = this.__data__ = new MapCache(pairs);
17942     }
17943     data.set(key, value);
17944     this.size = data.size;
17945     return this;
17946   }
17947
17948   /**
17949    * Creates a stack cache object to store key-value pairs.
17950    *
17951    * @private
17952    * @constructor
17953    * @param {Array} [entries] The key-value pairs to cache.
17954    */
17955   function Stack(entries) {
17956     var data = this.__data__ = new ListCache(entries);
17957     this.size = data.size;
17958   }
17959
17960   // Add methods to `Stack`.
17961   Stack.prototype.clear = stackClear;
17962   Stack.prototype['delete'] = stackDelete;
17963   Stack.prototype.get = stackGet;
17964   Stack.prototype.has = stackHas;
17965   Stack.prototype.set = stackSet;
17966
17967   /**
17968    * A specialized version of `_.forEach` for arrays without support for
17969    * iteratee shorthands.
17970    *
17971    * @private
17972    * @param {Array} [array] The array to iterate over.
17973    * @param {Function} iteratee The function invoked per iteration.
17974    * @returns {Array} Returns `array`.
17975    */
17976   function arrayEach(array, iteratee) {
17977     var index = -1,
17978         length = array == null ? 0 : array.length;
17979
17980     while (++index < length) {
17981       if (iteratee(array[index], index, array) === false) {
17982         break;
17983       }
17984     }
17985     return array;
17986   }
17987
17988   var defineProperty = (function() {
17989     try {
17990       var func = getNative(Object, 'defineProperty');
17991       func({}, '', {});
17992       return func;
17993     } catch (e) {}
17994   }());
17995
17996   /**
17997    * The base implementation of `assignValue` and `assignMergeValue` without
17998    * value checks.
17999    *
18000    * @private
18001    * @param {Object} object The object to modify.
18002    * @param {string} key The key of the property to assign.
18003    * @param {*} value The value to assign.
18004    */
18005   function baseAssignValue(object, key, value) {
18006     if (key == '__proto__' && defineProperty) {
18007       defineProperty(object, key, {
18008         'configurable': true,
18009         'enumerable': true,
18010         'value': value,
18011         'writable': true
18012       });
18013     } else {
18014       object[key] = value;
18015     }
18016   }
18017
18018   /** Used for built-in method references. */
18019   var objectProto$5 = Object.prototype;
18020
18021   /** Used to check objects for own properties. */
18022   var hasOwnProperty$4 = objectProto$5.hasOwnProperty;
18023
18024   /**
18025    * Assigns `value` to `key` of `object` if the existing value is not equivalent
18026    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
18027    * for equality comparisons.
18028    *
18029    * @private
18030    * @param {Object} object The object to modify.
18031    * @param {string} key The key of the property to assign.
18032    * @param {*} value The value to assign.
18033    */
18034   function assignValue(object, key, value) {
18035     var objValue = object[key];
18036     if (!(hasOwnProperty$4.call(object, key) && eq(objValue, value)) ||
18037         (value === undefined && !(key in object))) {
18038       baseAssignValue(object, key, value);
18039     }
18040   }
18041
18042   /**
18043    * Copies properties of `source` to `object`.
18044    *
18045    * @private
18046    * @param {Object} source The object to copy properties from.
18047    * @param {Array} props The property identifiers to copy.
18048    * @param {Object} [object={}] The object to copy properties to.
18049    * @param {Function} [customizer] The function to customize copied values.
18050    * @returns {Object} Returns `object`.
18051    */
18052   function copyObject(source, props, object, customizer) {
18053     var isNew = !object;
18054     object || (object = {});
18055
18056     var index = -1,
18057         length = props.length;
18058
18059     while (++index < length) {
18060       var key = props[index];
18061
18062       var newValue = customizer
18063         ? customizer(object[key], source[key], key, object, source)
18064         : undefined;
18065
18066       if (newValue === undefined) {
18067         newValue = source[key];
18068       }
18069       if (isNew) {
18070         baseAssignValue(object, key, newValue);
18071       } else {
18072         assignValue(object, key, newValue);
18073       }
18074     }
18075     return object;
18076   }
18077
18078   /**
18079    * The base implementation of `_.times` without support for iteratee shorthands
18080    * or max array length checks.
18081    *
18082    * @private
18083    * @param {number} n The number of times to invoke `iteratee`.
18084    * @param {Function} iteratee The function invoked per iteration.
18085    * @returns {Array} Returns the array of results.
18086    */
18087   function baseTimes(n, iteratee) {
18088     var index = -1,
18089         result = Array(n);
18090
18091     while (++index < n) {
18092       result[index] = iteratee(index);
18093     }
18094     return result;
18095   }
18096
18097   /**
18098    * Checks if `value` is object-like. A value is object-like if it's not `null`
18099    * and has a `typeof` result of "object".
18100    *
18101    * @static
18102    * @memberOf _
18103    * @since 4.0.0
18104    * @category Lang
18105    * @param {*} value The value to check.
18106    * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
18107    * @example
18108    *
18109    * _.isObjectLike({});
18110    * // => true
18111    *
18112    * _.isObjectLike([1, 2, 3]);
18113    * // => true
18114    *
18115    * _.isObjectLike(_.noop);
18116    * // => false
18117    *
18118    * _.isObjectLike(null);
18119    * // => false
18120    */
18121   function isObjectLike(value) {
18122     return value != null && typeof value == 'object';
18123   }
18124
18125   /** `Object#toString` result references. */
18126   var argsTag = '[object Arguments]';
18127
18128   /**
18129    * The base implementation of `_.isArguments`.
18130    *
18131    * @private
18132    * @param {*} value The value to check.
18133    * @returns {boolean} Returns `true` if `value` is an `arguments` object,
18134    */
18135   function baseIsArguments(value) {
18136     return isObjectLike(value) && baseGetTag(value) == argsTag;
18137   }
18138
18139   /** Used for built-in method references. */
18140   var objectProto$6 = Object.prototype;
18141
18142   /** Used to check objects for own properties. */
18143   var hasOwnProperty$5 = objectProto$6.hasOwnProperty;
18144
18145   /** Built-in value references. */
18146   var propertyIsEnumerable = objectProto$6.propertyIsEnumerable;
18147
18148   /**
18149    * Checks if `value` is likely an `arguments` object.
18150    *
18151    * @static
18152    * @memberOf _
18153    * @since 0.1.0
18154    * @category Lang
18155    * @param {*} value The value to check.
18156    * @returns {boolean} Returns `true` if `value` is an `arguments` object,
18157    *  else `false`.
18158    * @example
18159    *
18160    * _.isArguments(function() { return arguments; }());
18161    * // => true
18162    *
18163    * _.isArguments([1, 2, 3]);
18164    * // => false
18165    */
18166   var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
18167     return isObjectLike(value) && hasOwnProperty$5.call(value, 'callee') &&
18168       !propertyIsEnumerable.call(value, 'callee');
18169   };
18170
18171   /**
18172    * Checks if `value` is classified as an `Array` object.
18173    *
18174    * @static
18175    * @memberOf _
18176    * @since 0.1.0
18177    * @category Lang
18178    * @param {*} value The value to check.
18179    * @returns {boolean} Returns `true` if `value` is an array, else `false`.
18180    * @example
18181    *
18182    * _.isArray([1, 2, 3]);
18183    * // => true
18184    *
18185    * _.isArray(document.body.children);
18186    * // => false
18187    *
18188    * _.isArray('abc');
18189    * // => false
18190    *
18191    * _.isArray(_.noop);
18192    * // => false
18193    */
18194   var isArray = Array.isArray;
18195
18196   /**
18197    * This method returns `false`.
18198    *
18199    * @static
18200    * @memberOf _
18201    * @since 4.13.0
18202    * @category Util
18203    * @returns {boolean} Returns `false`.
18204    * @example
18205    *
18206    * _.times(2, _.stubFalse);
18207    * // => [false, false]
18208    */
18209   function stubFalse() {
18210     return false;
18211   }
18212
18213   /** Detect free variable `exports`. */
18214   var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
18215
18216   /** Detect free variable `module`. */
18217   var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
18218
18219   /** Detect the popular CommonJS extension `module.exports`. */
18220   var moduleExports = freeModule && freeModule.exports === freeExports;
18221
18222   /** Built-in value references. */
18223   var Buffer = moduleExports ? root$2.Buffer : undefined;
18224
18225   /* Built-in method references for those with the same name as other `lodash` methods. */
18226   var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
18227
18228   /**
18229    * Checks if `value` is a buffer.
18230    *
18231    * @static
18232    * @memberOf _
18233    * @since 4.3.0
18234    * @category Lang
18235    * @param {*} value The value to check.
18236    * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
18237    * @example
18238    *
18239    * _.isBuffer(new Buffer(2));
18240    * // => true
18241    *
18242    * _.isBuffer(new Uint8Array(2));
18243    * // => false
18244    */
18245   var isBuffer = nativeIsBuffer || stubFalse;
18246
18247   /** Used as references for various `Number` constants. */
18248   var MAX_SAFE_INTEGER = 9007199254740991;
18249
18250   /** Used to detect unsigned integer values. */
18251   var reIsUint = /^(?:0|[1-9]\d*)$/;
18252
18253   /**
18254    * Checks if `value` is a valid array-like index.
18255    *
18256    * @private
18257    * @param {*} value The value to check.
18258    * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
18259    * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
18260    */
18261   function isIndex(value, length) {
18262     var type = typeof value;
18263     length = length == null ? MAX_SAFE_INTEGER : length;
18264
18265     return !!length &&
18266       (type == 'number' ||
18267         (type != 'symbol' && reIsUint.test(value))) &&
18268           (value > -1 && value % 1 == 0 && value < length);
18269   }
18270
18271   /** Used as references for various `Number` constants. */
18272   var MAX_SAFE_INTEGER$1 = 9007199254740991;
18273
18274   /**
18275    * Checks if `value` is a valid array-like length.
18276    *
18277    * **Note:** This method is loosely based on
18278    * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
18279    *
18280    * @static
18281    * @memberOf _
18282    * @since 4.0.0
18283    * @category Lang
18284    * @param {*} value The value to check.
18285    * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
18286    * @example
18287    *
18288    * _.isLength(3);
18289    * // => true
18290    *
18291    * _.isLength(Number.MIN_VALUE);
18292    * // => false
18293    *
18294    * _.isLength(Infinity);
18295    * // => false
18296    *
18297    * _.isLength('3');
18298    * // => false
18299    */
18300   function isLength(value) {
18301     return typeof value == 'number' &&
18302       value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$1;
18303   }
18304
18305   /** `Object#toString` result references. */
18306   var argsTag$1 = '[object Arguments]',
18307       arrayTag = '[object Array]',
18308       boolTag = '[object Boolean]',
18309       dateTag = '[object Date]',
18310       errorTag = '[object Error]',
18311       funcTag$1 = '[object Function]',
18312       mapTag = '[object Map]',
18313       numberTag = '[object Number]',
18314       objectTag = '[object Object]',
18315       regexpTag = '[object RegExp]',
18316       setTag = '[object Set]',
18317       stringTag = '[object String]',
18318       weakMapTag = '[object WeakMap]';
18319
18320   var arrayBufferTag = '[object ArrayBuffer]',
18321       dataViewTag = '[object DataView]',
18322       float32Tag = '[object Float32Array]',
18323       float64Tag = '[object Float64Array]',
18324       int8Tag = '[object Int8Array]',
18325       int16Tag = '[object Int16Array]',
18326       int32Tag = '[object Int32Array]',
18327       uint8Tag = '[object Uint8Array]',
18328       uint8ClampedTag = '[object Uint8ClampedArray]',
18329       uint16Tag = '[object Uint16Array]',
18330       uint32Tag = '[object Uint32Array]';
18331
18332   /** Used to identify `toStringTag` values of typed arrays. */
18333   var typedArrayTags = {};
18334   typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
18335   typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
18336   typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
18337   typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
18338   typedArrayTags[uint32Tag] = true;
18339   typedArrayTags[argsTag$1] = typedArrayTags[arrayTag] =
18340   typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
18341   typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
18342   typedArrayTags[errorTag] = typedArrayTags[funcTag$1] =
18343   typedArrayTags[mapTag] = typedArrayTags[numberTag] =
18344   typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
18345   typedArrayTags[setTag] = typedArrayTags[stringTag] =
18346   typedArrayTags[weakMapTag] = false;
18347
18348   /**
18349    * The base implementation of `_.isTypedArray` without Node.js optimizations.
18350    *
18351    * @private
18352    * @param {*} value The value to check.
18353    * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18354    */
18355   function baseIsTypedArray(value) {
18356     return isObjectLike(value) &&
18357       isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
18358   }
18359
18360   /**
18361    * The base implementation of `_.unary` without support for storing metadata.
18362    *
18363    * @private
18364    * @param {Function} func The function to cap arguments for.
18365    * @returns {Function} Returns the new capped function.
18366    */
18367   function baseUnary(func) {
18368     return function(value) {
18369       return func(value);
18370     };
18371   }
18372
18373   /** Detect free variable `exports`. */
18374   var freeExports$1 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18375
18376   /** Detect free variable `module`. */
18377   var freeModule$1 = freeExports$1 && typeof module == 'object' && module && !module.nodeType && module;
18378
18379   /** Detect the popular CommonJS extension `module.exports`. */
18380   var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;
18381
18382   /** Detect free variable `process` from Node.js. */
18383   var freeProcess = moduleExports$1 && freeGlobal.process;
18384
18385   /** Used to access faster Node.js helpers. */
18386   var nodeUtil = (function() {
18387     try {
18388       // Use `util.types` for Node.js 10+.
18389       var types = freeModule$1 && freeModule$1.require && freeModule$1.require('util').types;
18390
18391       if (types) {
18392         return types;
18393       }
18394
18395       // Legacy `process.binding('util')` for Node.js < 10.
18396       return freeProcess && freeProcess.binding && freeProcess.binding('util');
18397     } catch (e) {}
18398   }());
18399
18400   /* Node.js helper references. */
18401   var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
18402
18403   /**
18404    * Checks if `value` is classified as a typed array.
18405    *
18406    * @static
18407    * @memberOf _
18408    * @since 3.0.0
18409    * @category Lang
18410    * @param {*} value The value to check.
18411    * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18412    * @example
18413    *
18414    * _.isTypedArray(new Uint8Array);
18415    * // => true
18416    *
18417    * _.isTypedArray([]);
18418    * // => false
18419    */
18420   var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
18421
18422   /** Used for built-in method references. */
18423   var objectProto$7 = Object.prototype;
18424
18425   /** Used to check objects for own properties. */
18426   var hasOwnProperty$6 = objectProto$7.hasOwnProperty;
18427
18428   /**
18429    * Creates an array of the enumerable property names of the array-like `value`.
18430    *
18431    * @private
18432    * @param {*} value The value to query.
18433    * @param {boolean} inherited Specify returning inherited property names.
18434    * @returns {Array} Returns the array of property names.
18435    */
18436   function arrayLikeKeys(value, inherited) {
18437     var isArr = isArray(value),
18438         isArg = !isArr && isArguments(value),
18439         isBuff = !isArr && !isArg && isBuffer(value),
18440         isType = !isArr && !isArg && !isBuff && isTypedArray(value),
18441         skipIndexes = isArr || isArg || isBuff || isType,
18442         result = skipIndexes ? baseTimes(value.length, String) : [],
18443         length = result.length;
18444
18445     for (var key in value) {
18446       if ((inherited || hasOwnProperty$6.call(value, key)) &&
18447           !(skipIndexes && (
18448              // Safari 9 has enumerable `arguments.length` in strict mode.
18449              key == 'length' ||
18450              // Node.js 0.10 has enumerable non-index properties on buffers.
18451              (isBuff && (key == 'offset' || key == 'parent')) ||
18452              // PhantomJS 2 has enumerable non-index properties on typed arrays.
18453              (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
18454              // Skip index properties.
18455              isIndex(key, length)
18456           ))) {
18457         result.push(key);
18458       }
18459     }
18460     return result;
18461   }
18462
18463   /** Used for built-in method references. */
18464   var objectProto$8 = Object.prototype;
18465
18466   /**
18467    * Checks if `value` is likely a prototype object.
18468    *
18469    * @private
18470    * @param {*} value The value to check.
18471    * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
18472    */
18473   function isPrototype(value) {
18474     var Ctor = value && value.constructor,
18475         proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$8;
18476
18477     return value === proto;
18478   }
18479
18480   /**
18481    * Creates a unary function that invokes `func` with its argument transformed.
18482    *
18483    * @private
18484    * @param {Function} func The function to wrap.
18485    * @param {Function} transform The argument transform.
18486    * @returns {Function} Returns the new function.
18487    */
18488   function overArg(func, transform) {
18489     return function(arg) {
18490       return func(transform(arg));
18491     };
18492   }
18493
18494   /* Built-in method references for those with the same name as other `lodash` methods. */
18495   var nativeKeys = overArg(Object.keys, Object);
18496
18497   /** Used for built-in method references. */
18498   var objectProto$9 = Object.prototype;
18499
18500   /** Used to check objects for own properties. */
18501   var hasOwnProperty$7 = objectProto$9.hasOwnProperty;
18502
18503   /**
18504    * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
18505    *
18506    * @private
18507    * @param {Object} object The object to query.
18508    * @returns {Array} Returns the array of property names.
18509    */
18510   function baseKeys(object) {
18511     if (!isPrototype(object)) {
18512       return nativeKeys(object);
18513     }
18514     var result = [];
18515     for (var key in Object(object)) {
18516       if (hasOwnProperty$7.call(object, key) && key != 'constructor') {
18517         result.push(key);
18518       }
18519     }
18520     return result;
18521   }
18522
18523   /**
18524    * Checks if `value` is array-like. A value is considered array-like if it's
18525    * not a function and has a `value.length` that's an integer greater than or
18526    * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
18527    *
18528    * @static
18529    * @memberOf _
18530    * @since 4.0.0
18531    * @category Lang
18532    * @param {*} value The value to check.
18533    * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
18534    * @example
18535    *
18536    * _.isArrayLike([1, 2, 3]);
18537    * // => true
18538    *
18539    * _.isArrayLike(document.body.children);
18540    * // => true
18541    *
18542    * _.isArrayLike('abc');
18543    * // => true
18544    *
18545    * _.isArrayLike(_.noop);
18546    * // => false
18547    */
18548   function isArrayLike(value) {
18549     return value != null && isLength(value.length) && !isFunction(value);
18550   }
18551
18552   /**
18553    * Creates an array of the own enumerable property names of `object`.
18554    *
18555    * **Note:** Non-object values are coerced to objects. See the
18556    * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18557    * for more details.
18558    *
18559    * @static
18560    * @since 0.1.0
18561    * @memberOf _
18562    * @category Object
18563    * @param {Object} object The object to query.
18564    * @returns {Array} Returns the array of property names.
18565    * @example
18566    *
18567    * function Foo() {
18568    *   this.a = 1;
18569    *   this.b = 2;
18570    * }
18571    *
18572    * Foo.prototype.c = 3;
18573    *
18574    * _.keys(new Foo);
18575    * // => ['a', 'b'] (iteration order is not guaranteed)
18576    *
18577    * _.keys('hi');
18578    * // => ['0', '1']
18579    */
18580   function keys$1(object) {
18581     return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
18582   }
18583
18584   /**
18585    * The base implementation of `_.assign` without support for multiple sources
18586    * or `customizer` functions.
18587    *
18588    * @private
18589    * @param {Object} object The destination object.
18590    * @param {Object} source The source object.
18591    * @returns {Object} Returns `object`.
18592    */
18593   function baseAssign(object, source) {
18594     return object && copyObject(source, keys$1(source), object);
18595   }
18596
18597   /**
18598    * This function is like
18599    * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18600    * except that it includes inherited enumerable properties.
18601    *
18602    * @private
18603    * @param {Object} object The object to query.
18604    * @returns {Array} Returns the array of property names.
18605    */
18606   function nativeKeysIn(object) {
18607     var result = [];
18608     if (object != null) {
18609       for (var key in Object(object)) {
18610         result.push(key);
18611       }
18612     }
18613     return result;
18614   }
18615
18616   /** Used for built-in method references. */
18617   var objectProto$a = Object.prototype;
18618
18619   /** Used to check objects for own properties. */
18620   var hasOwnProperty$8 = objectProto$a.hasOwnProperty;
18621
18622   /**
18623    * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
18624    *
18625    * @private
18626    * @param {Object} object The object to query.
18627    * @returns {Array} Returns the array of property names.
18628    */
18629   function baseKeysIn(object) {
18630     if (!isObject(object)) {
18631       return nativeKeysIn(object);
18632     }
18633     var isProto = isPrototype(object),
18634         result = [];
18635
18636     for (var key in object) {
18637       if (!(key == 'constructor' && (isProto || !hasOwnProperty$8.call(object, key)))) {
18638         result.push(key);
18639       }
18640     }
18641     return result;
18642   }
18643
18644   /**
18645    * Creates an array of the own and inherited enumerable property names of `object`.
18646    *
18647    * **Note:** Non-object values are coerced to objects.
18648    *
18649    * @static
18650    * @memberOf _
18651    * @since 3.0.0
18652    * @category Object
18653    * @param {Object} object The object to query.
18654    * @returns {Array} Returns the array of property names.
18655    * @example
18656    *
18657    * function Foo() {
18658    *   this.a = 1;
18659    *   this.b = 2;
18660    * }
18661    *
18662    * Foo.prototype.c = 3;
18663    *
18664    * _.keysIn(new Foo);
18665    * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
18666    */
18667   function keysIn$1(object) {
18668     return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
18669   }
18670
18671   /**
18672    * The base implementation of `_.assignIn` without support for multiple sources
18673    * or `customizer` functions.
18674    *
18675    * @private
18676    * @param {Object} object The destination object.
18677    * @param {Object} source The source object.
18678    * @returns {Object} Returns `object`.
18679    */
18680   function baseAssignIn(object, source) {
18681     return object && copyObject(source, keysIn$1(source), object);
18682   }
18683
18684   /** Detect free variable `exports`. */
18685   var freeExports$2 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18686
18687   /** Detect free variable `module`. */
18688   var freeModule$2 = freeExports$2 && typeof module == 'object' && module && !module.nodeType && module;
18689
18690   /** Detect the popular CommonJS extension `module.exports`. */
18691   var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
18692
18693   /** Built-in value references. */
18694   var Buffer$1 = moduleExports$2 ? root$2.Buffer : undefined,
18695       allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : undefined;
18696
18697   /**
18698    * Creates a clone of  `buffer`.
18699    *
18700    * @private
18701    * @param {Buffer} buffer The buffer to clone.
18702    * @param {boolean} [isDeep] Specify a deep clone.
18703    * @returns {Buffer} Returns the cloned buffer.
18704    */
18705   function cloneBuffer(buffer, isDeep) {
18706     if (isDeep) {
18707       return buffer.slice();
18708     }
18709     var length = buffer.length,
18710         result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
18711
18712     buffer.copy(result);
18713     return result;
18714   }
18715
18716   /**
18717    * Copies the values of `source` to `array`.
18718    *
18719    * @private
18720    * @param {Array} source The array to copy values from.
18721    * @param {Array} [array=[]] The array to copy values to.
18722    * @returns {Array} Returns `array`.
18723    */
18724   function copyArray(source, array) {
18725     var index = -1,
18726         length = source.length;
18727
18728     array || (array = Array(length));
18729     while (++index < length) {
18730       array[index] = source[index];
18731     }
18732     return array;
18733   }
18734
18735   /**
18736    * A specialized version of `_.filter` for arrays without support for
18737    * iteratee shorthands.
18738    *
18739    * @private
18740    * @param {Array} [array] The array to iterate over.
18741    * @param {Function} predicate The function invoked per iteration.
18742    * @returns {Array} Returns the new filtered array.
18743    */
18744   function arrayFilter(array, predicate) {
18745     var index = -1,
18746         length = array == null ? 0 : array.length,
18747         resIndex = 0,
18748         result = [];
18749
18750     while (++index < length) {
18751       var value = array[index];
18752       if (predicate(value, index, array)) {
18753         result[resIndex++] = value;
18754       }
18755     }
18756     return result;
18757   }
18758
18759   /**
18760    * This method returns a new empty array.
18761    *
18762    * @static
18763    * @memberOf _
18764    * @since 4.13.0
18765    * @category Util
18766    * @returns {Array} Returns the new empty array.
18767    * @example
18768    *
18769    * var arrays = _.times(2, _.stubArray);
18770    *
18771    * console.log(arrays);
18772    * // => [[], []]
18773    *
18774    * console.log(arrays[0] === arrays[1]);
18775    * // => false
18776    */
18777   function stubArray() {
18778     return [];
18779   }
18780
18781   /** Used for built-in method references. */
18782   var objectProto$b = Object.prototype;
18783
18784   /** Built-in value references. */
18785   var propertyIsEnumerable$1 = objectProto$b.propertyIsEnumerable;
18786
18787   /* Built-in method references for those with the same name as other `lodash` methods. */
18788   var nativeGetSymbols = Object.getOwnPropertySymbols;
18789
18790   /**
18791    * Creates an array of the own enumerable symbols of `object`.
18792    *
18793    * @private
18794    * @param {Object} object The object to query.
18795    * @returns {Array} Returns the array of symbols.
18796    */
18797   var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
18798     if (object == null) {
18799       return [];
18800     }
18801     object = Object(object);
18802     return arrayFilter(nativeGetSymbols(object), function(symbol) {
18803       return propertyIsEnumerable$1.call(object, symbol);
18804     });
18805   };
18806
18807   /**
18808    * Copies own symbols of `source` to `object`.
18809    *
18810    * @private
18811    * @param {Object} source The object to copy symbols from.
18812    * @param {Object} [object={}] The object to copy symbols to.
18813    * @returns {Object} Returns `object`.
18814    */
18815   function copySymbols(source, object) {
18816     return copyObject(source, getSymbols(source), object);
18817   }
18818
18819   /**
18820    * Appends the elements of `values` to `array`.
18821    *
18822    * @private
18823    * @param {Array} array The array to modify.
18824    * @param {Array} values The values to append.
18825    * @returns {Array} Returns `array`.
18826    */
18827   function arrayPush(array, values) {
18828     var index = -1,
18829         length = values.length,
18830         offset = array.length;
18831
18832     while (++index < length) {
18833       array[offset + index] = values[index];
18834     }
18835     return array;
18836   }
18837
18838   /** Built-in value references. */
18839   var getPrototype = overArg(Object.getPrototypeOf, Object);
18840
18841   /* Built-in method references for those with the same name as other `lodash` methods. */
18842   var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
18843
18844   /**
18845    * Creates an array of the own and inherited enumerable symbols of `object`.
18846    *
18847    * @private
18848    * @param {Object} object The object to query.
18849    * @returns {Array} Returns the array of symbols.
18850    */
18851   var getSymbolsIn = !nativeGetSymbols$1 ? stubArray : function(object) {
18852     var result = [];
18853     while (object) {
18854       arrayPush(result, getSymbols(object));
18855       object = getPrototype(object);
18856     }
18857     return result;
18858   };
18859
18860   /**
18861    * Copies own and inherited symbols of `source` to `object`.
18862    *
18863    * @private
18864    * @param {Object} source The object to copy symbols from.
18865    * @param {Object} [object={}] The object to copy symbols to.
18866    * @returns {Object} Returns `object`.
18867    */
18868   function copySymbolsIn(source, object) {
18869     return copyObject(source, getSymbolsIn(source), object);
18870   }
18871
18872   /**
18873    * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
18874    * `keysFunc` and `symbolsFunc` to get the enumerable property names and
18875    * symbols of `object`.
18876    *
18877    * @private
18878    * @param {Object} object The object to query.
18879    * @param {Function} keysFunc The function to get the keys of `object`.
18880    * @param {Function} symbolsFunc The function to get the symbols of `object`.
18881    * @returns {Array} Returns the array of property names and symbols.
18882    */
18883   function baseGetAllKeys(object, keysFunc, symbolsFunc) {
18884     var result = keysFunc(object);
18885     return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
18886   }
18887
18888   /**
18889    * Creates an array of own enumerable property names and symbols of `object`.
18890    *
18891    * @private
18892    * @param {Object} object The object to query.
18893    * @returns {Array} Returns the array of property names and symbols.
18894    */
18895   function getAllKeys(object) {
18896     return baseGetAllKeys(object, keys$1, getSymbols);
18897   }
18898
18899   /**
18900    * Creates an array of own and inherited enumerable property names and
18901    * symbols of `object`.
18902    *
18903    * @private
18904    * @param {Object} object The object to query.
18905    * @returns {Array} Returns the array of property names and symbols.
18906    */
18907   function getAllKeysIn(object) {
18908     return baseGetAllKeys(object, keysIn$1, getSymbolsIn);
18909   }
18910
18911   /* Built-in method references that are verified to be native. */
18912   var DataView = getNative(root$2, 'DataView');
18913
18914   /* Built-in method references that are verified to be native. */
18915   var Promise = getNative(root$2, 'Promise');
18916
18917   /* Built-in method references that are verified to be native. */
18918   var Set$1 = getNative(root$2, 'Set');
18919
18920   /* Built-in method references that are verified to be native. */
18921   var WeakMap = getNative(root$2, 'WeakMap');
18922
18923   /** `Object#toString` result references. */
18924   var mapTag$1 = '[object Map]',
18925       objectTag$1 = '[object Object]',
18926       promiseTag = '[object Promise]',
18927       setTag$1 = '[object Set]',
18928       weakMapTag$1 = '[object WeakMap]';
18929
18930   var dataViewTag$1 = '[object DataView]';
18931
18932   /** Used to detect maps, sets, and weakmaps. */
18933   var dataViewCtorString = toSource(DataView),
18934       mapCtorString = toSource(Map$1),
18935       promiseCtorString = toSource(Promise),
18936       setCtorString = toSource(Set$1),
18937       weakMapCtorString = toSource(WeakMap);
18938
18939   /**
18940    * Gets the `toStringTag` of `value`.
18941    *
18942    * @private
18943    * @param {*} value The value to query.
18944    * @returns {string} Returns the `toStringTag`.
18945    */
18946   var getTag = baseGetTag;
18947
18948   // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
18949   if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$1) ||
18950       (Map$1 && getTag(new Map$1) != mapTag$1) ||
18951       (Promise && getTag(Promise.resolve()) != promiseTag) ||
18952       (Set$1 && getTag(new Set$1) != setTag$1) ||
18953       (WeakMap && getTag(new WeakMap) != weakMapTag$1)) {
18954     getTag = function(value) {
18955       var result = baseGetTag(value),
18956           Ctor = result == objectTag$1 ? value.constructor : undefined,
18957           ctorString = Ctor ? toSource(Ctor) : '';
18958
18959       if (ctorString) {
18960         switch (ctorString) {
18961           case dataViewCtorString: return dataViewTag$1;
18962           case mapCtorString: return mapTag$1;
18963           case promiseCtorString: return promiseTag;
18964           case setCtorString: return setTag$1;
18965           case weakMapCtorString: return weakMapTag$1;
18966         }
18967       }
18968       return result;
18969     };
18970   }
18971
18972   var getTag$1 = getTag;
18973
18974   /** Used for built-in method references. */
18975   var objectProto$c = Object.prototype;
18976
18977   /** Used to check objects for own properties. */
18978   var hasOwnProperty$9 = objectProto$c.hasOwnProperty;
18979
18980   /**
18981    * Initializes an array clone.
18982    *
18983    * @private
18984    * @param {Array} array The array to clone.
18985    * @returns {Array} Returns the initialized clone.
18986    */
18987   function initCloneArray(array) {
18988     var length = array.length,
18989         result = new array.constructor(length);
18990
18991     // Add properties assigned by `RegExp#exec`.
18992     if (length && typeof array[0] == 'string' && hasOwnProperty$9.call(array, 'index')) {
18993       result.index = array.index;
18994       result.input = array.input;
18995     }
18996     return result;
18997   }
18998
18999   /** Built-in value references. */
19000   var Uint8Array$1 = root$2.Uint8Array;
19001
19002   /**
19003    * Creates a clone of `arrayBuffer`.
19004    *
19005    * @private
19006    * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
19007    * @returns {ArrayBuffer} Returns the cloned array buffer.
19008    */
19009   function cloneArrayBuffer(arrayBuffer) {
19010     var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
19011     new Uint8Array$1(result).set(new Uint8Array$1(arrayBuffer));
19012     return result;
19013   }
19014
19015   /**
19016    * Creates a clone of `dataView`.
19017    *
19018    * @private
19019    * @param {Object} dataView The data view to clone.
19020    * @param {boolean} [isDeep] Specify a deep clone.
19021    * @returns {Object} Returns the cloned data view.
19022    */
19023   function cloneDataView(dataView, isDeep) {
19024     var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
19025     return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
19026   }
19027
19028   /** Used to match `RegExp` flags from their coerced string values. */
19029   var reFlags = /\w*$/;
19030
19031   /**
19032    * Creates a clone of `regexp`.
19033    *
19034    * @private
19035    * @param {Object} regexp The regexp to clone.
19036    * @returns {Object} Returns the cloned regexp.
19037    */
19038   function cloneRegExp(regexp) {
19039     var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
19040     result.lastIndex = regexp.lastIndex;
19041     return result;
19042   }
19043
19044   /** Used to convert symbols to primitives and strings. */
19045   var symbolProto = Symbol ? Symbol.prototype : undefined,
19046       symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
19047
19048   /**
19049    * Creates a clone of the `symbol` object.
19050    *
19051    * @private
19052    * @param {Object} symbol The symbol object to clone.
19053    * @returns {Object} Returns the cloned symbol object.
19054    */
19055   function cloneSymbol(symbol) {
19056     return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
19057   }
19058
19059   /**
19060    * Creates a clone of `typedArray`.
19061    *
19062    * @private
19063    * @param {Object} typedArray The typed array to clone.
19064    * @param {boolean} [isDeep] Specify a deep clone.
19065    * @returns {Object} Returns the cloned typed array.
19066    */
19067   function cloneTypedArray(typedArray, isDeep) {
19068     var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
19069     return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
19070   }
19071
19072   /** `Object#toString` result references. */
19073   var boolTag$1 = '[object Boolean]',
19074       dateTag$1 = '[object Date]',
19075       mapTag$2 = '[object Map]',
19076       numberTag$1 = '[object Number]',
19077       regexpTag$1 = '[object RegExp]',
19078       setTag$2 = '[object Set]',
19079       stringTag$1 = '[object String]',
19080       symbolTag = '[object Symbol]';
19081
19082   var arrayBufferTag$1 = '[object ArrayBuffer]',
19083       dataViewTag$2 = '[object DataView]',
19084       float32Tag$1 = '[object Float32Array]',
19085       float64Tag$1 = '[object Float64Array]',
19086       int8Tag$1 = '[object Int8Array]',
19087       int16Tag$1 = '[object Int16Array]',
19088       int32Tag$1 = '[object Int32Array]',
19089       uint8Tag$1 = '[object Uint8Array]',
19090       uint8ClampedTag$1 = '[object Uint8ClampedArray]',
19091       uint16Tag$1 = '[object Uint16Array]',
19092       uint32Tag$1 = '[object Uint32Array]';
19093
19094   /**
19095    * Initializes an object clone based on its `toStringTag`.
19096    *
19097    * **Note:** This function only supports cloning values with tags of
19098    * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
19099    *
19100    * @private
19101    * @param {Object} object The object to clone.
19102    * @param {string} tag The `toStringTag` of the object to clone.
19103    * @param {boolean} [isDeep] Specify a deep clone.
19104    * @returns {Object} Returns the initialized clone.
19105    */
19106   function initCloneByTag(object, tag, isDeep) {
19107     var Ctor = object.constructor;
19108     switch (tag) {
19109       case arrayBufferTag$1:
19110         return cloneArrayBuffer(object);
19111
19112       case boolTag$1:
19113       case dateTag$1:
19114         return new Ctor(+object);
19115
19116       case dataViewTag$2:
19117         return cloneDataView(object, isDeep);
19118
19119       case float32Tag$1: case float64Tag$1:
19120       case int8Tag$1: case int16Tag$1: case int32Tag$1:
19121       case uint8Tag$1: case uint8ClampedTag$1: case uint16Tag$1: case uint32Tag$1:
19122         return cloneTypedArray(object, isDeep);
19123
19124       case mapTag$2:
19125         return new Ctor;
19126
19127       case numberTag$1:
19128       case stringTag$1:
19129         return new Ctor(object);
19130
19131       case regexpTag$1:
19132         return cloneRegExp(object);
19133
19134       case setTag$2:
19135         return new Ctor;
19136
19137       case symbolTag:
19138         return cloneSymbol(object);
19139     }
19140   }
19141
19142   /** Built-in value references. */
19143   var objectCreate = Object.create;
19144
19145   /**
19146    * The base implementation of `_.create` without support for assigning
19147    * properties to the created object.
19148    *
19149    * @private
19150    * @param {Object} proto The object to inherit from.
19151    * @returns {Object} Returns the new object.
19152    */
19153   var baseCreate = (function() {
19154     function object() {}
19155     return function(proto) {
19156       if (!isObject(proto)) {
19157         return {};
19158       }
19159       if (objectCreate) {
19160         return objectCreate(proto);
19161       }
19162       object.prototype = proto;
19163       var result = new object;
19164       object.prototype = undefined;
19165       return result;
19166     };
19167   }());
19168
19169   /**
19170    * Initializes an object clone.
19171    *
19172    * @private
19173    * @param {Object} object The object to clone.
19174    * @returns {Object} Returns the initialized clone.
19175    */
19176   function initCloneObject(object) {
19177     return (typeof object.constructor == 'function' && !isPrototype(object))
19178       ? baseCreate(getPrototype(object))
19179       : {};
19180   }
19181
19182   /** `Object#toString` result references. */
19183   var mapTag$3 = '[object Map]';
19184
19185   /**
19186    * The base implementation of `_.isMap` without Node.js optimizations.
19187    *
19188    * @private
19189    * @param {*} value The value to check.
19190    * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19191    */
19192   function baseIsMap(value) {
19193     return isObjectLike(value) && getTag$1(value) == mapTag$3;
19194   }
19195
19196   /* Node.js helper references. */
19197   var nodeIsMap = nodeUtil && nodeUtil.isMap;
19198
19199   /**
19200    * Checks if `value` is classified as a `Map` object.
19201    *
19202    * @static
19203    * @memberOf _
19204    * @since 4.3.0
19205    * @category Lang
19206    * @param {*} value The value to check.
19207    * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19208    * @example
19209    *
19210    * _.isMap(new Map);
19211    * // => true
19212    *
19213    * _.isMap(new WeakMap);
19214    * // => false
19215    */
19216   var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
19217
19218   /** `Object#toString` result references. */
19219   var setTag$3 = '[object Set]';
19220
19221   /**
19222    * The base implementation of `_.isSet` without Node.js optimizations.
19223    *
19224    * @private
19225    * @param {*} value The value to check.
19226    * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19227    */
19228   function baseIsSet(value) {
19229     return isObjectLike(value) && getTag$1(value) == setTag$3;
19230   }
19231
19232   /* Node.js helper references. */
19233   var nodeIsSet = nodeUtil && nodeUtil.isSet;
19234
19235   /**
19236    * Checks if `value` is classified as a `Set` object.
19237    *
19238    * @static
19239    * @memberOf _
19240    * @since 4.3.0
19241    * @category Lang
19242    * @param {*} value The value to check.
19243    * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19244    * @example
19245    *
19246    * _.isSet(new Set);
19247    * // => true
19248    *
19249    * _.isSet(new WeakSet);
19250    * // => false
19251    */
19252   var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
19253
19254   /** Used to compose bitmasks for cloning. */
19255   var CLONE_DEEP_FLAG = 1,
19256       CLONE_FLAT_FLAG = 2,
19257       CLONE_SYMBOLS_FLAG = 4;
19258
19259   /** `Object#toString` result references. */
19260   var argsTag$2 = '[object Arguments]',
19261       arrayTag$1 = '[object Array]',
19262       boolTag$2 = '[object Boolean]',
19263       dateTag$2 = '[object Date]',
19264       errorTag$1 = '[object Error]',
19265       funcTag$2 = '[object Function]',
19266       genTag$1 = '[object GeneratorFunction]',
19267       mapTag$4 = '[object Map]',
19268       numberTag$2 = '[object Number]',
19269       objectTag$2 = '[object Object]',
19270       regexpTag$2 = '[object RegExp]',
19271       setTag$4 = '[object Set]',
19272       stringTag$2 = '[object String]',
19273       symbolTag$1 = '[object Symbol]',
19274       weakMapTag$2 = '[object WeakMap]';
19275
19276   var arrayBufferTag$2 = '[object ArrayBuffer]',
19277       dataViewTag$3 = '[object DataView]',
19278       float32Tag$2 = '[object Float32Array]',
19279       float64Tag$2 = '[object Float64Array]',
19280       int8Tag$2 = '[object Int8Array]',
19281       int16Tag$2 = '[object Int16Array]',
19282       int32Tag$2 = '[object Int32Array]',
19283       uint8Tag$2 = '[object Uint8Array]',
19284       uint8ClampedTag$2 = '[object Uint8ClampedArray]',
19285       uint16Tag$2 = '[object Uint16Array]',
19286       uint32Tag$2 = '[object Uint32Array]';
19287
19288   /** Used to identify `toStringTag` values supported by `_.clone`. */
19289   var cloneableTags = {};
19290   cloneableTags[argsTag$2] = cloneableTags[arrayTag$1] =
19291   cloneableTags[arrayBufferTag$2] = cloneableTags[dataViewTag$3] =
19292   cloneableTags[boolTag$2] = cloneableTags[dateTag$2] =
19293   cloneableTags[float32Tag$2] = cloneableTags[float64Tag$2] =
19294   cloneableTags[int8Tag$2] = cloneableTags[int16Tag$2] =
19295   cloneableTags[int32Tag$2] = cloneableTags[mapTag$4] =
19296   cloneableTags[numberTag$2] = cloneableTags[objectTag$2] =
19297   cloneableTags[regexpTag$2] = cloneableTags[setTag$4] =
19298   cloneableTags[stringTag$2] = cloneableTags[symbolTag$1] =
19299   cloneableTags[uint8Tag$2] = cloneableTags[uint8ClampedTag$2] =
19300   cloneableTags[uint16Tag$2] = cloneableTags[uint32Tag$2] = true;
19301   cloneableTags[errorTag$1] = cloneableTags[funcTag$2] =
19302   cloneableTags[weakMapTag$2] = false;
19303
19304   /**
19305    * The base implementation of `_.clone` and `_.cloneDeep` which tracks
19306    * traversed objects.
19307    *
19308    * @private
19309    * @param {*} value The value to clone.
19310    * @param {boolean} bitmask The bitmask flags.
19311    *  1 - Deep clone
19312    *  2 - Flatten inherited properties
19313    *  4 - Clone symbols
19314    * @param {Function} [customizer] The function to customize cloning.
19315    * @param {string} [key] The key of `value`.
19316    * @param {Object} [object] The parent object of `value`.
19317    * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
19318    * @returns {*} Returns the cloned value.
19319    */
19320   function baseClone(value, bitmask, customizer, key, object, stack) {
19321     var result,
19322         isDeep = bitmask & CLONE_DEEP_FLAG,
19323         isFlat = bitmask & CLONE_FLAT_FLAG,
19324         isFull = bitmask & CLONE_SYMBOLS_FLAG;
19325
19326     if (customizer) {
19327       result = object ? customizer(value, key, object, stack) : customizer(value);
19328     }
19329     if (result !== undefined) {
19330       return result;
19331     }
19332     if (!isObject(value)) {
19333       return value;
19334     }
19335     var isArr = isArray(value);
19336     if (isArr) {
19337       result = initCloneArray(value);
19338       if (!isDeep) {
19339         return copyArray(value, result);
19340       }
19341     } else {
19342       var tag = getTag$1(value),
19343           isFunc = tag == funcTag$2 || tag == genTag$1;
19344
19345       if (isBuffer(value)) {
19346         return cloneBuffer(value, isDeep);
19347       }
19348       if (tag == objectTag$2 || tag == argsTag$2 || (isFunc && !object)) {
19349         result = (isFlat || isFunc) ? {} : initCloneObject(value);
19350         if (!isDeep) {
19351           return isFlat
19352             ? copySymbolsIn(value, baseAssignIn(result, value))
19353             : copySymbols(value, baseAssign(result, value));
19354         }
19355       } else {
19356         if (!cloneableTags[tag]) {
19357           return object ? value : {};
19358         }
19359         result = initCloneByTag(value, tag, isDeep);
19360       }
19361     }
19362     // Check for circular references and return its corresponding clone.
19363     stack || (stack = new Stack);
19364     var stacked = stack.get(value);
19365     if (stacked) {
19366       return stacked;
19367     }
19368     stack.set(value, result);
19369
19370     if (isSet(value)) {
19371       value.forEach(function(subValue) {
19372         result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
19373       });
19374
19375       return result;
19376     }
19377
19378     if (isMap(value)) {
19379       value.forEach(function(subValue, key) {
19380         result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
19381       });
19382
19383       return result;
19384     }
19385
19386     var keysFunc = isFull
19387       ? (isFlat ? getAllKeysIn : getAllKeys)
19388       : (isFlat ? keysIn : keys$1);
19389
19390     var props = isArr ? undefined : keysFunc(value);
19391     arrayEach(props || value, function(subValue, key) {
19392       if (props) {
19393         key = subValue;
19394         subValue = value[key];
19395       }
19396       // Recursively populate clone (susceptible to call stack limits).
19397       assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
19398     });
19399     return result;
19400   }
19401
19402   /** Used to compose bitmasks for cloning. */
19403   var CLONE_SYMBOLS_FLAG$1 = 4;
19404
19405   /**
19406    * Creates a shallow clone of `value`.
19407    *
19408    * **Note:** This method is loosely based on the
19409    * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
19410    * and supports cloning arrays, array buffers, booleans, date objects, maps,
19411    * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
19412    * arrays. The own enumerable properties of `arguments` objects are cloned
19413    * as plain objects. An empty object is returned for uncloneable values such
19414    * as error objects, functions, DOM nodes, and WeakMaps.
19415    *
19416    * @static
19417    * @memberOf _
19418    * @since 0.1.0
19419    * @category Lang
19420    * @param {*} value The value to clone.
19421    * @returns {*} Returns the cloned value.
19422    * @see _.cloneDeep
19423    * @example
19424    *
19425    * var objects = [{ 'a': 1 }, { 'b': 2 }];
19426    *
19427    * var shallow = _.clone(objects);
19428    * console.log(shallow[0] === objects[0]);
19429    * // => true
19430    */
19431   function clone(value) {
19432     return baseClone(value, CLONE_SYMBOLS_FLAG$1);
19433   }
19434
19435   /**
19436    * A specialized version of `baseAggregator` for arrays.
19437    *
19438    * @private
19439    * @param {Array} [array] The array to iterate over.
19440    * @param {Function} setter The function to set `accumulator` values.
19441    * @param {Function} iteratee The iteratee to transform keys.
19442    * @param {Object} accumulator The initial aggregated object.
19443    * @returns {Function} Returns `accumulator`.
19444    */
19445   function arrayAggregator(array, setter, iteratee, accumulator) {
19446     var index = -1,
19447         length = array == null ? 0 : array.length;
19448
19449     while (++index < length) {
19450       var value = array[index];
19451       setter(accumulator, value, iteratee(value), array);
19452     }
19453     return accumulator;
19454   }
19455
19456   /**
19457    * Creates a base function for methods like `_.forIn` and `_.forOwn`.
19458    *
19459    * @private
19460    * @param {boolean} [fromRight] Specify iterating from right to left.
19461    * @returns {Function} Returns the new base function.
19462    */
19463   function createBaseFor(fromRight) {
19464     return function(object, iteratee, keysFunc) {
19465       var index = -1,
19466           iterable = Object(object),
19467           props = keysFunc(object),
19468           length = props.length;
19469
19470       while (length--) {
19471         var key = props[fromRight ? length : ++index];
19472         if (iteratee(iterable[key], key, iterable) === false) {
19473           break;
19474         }
19475       }
19476       return object;
19477     };
19478   }
19479
19480   /**
19481    * The base implementation of `baseForOwn` which iterates over `object`
19482    * properties returned by `keysFunc` and invokes `iteratee` for each property.
19483    * Iteratee functions may exit iteration early by explicitly returning `false`.
19484    *
19485    * @private
19486    * @param {Object} object The object to iterate over.
19487    * @param {Function} iteratee The function invoked per iteration.
19488    * @param {Function} keysFunc The function to get the keys of `object`.
19489    * @returns {Object} Returns `object`.
19490    */
19491   var baseFor = createBaseFor();
19492
19493   /**
19494    * The base implementation of `_.forOwn` without support for iteratee shorthands.
19495    *
19496    * @private
19497    * @param {Object} object The object to iterate over.
19498    * @param {Function} iteratee The function invoked per iteration.
19499    * @returns {Object} Returns `object`.
19500    */
19501   function baseForOwn(object, iteratee) {
19502     return object && baseFor(object, iteratee, keys$1);
19503   }
19504
19505   /**
19506    * Creates a `baseEach` or `baseEachRight` function.
19507    *
19508    * @private
19509    * @param {Function} eachFunc The function to iterate over a collection.
19510    * @param {boolean} [fromRight] Specify iterating from right to left.
19511    * @returns {Function} Returns the new base function.
19512    */
19513   function createBaseEach(eachFunc, fromRight) {
19514     return function(collection, iteratee) {
19515       if (collection == null) {
19516         return collection;
19517       }
19518       if (!isArrayLike(collection)) {
19519         return eachFunc(collection, iteratee);
19520       }
19521       var length = collection.length,
19522           index = fromRight ? length : -1,
19523           iterable = Object(collection);
19524
19525       while ((fromRight ? index-- : ++index < length)) {
19526         if (iteratee(iterable[index], index, iterable) === false) {
19527           break;
19528         }
19529       }
19530       return collection;
19531     };
19532   }
19533
19534   /**
19535    * The base implementation of `_.forEach` without support for iteratee shorthands.
19536    *
19537    * @private
19538    * @param {Array|Object} collection The collection to iterate over.
19539    * @param {Function} iteratee The function invoked per iteration.
19540    * @returns {Array|Object} Returns `collection`.
19541    */
19542   var baseEach = createBaseEach(baseForOwn);
19543
19544   /**
19545    * Aggregates elements of `collection` on `accumulator` with keys transformed
19546    * by `iteratee` and values set by `setter`.
19547    *
19548    * @private
19549    * @param {Array|Object} collection The collection to iterate over.
19550    * @param {Function} setter The function to set `accumulator` values.
19551    * @param {Function} iteratee The iteratee to transform keys.
19552    * @param {Object} accumulator The initial aggregated object.
19553    * @returns {Function} Returns `accumulator`.
19554    */
19555   function baseAggregator(collection, setter, iteratee, accumulator) {
19556     baseEach(collection, function(value, key, collection) {
19557       setter(accumulator, value, iteratee(value), collection);
19558     });
19559     return accumulator;
19560   }
19561
19562   /** Used to stand-in for `undefined` hash values. */
19563   var HASH_UNDEFINED$2 = '__lodash_hash_undefined__';
19564
19565   /**
19566    * Adds `value` to the array cache.
19567    *
19568    * @private
19569    * @name add
19570    * @memberOf SetCache
19571    * @alias push
19572    * @param {*} value The value to cache.
19573    * @returns {Object} Returns the cache instance.
19574    */
19575   function setCacheAdd(value) {
19576     this.__data__.set(value, HASH_UNDEFINED$2);
19577     return this;
19578   }
19579
19580   /**
19581    * Checks if `value` is in the array cache.
19582    *
19583    * @private
19584    * @name has
19585    * @memberOf SetCache
19586    * @param {*} value The value to search for.
19587    * @returns {number} Returns `true` if `value` is found, else `false`.
19588    */
19589   function setCacheHas(value) {
19590     return this.__data__.has(value);
19591   }
19592
19593   /**
19594    *
19595    * Creates an array cache object to store unique values.
19596    *
19597    * @private
19598    * @constructor
19599    * @param {Array} [values] The values to cache.
19600    */
19601   function SetCache(values) {
19602     var index = -1,
19603         length = values == null ? 0 : values.length;
19604
19605     this.__data__ = new MapCache;
19606     while (++index < length) {
19607       this.add(values[index]);
19608     }
19609   }
19610
19611   // Add methods to `SetCache`.
19612   SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
19613   SetCache.prototype.has = setCacheHas;
19614
19615   /**
19616    * A specialized version of `_.some` for arrays without support for iteratee
19617    * shorthands.
19618    *
19619    * @private
19620    * @param {Array} [array] The array to iterate over.
19621    * @param {Function} predicate The function invoked per iteration.
19622    * @returns {boolean} Returns `true` if any element passes the predicate check,
19623    *  else `false`.
19624    */
19625   function arraySome(array, predicate) {
19626     var index = -1,
19627         length = array == null ? 0 : array.length;
19628
19629     while (++index < length) {
19630       if (predicate(array[index], index, array)) {
19631         return true;
19632       }
19633     }
19634     return false;
19635   }
19636
19637   /**
19638    * Checks if a `cache` value for `key` exists.
19639    *
19640    * @private
19641    * @param {Object} cache The cache to query.
19642    * @param {string} key The key of the entry to check.
19643    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
19644    */
19645   function cacheHas(cache, key) {
19646     return cache.has(key);
19647   }
19648
19649   /** Used to compose bitmasks for value comparisons. */
19650   var COMPARE_PARTIAL_FLAG = 1,
19651       COMPARE_UNORDERED_FLAG = 2;
19652
19653   /**
19654    * A specialized version of `baseIsEqualDeep` for arrays with support for
19655    * partial deep comparisons.
19656    *
19657    * @private
19658    * @param {Array} array The array to compare.
19659    * @param {Array} other The other array to compare.
19660    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19661    * @param {Function} customizer The function to customize comparisons.
19662    * @param {Function} equalFunc The function to determine equivalents of values.
19663    * @param {Object} stack Tracks traversed `array` and `other` objects.
19664    * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
19665    */
19666   function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
19667     var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
19668         arrLength = array.length,
19669         othLength = other.length;
19670
19671     if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
19672       return false;
19673     }
19674     // Assume cyclic values are equal.
19675     var stacked = stack.get(array);
19676     if (stacked && stack.get(other)) {
19677       return stacked == other;
19678     }
19679     var index = -1,
19680         result = true,
19681         seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
19682
19683     stack.set(array, other);
19684     stack.set(other, array);
19685
19686     // Ignore non-index properties.
19687     while (++index < arrLength) {
19688       var arrValue = array[index],
19689           othValue = other[index];
19690
19691       if (customizer) {
19692         var compared = isPartial
19693           ? customizer(othValue, arrValue, index, other, array, stack)
19694           : customizer(arrValue, othValue, index, array, other, stack);
19695       }
19696       if (compared !== undefined) {
19697         if (compared) {
19698           continue;
19699         }
19700         result = false;
19701         break;
19702       }
19703       // Recursively compare arrays (susceptible to call stack limits).
19704       if (seen) {
19705         if (!arraySome(other, function(othValue, othIndex) {
19706               if (!cacheHas(seen, othIndex) &&
19707                   (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
19708                 return seen.push(othIndex);
19709               }
19710             })) {
19711           result = false;
19712           break;
19713         }
19714       } else if (!(
19715             arrValue === othValue ||
19716               equalFunc(arrValue, othValue, bitmask, customizer, stack)
19717           )) {
19718         result = false;
19719         break;
19720       }
19721     }
19722     stack['delete'](array);
19723     stack['delete'](other);
19724     return result;
19725   }
19726
19727   /**
19728    * Converts `map` to its key-value pairs.
19729    *
19730    * @private
19731    * @param {Object} map The map to convert.
19732    * @returns {Array} Returns the key-value pairs.
19733    */
19734   function mapToArray(map) {
19735     var index = -1,
19736         result = Array(map.size);
19737
19738     map.forEach(function(value, key) {
19739       result[++index] = [key, value];
19740     });
19741     return result;
19742   }
19743
19744   /**
19745    * Converts `set` to an array of its values.
19746    *
19747    * @private
19748    * @param {Object} set The set to convert.
19749    * @returns {Array} Returns the values.
19750    */
19751   function setToArray(set) {
19752     var index = -1,
19753         result = Array(set.size);
19754
19755     set.forEach(function(value) {
19756       result[++index] = value;
19757     });
19758     return result;
19759   }
19760
19761   /** Used to compose bitmasks for value comparisons. */
19762   var COMPARE_PARTIAL_FLAG$1 = 1,
19763       COMPARE_UNORDERED_FLAG$1 = 2;
19764
19765   /** `Object#toString` result references. */
19766   var boolTag$3 = '[object Boolean]',
19767       dateTag$3 = '[object Date]',
19768       errorTag$2 = '[object Error]',
19769       mapTag$5 = '[object Map]',
19770       numberTag$3 = '[object Number]',
19771       regexpTag$3 = '[object RegExp]',
19772       setTag$5 = '[object Set]',
19773       stringTag$3 = '[object String]',
19774       symbolTag$2 = '[object Symbol]';
19775
19776   var arrayBufferTag$3 = '[object ArrayBuffer]',
19777       dataViewTag$4 = '[object DataView]';
19778
19779   /** Used to convert symbols to primitives and strings. */
19780   var symbolProto$1 = Symbol ? Symbol.prototype : undefined,
19781       symbolValueOf$1 = symbolProto$1 ? symbolProto$1.valueOf : undefined;
19782
19783   /**
19784    * A specialized version of `baseIsEqualDeep` for comparing objects of
19785    * the same `toStringTag`.
19786    *
19787    * **Note:** This function only supports comparing values with tags of
19788    * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
19789    *
19790    * @private
19791    * @param {Object} object The object to compare.
19792    * @param {Object} other The other object to compare.
19793    * @param {string} tag The `toStringTag` of the objects to compare.
19794    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19795    * @param {Function} customizer The function to customize comparisons.
19796    * @param {Function} equalFunc The function to determine equivalents of values.
19797    * @param {Object} stack Tracks traversed `object` and `other` objects.
19798    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19799    */
19800   function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
19801     switch (tag) {
19802       case dataViewTag$4:
19803         if ((object.byteLength != other.byteLength) ||
19804             (object.byteOffset != other.byteOffset)) {
19805           return false;
19806         }
19807         object = object.buffer;
19808         other = other.buffer;
19809
19810       case arrayBufferTag$3:
19811         if ((object.byteLength != other.byteLength) ||
19812             !equalFunc(new Uint8Array$1(object), new Uint8Array$1(other))) {
19813           return false;
19814         }
19815         return true;
19816
19817       case boolTag$3:
19818       case dateTag$3:
19819       case numberTag$3:
19820         // Coerce booleans to `1` or `0` and dates to milliseconds.
19821         // Invalid dates are coerced to `NaN`.
19822         return eq(+object, +other);
19823
19824       case errorTag$2:
19825         return object.name == other.name && object.message == other.message;
19826
19827       case regexpTag$3:
19828       case stringTag$3:
19829         // Coerce regexes to strings and treat strings, primitives and objects,
19830         // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
19831         // for more details.
19832         return object == (other + '');
19833
19834       case mapTag$5:
19835         var convert = mapToArray;
19836
19837       case setTag$5:
19838         var isPartial = bitmask & COMPARE_PARTIAL_FLAG$1;
19839         convert || (convert = setToArray);
19840
19841         if (object.size != other.size && !isPartial) {
19842           return false;
19843         }
19844         // Assume cyclic values are equal.
19845         var stacked = stack.get(object);
19846         if (stacked) {
19847           return stacked == other;
19848         }
19849         bitmask |= COMPARE_UNORDERED_FLAG$1;
19850
19851         // Recursively compare objects (susceptible to call stack limits).
19852         stack.set(object, other);
19853         var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
19854         stack['delete'](object);
19855         return result;
19856
19857       case symbolTag$2:
19858         if (symbolValueOf$1) {
19859           return symbolValueOf$1.call(object) == symbolValueOf$1.call(other);
19860         }
19861     }
19862     return false;
19863   }
19864
19865   /** Used to compose bitmasks for value comparisons. */
19866   var COMPARE_PARTIAL_FLAG$2 = 1;
19867
19868   /** Used for built-in method references. */
19869   var objectProto$d = Object.prototype;
19870
19871   /** Used to check objects for own properties. */
19872   var hasOwnProperty$a = objectProto$d.hasOwnProperty;
19873
19874   /**
19875    * A specialized version of `baseIsEqualDeep` for objects with support for
19876    * partial deep comparisons.
19877    *
19878    * @private
19879    * @param {Object} object The object to compare.
19880    * @param {Object} other The other object to compare.
19881    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19882    * @param {Function} customizer The function to customize comparisons.
19883    * @param {Function} equalFunc The function to determine equivalents of values.
19884    * @param {Object} stack Tracks traversed `object` and `other` objects.
19885    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19886    */
19887   function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
19888     var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2,
19889         objProps = getAllKeys(object),
19890         objLength = objProps.length,
19891         othProps = getAllKeys(other),
19892         othLength = othProps.length;
19893
19894     if (objLength != othLength && !isPartial) {
19895       return false;
19896     }
19897     var index = objLength;
19898     while (index--) {
19899       var key = objProps[index];
19900       if (!(isPartial ? key in other : hasOwnProperty$a.call(other, key))) {
19901         return false;
19902       }
19903     }
19904     // Assume cyclic values are equal.
19905     var stacked = stack.get(object);
19906     if (stacked && stack.get(other)) {
19907       return stacked == other;
19908     }
19909     var result = true;
19910     stack.set(object, other);
19911     stack.set(other, object);
19912
19913     var skipCtor = isPartial;
19914     while (++index < objLength) {
19915       key = objProps[index];
19916       var objValue = object[key],
19917           othValue = other[key];
19918
19919       if (customizer) {
19920         var compared = isPartial
19921           ? customizer(othValue, objValue, key, other, object, stack)
19922           : customizer(objValue, othValue, key, object, other, stack);
19923       }
19924       // Recursively compare objects (susceptible to call stack limits).
19925       if (!(compared === undefined
19926             ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
19927             : compared
19928           )) {
19929         result = false;
19930         break;
19931       }
19932       skipCtor || (skipCtor = key == 'constructor');
19933     }
19934     if (result && !skipCtor) {
19935       var objCtor = object.constructor,
19936           othCtor = other.constructor;
19937
19938       // Non `Object` object instances with different constructors are not equal.
19939       if (objCtor != othCtor &&
19940           ('constructor' in object && 'constructor' in other) &&
19941           !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
19942             typeof othCtor == 'function' && othCtor instanceof othCtor)) {
19943         result = false;
19944       }
19945     }
19946     stack['delete'](object);
19947     stack['delete'](other);
19948     return result;
19949   }
19950
19951   /** Used to compose bitmasks for value comparisons. */
19952   var COMPARE_PARTIAL_FLAG$3 = 1;
19953
19954   /** `Object#toString` result references. */
19955   var argsTag$3 = '[object Arguments]',
19956       arrayTag$2 = '[object Array]',
19957       objectTag$3 = '[object Object]';
19958
19959   /** Used for built-in method references. */
19960   var objectProto$e = Object.prototype;
19961
19962   /** Used to check objects for own properties. */
19963   var hasOwnProperty$b = objectProto$e.hasOwnProperty;
19964
19965   /**
19966    * A specialized version of `baseIsEqual` for arrays and objects which performs
19967    * deep comparisons and tracks traversed objects enabling objects with circular
19968    * references to be compared.
19969    *
19970    * @private
19971    * @param {Object} object The object to compare.
19972    * @param {Object} other The other object to compare.
19973    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19974    * @param {Function} customizer The function to customize comparisons.
19975    * @param {Function} equalFunc The function to determine equivalents of values.
19976    * @param {Object} [stack] Tracks traversed `object` and `other` objects.
19977    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19978    */
19979   function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
19980     var objIsArr = isArray(object),
19981         othIsArr = isArray(other),
19982         objTag = objIsArr ? arrayTag$2 : getTag$1(object),
19983         othTag = othIsArr ? arrayTag$2 : getTag$1(other);
19984
19985     objTag = objTag == argsTag$3 ? objectTag$3 : objTag;
19986     othTag = othTag == argsTag$3 ? objectTag$3 : othTag;
19987
19988     var objIsObj = objTag == objectTag$3,
19989         othIsObj = othTag == objectTag$3,
19990         isSameTag = objTag == othTag;
19991
19992     if (isSameTag && isBuffer(object)) {
19993       if (!isBuffer(other)) {
19994         return false;
19995       }
19996       objIsArr = true;
19997       objIsObj = false;
19998     }
19999     if (isSameTag && !objIsObj) {
20000       stack || (stack = new Stack);
20001       return (objIsArr || isTypedArray(object))
20002         ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
20003         : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
20004     }
20005     if (!(bitmask & COMPARE_PARTIAL_FLAG$3)) {
20006       var objIsWrapped = objIsObj && hasOwnProperty$b.call(object, '__wrapped__'),
20007           othIsWrapped = othIsObj && hasOwnProperty$b.call(other, '__wrapped__');
20008
20009       if (objIsWrapped || othIsWrapped) {
20010         var objUnwrapped = objIsWrapped ? object.value() : object,
20011             othUnwrapped = othIsWrapped ? other.value() : other;
20012
20013         stack || (stack = new Stack);
20014         return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
20015       }
20016     }
20017     if (!isSameTag) {
20018       return false;
20019     }
20020     stack || (stack = new Stack);
20021     return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
20022   }
20023
20024   /**
20025    * The base implementation of `_.isEqual` which supports partial comparisons
20026    * and tracks traversed objects.
20027    *
20028    * @private
20029    * @param {*} value The value to compare.
20030    * @param {*} other The other value to compare.
20031    * @param {boolean} bitmask The bitmask flags.
20032    *  1 - Unordered comparison
20033    *  2 - Partial comparison
20034    * @param {Function} [customizer] The function to customize comparisons.
20035    * @param {Object} [stack] Tracks traversed `value` and `other` objects.
20036    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
20037    */
20038   function baseIsEqual(value, other, bitmask, customizer, stack) {
20039     if (value === other) {
20040       return true;
20041     }
20042     if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
20043       return value !== value && other !== other;
20044     }
20045     return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
20046   }
20047
20048   /** Used to compose bitmasks for value comparisons. */
20049   var COMPARE_PARTIAL_FLAG$4 = 1,
20050       COMPARE_UNORDERED_FLAG$2 = 2;
20051
20052   /**
20053    * The base implementation of `_.isMatch` without support for iteratee shorthands.
20054    *
20055    * @private
20056    * @param {Object} object The object to inspect.
20057    * @param {Object} source The object of property values to match.
20058    * @param {Array} matchData The property names, values, and compare flags to match.
20059    * @param {Function} [customizer] The function to customize comparisons.
20060    * @returns {boolean} Returns `true` if `object` is a match, else `false`.
20061    */
20062   function baseIsMatch(object, source, matchData, customizer) {
20063     var index = matchData.length,
20064         length = index,
20065         noCustomizer = !customizer;
20066
20067     if (object == null) {
20068       return !length;
20069     }
20070     object = Object(object);
20071     while (index--) {
20072       var data = matchData[index];
20073       if ((noCustomizer && data[2])
20074             ? data[1] !== object[data[0]]
20075             : !(data[0] in object)
20076           ) {
20077         return false;
20078       }
20079     }
20080     while (++index < length) {
20081       data = matchData[index];
20082       var key = data[0],
20083           objValue = object[key],
20084           srcValue = data[1];
20085
20086       if (noCustomizer && data[2]) {
20087         if (objValue === undefined && !(key in object)) {
20088           return false;
20089         }
20090       } else {
20091         var stack = new Stack;
20092         if (customizer) {
20093           var result = customizer(objValue, srcValue, key, object, source, stack);
20094         }
20095         if (!(result === undefined
20096               ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$4 | COMPARE_UNORDERED_FLAG$2, customizer, stack)
20097               : result
20098             )) {
20099           return false;
20100         }
20101       }
20102     }
20103     return true;
20104   }
20105
20106   /**
20107    * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
20108    *
20109    * @private
20110    * @param {*} value The value to check.
20111    * @returns {boolean} Returns `true` if `value` if suitable for strict
20112    *  equality comparisons, else `false`.
20113    */
20114   function isStrictComparable(value) {
20115     return value === value && !isObject(value);
20116   }
20117
20118   /**
20119    * Gets the property names, values, and compare flags of `object`.
20120    *
20121    * @private
20122    * @param {Object} object The object to query.
20123    * @returns {Array} Returns the match data of `object`.
20124    */
20125   function getMatchData(object) {
20126     var result = keys$1(object),
20127         length = result.length;
20128
20129     while (length--) {
20130       var key = result[length],
20131           value = object[key];
20132
20133       result[length] = [key, value, isStrictComparable(value)];
20134     }
20135     return result;
20136   }
20137
20138   /**
20139    * A specialized version of `matchesProperty` for source values suitable
20140    * for strict equality comparisons, i.e. `===`.
20141    *
20142    * @private
20143    * @param {string} key The key of the property to get.
20144    * @param {*} srcValue The value to match.
20145    * @returns {Function} Returns the new spec function.
20146    */
20147   function matchesStrictComparable(key, srcValue) {
20148     return function(object) {
20149       if (object == null) {
20150         return false;
20151       }
20152       return object[key] === srcValue &&
20153         (srcValue !== undefined || (key in Object(object)));
20154     };
20155   }
20156
20157   /**
20158    * The base implementation of `_.matches` which doesn't clone `source`.
20159    *
20160    * @private
20161    * @param {Object} source The object of property values to match.
20162    * @returns {Function} Returns the new spec function.
20163    */
20164   function baseMatches(source) {
20165     var matchData = getMatchData(source);
20166     if (matchData.length == 1 && matchData[0][2]) {
20167       return matchesStrictComparable(matchData[0][0], matchData[0][1]);
20168     }
20169     return function(object) {
20170       return object === source || baseIsMatch(object, source, matchData);
20171     };
20172   }
20173
20174   /** `Object#toString` result references. */
20175   var symbolTag$3 = '[object Symbol]';
20176
20177   /**
20178    * Checks if `value` is classified as a `Symbol` primitive or object.
20179    *
20180    * @static
20181    * @memberOf _
20182    * @since 4.0.0
20183    * @category Lang
20184    * @param {*} value The value to check.
20185    * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
20186    * @example
20187    *
20188    * _.isSymbol(Symbol.iterator);
20189    * // => true
20190    *
20191    * _.isSymbol('abc');
20192    * // => false
20193    */
20194   function isSymbol(value) {
20195     return typeof value == 'symbol' ||
20196       (isObjectLike(value) && baseGetTag(value) == symbolTag$3);
20197   }
20198
20199   /** Used to match property names within property paths. */
20200   var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
20201       reIsPlainProp = /^\w*$/;
20202
20203   /**
20204    * Checks if `value` is a property name and not a property path.
20205    *
20206    * @private
20207    * @param {*} value The value to check.
20208    * @param {Object} [object] The object to query keys on.
20209    * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
20210    */
20211   function isKey(value, object) {
20212     if (isArray(value)) {
20213       return false;
20214     }
20215     var type = typeof value;
20216     if (type == 'number' || type == 'symbol' || type == 'boolean' ||
20217         value == null || isSymbol(value)) {
20218       return true;
20219     }
20220     return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
20221       (object != null && value in Object(object));
20222   }
20223
20224   /** Error message constants. */
20225   var FUNC_ERROR_TEXT = 'Expected a function';
20226
20227   /**
20228    * Creates a function that memoizes the result of `func`. If `resolver` is
20229    * provided, it determines the cache key for storing the result based on the
20230    * arguments provided to the memoized function. By default, the first argument
20231    * provided to the memoized function is used as the map cache key. The `func`
20232    * is invoked with the `this` binding of the memoized function.
20233    *
20234    * **Note:** The cache is exposed as the `cache` property on the memoized
20235    * function. Its creation may be customized by replacing the `_.memoize.Cache`
20236    * constructor with one whose instances implement the
20237    * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
20238    * method interface of `clear`, `delete`, `get`, `has`, and `set`.
20239    *
20240    * @static
20241    * @memberOf _
20242    * @since 0.1.0
20243    * @category Function
20244    * @param {Function} func The function to have its output memoized.
20245    * @param {Function} [resolver] The function to resolve the cache key.
20246    * @returns {Function} Returns the new memoized function.
20247    * @example
20248    *
20249    * var object = { 'a': 1, 'b': 2 };
20250    * var other = { 'c': 3, 'd': 4 };
20251    *
20252    * var values = _.memoize(_.values);
20253    * values(object);
20254    * // => [1, 2]
20255    *
20256    * values(other);
20257    * // => [3, 4]
20258    *
20259    * object.a = 2;
20260    * values(object);
20261    * // => [1, 2]
20262    *
20263    * // Modify the result cache.
20264    * values.cache.set(object, ['a', 'b']);
20265    * values(object);
20266    * // => ['a', 'b']
20267    *
20268    * // Replace `_.memoize.Cache`.
20269    * _.memoize.Cache = WeakMap;
20270    */
20271   function memoize(func, resolver) {
20272     if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
20273       throw new TypeError(FUNC_ERROR_TEXT);
20274     }
20275     var memoized = function() {
20276       var args = arguments,
20277           key = resolver ? resolver.apply(this, args) : args[0],
20278           cache = memoized.cache;
20279
20280       if (cache.has(key)) {
20281         return cache.get(key);
20282       }
20283       var result = func.apply(this, args);
20284       memoized.cache = cache.set(key, result) || cache;
20285       return result;
20286     };
20287     memoized.cache = new (memoize.Cache || MapCache);
20288     return memoized;
20289   }
20290
20291   // Expose `MapCache`.
20292   memoize.Cache = MapCache;
20293
20294   /** Used as the maximum memoize cache size. */
20295   var MAX_MEMOIZE_SIZE = 500;
20296
20297   /**
20298    * A specialized version of `_.memoize` which clears the memoized function's
20299    * cache when it exceeds `MAX_MEMOIZE_SIZE`.
20300    *
20301    * @private
20302    * @param {Function} func The function to have its output memoized.
20303    * @returns {Function} Returns the new memoized function.
20304    */
20305   function memoizeCapped(func) {
20306     var result = memoize(func, function(key) {
20307       if (cache.size === MAX_MEMOIZE_SIZE) {
20308         cache.clear();
20309       }
20310       return key;
20311     });
20312
20313     var cache = result.cache;
20314     return result;
20315   }
20316
20317   /** Used to match property names within property paths. */
20318   var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
20319
20320   /** Used to match backslashes in property paths. */
20321   var reEscapeChar = /\\(\\)?/g;
20322
20323   /**
20324    * Converts `string` to a property path array.
20325    *
20326    * @private
20327    * @param {string} string The string to convert.
20328    * @returns {Array} Returns the property path array.
20329    */
20330   var stringToPath = memoizeCapped(function(string) {
20331     var result = [];
20332     if (string.charCodeAt(0) === 46 /* . */) {
20333       result.push('');
20334     }
20335     string.replace(rePropName, function(match, number, quote, subString) {
20336       result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
20337     });
20338     return result;
20339   });
20340
20341   /**
20342    * A specialized version of `_.map` for arrays without support for iteratee
20343    * shorthands.
20344    *
20345    * @private
20346    * @param {Array} [array] The array to iterate over.
20347    * @param {Function} iteratee The function invoked per iteration.
20348    * @returns {Array} Returns the new mapped array.
20349    */
20350   function arrayMap(array, iteratee) {
20351     var index = -1,
20352         length = array == null ? 0 : array.length,
20353         result = Array(length);
20354
20355     while (++index < length) {
20356       result[index] = iteratee(array[index], index, array);
20357     }
20358     return result;
20359   }
20360
20361   /** Used as references for various `Number` constants. */
20362   var INFINITY = 1 / 0;
20363
20364   /** Used to convert symbols to primitives and strings. */
20365   var symbolProto$2 = Symbol ? Symbol.prototype : undefined,
20366       symbolToString = symbolProto$2 ? symbolProto$2.toString : undefined;
20367
20368   /**
20369    * The base implementation of `_.toString` which doesn't convert nullish
20370    * values to empty strings.
20371    *
20372    * @private
20373    * @param {*} value The value to process.
20374    * @returns {string} Returns the string.
20375    */
20376   function baseToString(value) {
20377     // Exit early for strings to avoid a performance hit in some environments.
20378     if (typeof value == 'string') {
20379       return value;
20380     }
20381     if (isArray(value)) {
20382       // Recursively convert values (susceptible to call stack limits).
20383       return arrayMap(value, baseToString) + '';
20384     }
20385     if (isSymbol(value)) {
20386       return symbolToString ? symbolToString.call(value) : '';
20387     }
20388     var result = (value + '');
20389     return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
20390   }
20391
20392   /**
20393    * Converts `value` to a string. An empty string is returned for `null`
20394    * and `undefined` values. The sign of `-0` is preserved.
20395    *
20396    * @static
20397    * @memberOf _
20398    * @since 4.0.0
20399    * @category Lang
20400    * @param {*} value The value to convert.
20401    * @returns {string} Returns the converted string.
20402    * @example
20403    *
20404    * _.toString(null);
20405    * // => ''
20406    *
20407    * _.toString(-0);
20408    * // => '-0'
20409    *
20410    * _.toString([1, 2, 3]);
20411    * // => '1,2,3'
20412    */
20413   function toString(value) {
20414     return value == null ? '' : baseToString(value);
20415   }
20416
20417   /**
20418    * Casts `value` to a path array if it's not one.
20419    *
20420    * @private
20421    * @param {*} value The value to inspect.
20422    * @param {Object} [object] The object to query keys on.
20423    * @returns {Array} Returns the cast property path array.
20424    */
20425   function castPath(value, object) {
20426     if (isArray(value)) {
20427       return value;
20428     }
20429     return isKey(value, object) ? [value] : stringToPath(toString(value));
20430   }
20431
20432   /** Used as references for various `Number` constants. */
20433   var INFINITY$1 = 1 / 0;
20434
20435   /**
20436    * Converts `value` to a string key if it's not a string or symbol.
20437    *
20438    * @private
20439    * @param {*} value The value to inspect.
20440    * @returns {string|symbol} Returns the key.
20441    */
20442   function toKey(value) {
20443     if (typeof value == 'string' || isSymbol(value)) {
20444       return value;
20445     }
20446     var result = (value + '');
20447     return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
20448   }
20449
20450   /**
20451    * The base implementation of `_.get` without support for default values.
20452    *
20453    * @private
20454    * @param {Object} object The object to query.
20455    * @param {Array|string} path The path of the property to get.
20456    * @returns {*} Returns the resolved value.
20457    */
20458   function baseGet(object, path) {
20459     path = castPath(path, object);
20460
20461     var index = 0,
20462         length = path.length;
20463
20464     while (object != null && index < length) {
20465       object = object[toKey(path[index++])];
20466     }
20467     return (index && index == length) ? object : undefined;
20468   }
20469
20470   /**
20471    * Gets the value at `path` of `object`. If the resolved value is
20472    * `undefined`, the `defaultValue` is returned in its place.
20473    *
20474    * @static
20475    * @memberOf _
20476    * @since 3.7.0
20477    * @category Object
20478    * @param {Object} object The object to query.
20479    * @param {Array|string} path The path of the property to get.
20480    * @param {*} [defaultValue] The value returned for `undefined` resolved values.
20481    * @returns {*} Returns the resolved value.
20482    * @example
20483    *
20484    * var object = { 'a': [{ 'b': { 'c': 3 } }] };
20485    *
20486    * _.get(object, 'a[0].b.c');
20487    * // => 3
20488    *
20489    * _.get(object, ['a', '0', 'b', 'c']);
20490    * // => 3
20491    *
20492    * _.get(object, 'a.b.c', 'default');
20493    * // => 'default'
20494    */
20495   function get$2(object, path, defaultValue) {
20496     var result = object == null ? undefined : baseGet(object, path);
20497     return result === undefined ? defaultValue : result;
20498   }
20499
20500   /**
20501    * The base implementation of `_.hasIn` without support for deep paths.
20502    *
20503    * @private
20504    * @param {Object} [object] The object to query.
20505    * @param {Array|string} key The key to check.
20506    * @returns {boolean} Returns `true` if `key` exists, else `false`.
20507    */
20508   function baseHasIn(object, key) {
20509     return object != null && key in Object(object);
20510   }
20511
20512   /**
20513    * Checks if `path` exists on `object`.
20514    *
20515    * @private
20516    * @param {Object} object The object to query.
20517    * @param {Array|string} path The path to check.
20518    * @param {Function} hasFunc The function to check properties.
20519    * @returns {boolean} Returns `true` if `path` exists, else `false`.
20520    */
20521   function hasPath(object, path, hasFunc) {
20522     path = castPath(path, object);
20523
20524     var index = -1,
20525         length = path.length,
20526         result = false;
20527
20528     while (++index < length) {
20529       var key = toKey(path[index]);
20530       if (!(result = object != null && hasFunc(object, key))) {
20531         break;
20532       }
20533       object = object[key];
20534     }
20535     if (result || ++index != length) {
20536       return result;
20537     }
20538     length = object == null ? 0 : object.length;
20539     return !!length && isLength(length) && isIndex(key, length) &&
20540       (isArray(object) || isArguments(object));
20541   }
20542
20543   /**
20544    * Checks if `path` is a direct or inherited property of `object`.
20545    *
20546    * @static
20547    * @memberOf _
20548    * @since 4.0.0
20549    * @category Object
20550    * @param {Object} object The object to query.
20551    * @param {Array|string} path The path to check.
20552    * @returns {boolean} Returns `true` if `path` exists, else `false`.
20553    * @example
20554    *
20555    * var object = _.create({ 'a': _.create({ 'b': 2 }) });
20556    *
20557    * _.hasIn(object, 'a');
20558    * // => true
20559    *
20560    * _.hasIn(object, 'a.b');
20561    * // => true
20562    *
20563    * _.hasIn(object, ['a', 'b']);
20564    * // => true
20565    *
20566    * _.hasIn(object, 'b');
20567    * // => false
20568    */
20569   function hasIn(object, path) {
20570     return object != null && hasPath(object, path, baseHasIn);
20571   }
20572
20573   /** Used to compose bitmasks for value comparisons. */
20574   var COMPARE_PARTIAL_FLAG$5 = 1,
20575       COMPARE_UNORDERED_FLAG$3 = 2;
20576
20577   /**
20578    * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
20579    *
20580    * @private
20581    * @param {string} path The path of the property to get.
20582    * @param {*} srcValue The value to match.
20583    * @returns {Function} Returns the new spec function.
20584    */
20585   function baseMatchesProperty(path, srcValue) {
20586     if (isKey(path) && isStrictComparable(srcValue)) {
20587       return matchesStrictComparable(toKey(path), srcValue);
20588     }
20589     return function(object) {
20590       var objValue = get$2(object, path);
20591       return (objValue === undefined && objValue === srcValue)
20592         ? hasIn(object, path)
20593         : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$5 | COMPARE_UNORDERED_FLAG$3);
20594     };
20595   }
20596
20597   /**
20598    * This method returns the first argument it receives.
20599    *
20600    * @static
20601    * @since 0.1.0
20602    * @memberOf _
20603    * @category Util
20604    * @param {*} value Any value.
20605    * @returns {*} Returns `value`.
20606    * @example
20607    *
20608    * var object = { 'a': 1 };
20609    *
20610    * console.log(_.identity(object) === object);
20611    * // => true
20612    */
20613   function identity$8(value) {
20614     return value;
20615   }
20616
20617   /**
20618    * The base implementation of `_.property` without support for deep paths.
20619    *
20620    * @private
20621    * @param {string} key The key of the property to get.
20622    * @returns {Function} Returns the new accessor function.
20623    */
20624   function baseProperty(key) {
20625     return function(object) {
20626       return object == null ? undefined : object[key];
20627     };
20628   }
20629
20630   /**
20631    * A specialized version of `baseProperty` which supports deep paths.
20632    *
20633    * @private
20634    * @param {Array|string} path The path of the property to get.
20635    * @returns {Function} Returns the new accessor function.
20636    */
20637   function basePropertyDeep(path) {
20638     return function(object) {
20639       return baseGet(object, path);
20640     };
20641   }
20642
20643   /**
20644    * Creates a function that returns the value at `path` of a given object.
20645    *
20646    * @static
20647    * @memberOf _
20648    * @since 2.4.0
20649    * @category Util
20650    * @param {Array|string} path The path of the property to get.
20651    * @returns {Function} Returns the new accessor function.
20652    * @example
20653    *
20654    * var objects = [
20655    *   { 'a': { 'b': 2 } },
20656    *   { 'a': { 'b': 1 } }
20657    * ];
20658    *
20659    * _.map(objects, _.property('a.b'));
20660    * // => [2, 1]
20661    *
20662    * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
20663    * // => [1, 2]
20664    */
20665   function property(path) {
20666     return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
20667   }
20668
20669   /**
20670    * The base implementation of `_.iteratee`.
20671    *
20672    * @private
20673    * @param {*} [value=_.identity] The value to convert to an iteratee.
20674    * @returns {Function} Returns the iteratee.
20675    */
20676   function baseIteratee(value) {
20677     // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
20678     // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
20679     if (typeof value == 'function') {
20680       return value;
20681     }
20682     if (value == null) {
20683       return identity$8;
20684     }
20685     if (typeof value == 'object') {
20686       return isArray(value)
20687         ? baseMatchesProperty(value[0], value[1])
20688         : baseMatches(value);
20689     }
20690     return property(value);
20691   }
20692
20693   /**
20694    * Creates a function like `_.groupBy`.
20695    *
20696    * @private
20697    * @param {Function} setter The function to set accumulator values.
20698    * @param {Function} [initializer] The accumulator object initializer.
20699    * @returns {Function} Returns the new aggregator function.
20700    */
20701   function createAggregator(setter, initializer) {
20702     return function(collection, iteratee) {
20703       var func = isArray(collection) ? arrayAggregator : baseAggregator,
20704           accumulator = initializer ? initializer() : {};
20705
20706       return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
20707     };
20708   }
20709
20710   /** Used for built-in method references. */
20711   var objectProto$f = Object.prototype;
20712
20713   /** Used to check objects for own properties. */
20714   var hasOwnProperty$c = objectProto$f.hasOwnProperty;
20715
20716   /**
20717    * Creates an object composed of keys generated from the results of running
20718    * each element of `collection` thru `iteratee`. The order of grouped values
20719    * is determined by the order they occur in `collection`. The corresponding
20720    * value of each key is an array of elements responsible for generating the
20721    * key. The iteratee is invoked with one argument: (value).
20722    *
20723    * @static
20724    * @memberOf _
20725    * @since 0.1.0
20726    * @category Collection
20727    * @param {Array|Object} collection The collection to iterate over.
20728    * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
20729    * @returns {Object} Returns the composed aggregate object.
20730    * @example
20731    *
20732    * _.groupBy([6.1, 4.2, 6.3], Math.floor);
20733    * // => { '4': [4.2], '6': [6.1, 6.3] }
20734    *
20735    * // The `_.property` iteratee shorthand.
20736    * _.groupBy(['one', 'two', 'three'], 'length');
20737    * // => { '3': ['one', 'two'], '5': ['three'] }
20738    */
20739   var groupBy = createAggregator(function(result, value, key) {
20740     if (hasOwnProperty$c.call(result, key)) {
20741       result[key].push(value);
20742     } else {
20743       baseAssignValue(result, key, [value]);
20744     }
20745   });
20746
20747   /**
20748    * Gets the last element of `array`.
20749    *
20750    * @static
20751    * @memberOf _
20752    * @since 0.1.0
20753    * @category Array
20754    * @param {Array} array The array to query.
20755    * @returns {*} Returns the last element of `array`.
20756    * @example
20757    *
20758    * _.last([1, 2, 3]);
20759    * // => 3
20760    */
20761   function last(array) {
20762     var length = array == null ? 0 : array.length;
20763     return length ? array[length - 1] : undefined;
20764   }
20765
20766   /**
20767    * The base implementation of `_.slice` without an iteratee call guard.
20768    *
20769    * @private
20770    * @param {Array} array The array to slice.
20771    * @param {number} [start=0] The start position.
20772    * @param {number} [end=array.length] The end position.
20773    * @returns {Array} Returns the slice of `array`.
20774    */
20775   function baseSlice(array, start, end) {
20776     var index = -1,
20777         length = array.length;
20778
20779     if (start < 0) {
20780       start = -start > length ? 0 : (length + start);
20781     }
20782     end = end > length ? length : end;
20783     if (end < 0) {
20784       end += length;
20785     }
20786     length = start > end ? 0 : ((end - start) >>> 0);
20787     start >>>= 0;
20788
20789     var result = Array(length);
20790     while (++index < length) {
20791       result[index] = array[index + start];
20792     }
20793     return result;
20794   }
20795
20796   /**
20797    * Gets the parent value at `path` of `object`.
20798    *
20799    * @private
20800    * @param {Object} object The object to query.
20801    * @param {Array} path The path to get the parent value of.
20802    * @returns {*} Returns the parent value.
20803    */
20804   function parent(object, path) {
20805     return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
20806   }
20807
20808   /**
20809    * The base implementation of `_.unset`.
20810    *
20811    * @private
20812    * @param {Object} object The object to modify.
20813    * @param {Array|string} path The property path to unset.
20814    * @returns {boolean} Returns `true` if the property is deleted, else `false`.
20815    */
20816   function baseUnset(object, path) {
20817     path = castPath(path, object);
20818     object = parent(object, path);
20819     return object == null || delete object[toKey(last(path))];
20820   }
20821
20822   /** `Object#toString` result references. */
20823   var objectTag$4 = '[object Object]';
20824
20825   /** Used for built-in method references. */
20826   var funcProto$2 = Function.prototype,
20827       objectProto$g = Object.prototype;
20828
20829   /** Used to resolve the decompiled source of functions. */
20830   var funcToString$2 = funcProto$2.toString;
20831
20832   /** Used to check objects for own properties. */
20833   var hasOwnProperty$d = objectProto$g.hasOwnProperty;
20834
20835   /** Used to infer the `Object` constructor. */
20836   var objectCtorString = funcToString$2.call(Object);
20837
20838   /**
20839    * Checks if `value` is a plain object, that is, an object created by the
20840    * `Object` constructor or one with a `[[Prototype]]` of `null`.
20841    *
20842    * @static
20843    * @memberOf _
20844    * @since 0.8.0
20845    * @category Lang
20846    * @param {*} value The value to check.
20847    * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
20848    * @example
20849    *
20850    * function Foo() {
20851    *   this.a = 1;
20852    * }
20853    *
20854    * _.isPlainObject(new Foo);
20855    * // => false
20856    *
20857    * _.isPlainObject([1, 2, 3]);
20858    * // => false
20859    *
20860    * _.isPlainObject({ 'x': 0, 'y': 0 });
20861    * // => true
20862    *
20863    * _.isPlainObject(Object.create(null));
20864    * // => true
20865    */
20866   function isPlainObject(value) {
20867     if (!isObjectLike(value) || baseGetTag(value) != objectTag$4) {
20868       return false;
20869     }
20870     var proto = getPrototype(value);
20871     if (proto === null) {
20872       return true;
20873     }
20874     var Ctor = hasOwnProperty$d.call(proto, 'constructor') && proto.constructor;
20875     return typeof Ctor == 'function' && Ctor instanceof Ctor &&
20876       funcToString$2.call(Ctor) == objectCtorString;
20877   }
20878
20879   /**
20880    * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
20881    * objects.
20882    *
20883    * @private
20884    * @param {*} value The value to inspect.
20885    * @param {string} key The key of the property to inspect.
20886    * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
20887    */
20888   function customOmitClone(value) {
20889     return isPlainObject(value) ? undefined : value;
20890   }
20891
20892   /** Built-in value references. */
20893   var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
20894
20895   /**
20896    * Checks if `value` is a flattenable `arguments` object or array.
20897    *
20898    * @private
20899    * @param {*} value The value to check.
20900    * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
20901    */
20902   function isFlattenable(value) {
20903     return isArray(value) || isArguments(value) ||
20904       !!(spreadableSymbol && value && value[spreadableSymbol]);
20905   }
20906
20907   /**
20908    * The base implementation of `_.flatten` with support for restricting flattening.
20909    *
20910    * @private
20911    * @param {Array} array The array to flatten.
20912    * @param {number} depth The maximum recursion depth.
20913    * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
20914    * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
20915    * @param {Array} [result=[]] The initial result value.
20916    * @returns {Array} Returns the new flattened array.
20917    */
20918   function baseFlatten(array, depth, predicate, isStrict, result) {
20919     var index = -1,
20920         length = array.length;
20921
20922     predicate || (predicate = isFlattenable);
20923     result || (result = []);
20924
20925     while (++index < length) {
20926       var value = array[index];
20927       if (depth > 0 && predicate(value)) {
20928         if (depth > 1) {
20929           // Recursively flatten arrays (susceptible to call stack limits).
20930           baseFlatten(value, depth - 1, predicate, isStrict, result);
20931         } else {
20932           arrayPush(result, value);
20933         }
20934       } else if (!isStrict) {
20935         result[result.length] = value;
20936       }
20937     }
20938     return result;
20939   }
20940
20941   /**
20942    * Flattens `array` a single level deep.
20943    *
20944    * @static
20945    * @memberOf _
20946    * @since 0.1.0
20947    * @category Array
20948    * @param {Array} array The array to flatten.
20949    * @returns {Array} Returns the new flattened array.
20950    * @example
20951    *
20952    * _.flatten([1, [2, [3, [4]], 5]]);
20953    * // => [1, 2, [3, [4]], 5]
20954    */
20955   function flatten(array) {
20956     var length = array == null ? 0 : array.length;
20957     return length ? baseFlatten(array, 1) : [];
20958   }
20959
20960   /**
20961    * A faster alternative to `Function#apply`, this function invokes `func`
20962    * with the `this` binding of `thisArg` and the arguments of `args`.
20963    *
20964    * @private
20965    * @param {Function} func The function to invoke.
20966    * @param {*} thisArg The `this` binding of `func`.
20967    * @param {Array} args The arguments to invoke `func` with.
20968    * @returns {*} Returns the result of `func`.
20969    */
20970   function apply(func, thisArg, args) {
20971     switch (args.length) {
20972       case 0: return func.call(thisArg);
20973       case 1: return func.call(thisArg, args[0]);
20974       case 2: return func.call(thisArg, args[0], args[1]);
20975       case 3: return func.call(thisArg, args[0], args[1], args[2]);
20976     }
20977     return func.apply(thisArg, args);
20978   }
20979
20980   /* Built-in method references for those with the same name as other `lodash` methods. */
20981   var nativeMax = Math.max;
20982
20983   /**
20984    * A specialized version of `baseRest` which transforms the rest array.
20985    *
20986    * @private
20987    * @param {Function} func The function to apply a rest parameter to.
20988    * @param {number} [start=func.length-1] The start position of the rest parameter.
20989    * @param {Function} transform The rest array transform.
20990    * @returns {Function} Returns the new function.
20991    */
20992   function overRest(func, start, transform) {
20993     start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
20994     return function() {
20995       var args = arguments,
20996           index = -1,
20997           length = nativeMax(args.length - start, 0),
20998           array = Array(length);
20999
21000       while (++index < length) {
21001         array[index] = args[start + index];
21002       }
21003       index = -1;
21004       var otherArgs = Array(start + 1);
21005       while (++index < start) {
21006         otherArgs[index] = args[index];
21007       }
21008       otherArgs[start] = transform(array);
21009       return apply(func, this, otherArgs);
21010     };
21011   }
21012
21013   /**
21014    * Creates a function that returns `value`.
21015    *
21016    * @static
21017    * @memberOf _
21018    * @since 2.4.0
21019    * @category Util
21020    * @param {*} value The value to return from the new function.
21021    * @returns {Function} Returns the new constant function.
21022    * @example
21023    *
21024    * var objects = _.times(2, _.constant({ 'a': 1 }));
21025    *
21026    * console.log(objects);
21027    * // => [{ 'a': 1 }, { 'a': 1 }]
21028    *
21029    * console.log(objects[0] === objects[1]);
21030    * // => true
21031    */
21032   function constant$d(value) {
21033     return function() {
21034       return value;
21035     };
21036   }
21037
21038   /**
21039    * The base implementation of `setToString` without support for hot loop shorting.
21040    *
21041    * @private
21042    * @param {Function} func The function to modify.
21043    * @param {Function} string The `toString` result.
21044    * @returns {Function} Returns `func`.
21045    */
21046   var baseSetToString = !defineProperty ? identity$8 : function(func, string) {
21047     return defineProperty(func, 'toString', {
21048       'configurable': true,
21049       'enumerable': false,
21050       'value': constant$d(string),
21051       'writable': true
21052     });
21053   };
21054
21055   /** Used to detect hot functions by number of calls within a span of milliseconds. */
21056   var HOT_COUNT = 800,
21057       HOT_SPAN = 16;
21058
21059   /* Built-in method references for those with the same name as other `lodash` methods. */
21060   var nativeNow = Date.now;
21061
21062   /**
21063    * Creates a function that'll short out and invoke `identity` instead
21064    * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
21065    * milliseconds.
21066    *
21067    * @private
21068    * @param {Function} func The function to restrict.
21069    * @returns {Function} Returns the new shortable function.
21070    */
21071   function shortOut(func) {
21072     var count = 0,
21073         lastCalled = 0;
21074
21075     return function() {
21076       var stamp = nativeNow(),
21077           remaining = HOT_SPAN - (stamp - lastCalled);
21078
21079       lastCalled = stamp;
21080       if (remaining > 0) {
21081         if (++count >= HOT_COUNT) {
21082           return arguments[0];
21083         }
21084       } else {
21085         count = 0;
21086       }
21087       return func.apply(undefined, arguments);
21088     };
21089   }
21090
21091   /**
21092    * Sets the `toString` method of `func` to return `string`.
21093    *
21094    * @private
21095    * @param {Function} func The function to modify.
21096    * @param {Function} string The `toString` result.
21097    * @returns {Function} Returns `func`.
21098    */
21099   var setToString = shortOut(baseSetToString);
21100
21101   /**
21102    * A specialized version of `baseRest` which flattens the rest array.
21103    *
21104    * @private
21105    * @param {Function} func The function to apply a rest parameter to.
21106    * @returns {Function} Returns the new function.
21107    */
21108   function flatRest(func) {
21109     return setToString(overRest(func, undefined, flatten), func + '');
21110   }
21111
21112   /** Used to compose bitmasks for cloning. */
21113   var CLONE_DEEP_FLAG$1 = 1,
21114       CLONE_FLAT_FLAG$1 = 2,
21115       CLONE_SYMBOLS_FLAG$2 = 4;
21116
21117   /**
21118    * The opposite of `_.pick`; this method creates an object composed of the
21119    * own and inherited enumerable property paths of `object` that are not omitted.
21120    *
21121    * **Note:** This method is considerably slower than `_.pick`.
21122    *
21123    * @static
21124    * @since 0.1.0
21125    * @memberOf _
21126    * @category Object
21127    * @param {Object} object The source object.
21128    * @param {...(string|string[])} [paths] The property paths to omit.
21129    * @returns {Object} Returns the new object.
21130    * @example
21131    *
21132    * var object = { 'a': 1, 'b': '2', 'c': 3 };
21133    *
21134    * _.omit(object, ['a', 'c']);
21135    * // => { 'b': '2' }
21136    */
21137   var omit = flatRest(function(object, paths) {
21138     var result = {};
21139     if (object == null) {
21140       return result;
21141     }
21142     var isDeep = false;
21143     paths = arrayMap(paths, function(path) {
21144       path = castPath(path, object);
21145       isDeep || (isDeep = path.length > 1);
21146       return path;
21147     });
21148     copyObject(object, getAllKeysIn(object), result);
21149     if (isDeep) {
21150       result = baseClone(result, CLONE_DEEP_FLAG$1 | CLONE_FLAT_FLAG$1 | CLONE_SYMBOLS_FLAG$2, customOmitClone);
21151     }
21152     var length = paths.length;
21153     while (length--) {
21154       baseUnset(result, paths[length]);
21155     }
21156     return result;
21157   });
21158
21159   /**
21160    * Creates an array with all falsey values removed. The values `false`, `null`,
21161    * `0`, `""`, `undefined`, and `NaN` are falsey.
21162    *
21163    * @static
21164    * @memberOf _
21165    * @since 0.1.0
21166    * @category Array
21167    * @param {Array} array The array to compact.
21168    * @returns {Array} Returns the new array of filtered values.
21169    * @example
21170    *
21171    * _.compact([0, 1, false, 2, '', 3]);
21172    * // => [1, 2, 3]
21173    */
21174   function compact(array) {
21175     var index = -1,
21176         length = array == null ? 0 : array.length,
21177         resIndex = 0,
21178         result = [];
21179
21180     while (++index < length) {
21181       var value = array[index];
21182       if (value) {
21183         result[resIndex++] = value;
21184       }
21185     }
21186     return result;
21187   }
21188
21189   /**
21190    * The base implementation of `_.rest` which doesn't validate or coerce arguments.
21191    *
21192    * @private
21193    * @param {Function} func The function to apply a rest parameter to.
21194    * @param {number} [start=func.length-1] The start position of the rest parameter.
21195    * @returns {Function} Returns the new function.
21196    */
21197   function baseRest(func, start) {
21198     return setToString(overRest(func, start, identity$8), func + '');
21199   }
21200
21201   /**
21202    * Checks if the given arguments are from an iteratee call.
21203    *
21204    * @private
21205    * @param {*} value The potential iteratee value argument.
21206    * @param {*} index The potential iteratee index or key argument.
21207    * @param {*} object The potential iteratee object argument.
21208    * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
21209    *  else `false`.
21210    */
21211   function isIterateeCall(value, index, object) {
21212     if (!isObject(object)) {
21213       return false;
21214     }
21215     var type = typeof index;
21216     if (type == 'number'
21217           ? (isArrayLike(object) && isIndex(index, object.length))
21218           : (type == 'string' && index in object)
21219         ) {
21220       return eq(object[index], value);
21221     }
21222     return false;
21223   }
21224
21225   /**
21226    * Creates a function like `_.assign`.
21227    *
21228    * @private
21229    * @param {Function} assigner The function to assign values.
21230    * @returns {Function} Returns the new assigner function.
21231    */
21232   function createAssigner(assigner) {
21233     return baseRest(function(object, sources) {
21234       var index = -1,
21235           length = sources.length,
21236           customizer = length > 1 ? sources[length - 1] : undefined,
21237           guard = length > 2 ? sources[2] : undefined;
21238
21239       customizer = (assigner.length > 3 && typeof customizer == 'function')
21240         ? (length--, customizer)
21241         : undefined;
21242
21243       if (guard && isIterateeCall(sources[0], sources[1], guard)) {
21244         customizer = length < 3 ? undefined : customizer;
21245         length = 1;
21246       }
21247       object = Object(object);
21248       while (++index < length) {
21249         var source = sources[index];
21250         if (source) {
21251           assigner(object, source, index, customizer);
21252         }
21253       }
21254       return object;
21255     });
21256   }
21257
21258   /**
21259    * This method is like `_.assign` except that it iterates over own and
21260    * inherited source properties.
21261    *
21262    * **Note:** This method mutates `object`.
21263    *
21264    * @static
21265    * @memberOf _
21266    * @since 4.0.0
21267    * @alias extend
21268    * @category Object
21269    * @param {Object} object The destination object.
21270    * @param {...Object} [sources] The source objects.
21271    * @returns {Object} Returns `object`.
21272    * @see _.assign
21273    * @example
21274    *
21275    * function Foo() {
21276    *   this.a = 1;
21277    * }
21278    *
21279    * function Bar() {
21280    *   this.c = 3;
21281    * }
21282    *
21283    * Foo.prototype.b = 2;
21284    * Bar.prototype.d = 4;
21285    *
21286    * _.assignIn({ 'a': 0 }, new Foo, new Bar);
21287    * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
21288    */
21289   var assignIn = createAssigner(function(object, source) {
21290     copyObject(source, keysIn$1(source), object);
21291   });
21292
21293   /**
21294    * The base implementation of `_.filter` without support for iteratee shorthands.
21295    *
21296    * @private
21297    * @param {Array|Object} collection The collection to iterate over.
21298    * @param {Function} predicate The function invoked per iteration.
21299    * @returns {Array} Returns the new filtered array.
21300    */
21301   function baseFilter(collection, predicate) {
21302     var result = [];
21303     baseEach(collection, function(value, index, collection) {
21304       if (predicate(value, index, collection)) {
21305         result.push(value);
21306       }
21307     });
21308     return result;
21309   }
21310
21311   /**
21312    * Iterates over elements of `collection`, returning an array of all elements
21313    * `predicate` returns truthy for. The predicate is invoked with three
21314    * arguments: (value, index|key, collection).
21315    *
21316    * **Note:** Unlike `_.remove`, this method returns a new array.
21317    *
21318    * @static
21319    * @memberOf _
21320    * @since 0.1.0
21321    * @category Collection
21322    * @param {Array|Object} collection The collection to iterate over.
21323    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21324    * @returns {Array} Returns the new filtered array.
21325    * @see _.reject
21326    * @example
21327    *
21328    * var users = [
21329    *   { 'user': 'barney', 'age': 36, 'active': true },
21330    *   { 'user': 'fred',   'age': 40, 'active': false }
21331    * ];
21332    *
21333    * _.filter(users, function(o) { return !o.active; });
21334    * // => objects for ['fred']
21335    *
21336    * // The `_.matches` iteratee shorthand.
21337    * _.filter(users, { 'age': 36, 'active': true });
21338    * // => objects for ['barney']
21339    *
21340    * // The `_.matchesProperty` iteratee shorthand.
21341    * _.filter(users, ['active', false]);
21342    * // => objects for ['fred']
21343    *
21344    * // The `_.property` iteratee shorthand.
21345    * _.filter(users, 'active');
21346    * // => objects for ['barney']
21347    */
21348   function filter(collection, predicate) {
21349     var func = isArray(collection) ? arrayFilter : baseFilter;
21350     return func(collection, baseIteratee(predicate, 3));
21351   }
21352
21353   /**
21354    * Creates a `_.find` or `_.findLast` function.
21355    *
21356    * @private
21357    * @param {Function} findIndexFunc The function to find the collection index.
21358    * @returns {Function} Returns the new find function.
21359    */
21360   function createFind(findIndexFunc) {
21361     return function(collection, predicate, fromIndex) {
21362       var iterable = Object(collection);
21363       if (!isArrayLike(collection)) {
21364         var iteratee = baseIteratee(predicate, 3);
21365         collection = keys$1(collection);
21366         predicate = function(key) { return iteratee(iterable[key], key, iterable); };
21367       }
21368       var index = findIndexFunc(collection, predicate, fromIndex);
21369       return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
21370     };
21371   }
21372
21373   /**
21374    * The base implementation of `_.findIndex` and `_.findLastIndex` without
21375    * support for iteratee shorthands.
21376    *
21377    * @private
21378    * @param {Array} array The array to inspect.
21379    * @param {Function} predicate The function invoked per iteration.
21380    * @param {number} fromIndex The index to search from.
21381    * @param {boolean} [fromRight] Specify iterating from right to left.
21382    * @returns {number} Returns the index of the matched value, else `-1`.
21383    */
21384   function baseFindIndex(array, predicate, fromIndex, fromRight) {
21385     var length = array.length,
21386         index = fromIndex + (fromRight ? 1 : -1);
21387
21388     while ((fromRight ? index-- : ++index < length)) {
21389       if (predicate(array[index], index, array)) {
21390         return index;
21391       }
21392     }
21393     return -1;
21394   }
21395
21396   /** Used as references for various `Number` constants. */
21397   var NAN = 0 / 0;
21398
21399   /** Used to match leading and trailing whitespace. */
21400   var reTrim = /^\s+|\s+$/g;
21401
21402   /** Used to detect bad signed hexadecimal string values. */
21403   var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
21404
21405   /** Used to detect binary string values. */
21406   var reIsBinary = /^0b[01]+$/i;
21407
21408   /** Used to detect octal string values. */
21409   var reIsOctal = /^0o[0-7]+$/i;
21410
21411   /** Built-in method references without a dependency on `root`. */
21412   var freeParseInt = parseInt;
21413
21414   /**
21415    * Converts `value` to a number.
21416    *
21417    * @static
21418    * @memberOf _
21419    * @since 4.0.0
21420    * @category Lang
21421    * @param {*} value The value to process.
21422    * @returns {number} Returns the number.
21423    * @example
21424    *
21425    * _.toNumber(3.2);
21426    * // => 3.2
21427    *
21428    * _.toNumber(Number.MIN_VALUE);
21429    * // => 5e-324
21430    *
21431    * _.toNumber(Infinity);
21432    * // => Infinity
21433    *
21434    * _.toNumber('3.2');
21435    * // => 3.2
21436    */
21437   function toNumber(value) {
21438     if (typeof value == 'number') {
21439       return value;
21440     }
21441     if (isSymbol(value)) {
21442       return NAN;
21443     }
21444     if (isObject(value)) {
21445       var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
21446       value = isObject(other) ? (other + '') : other;
21447     }
21448     if (typeof value != 'string') {
21449       return value === 0 ? value : +value;
21450     }
21451     value = value.replace(reTrim, '');
21452     var isBinary = reIsBinary.test(value);
21453     return (isBinary || reIsOctal.test(value))
21454       ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
21455       : (reIsBadHex.test(value) ? NAN : +value);
21456   }
21457
21458   /** Used as references for various `Number` constants. */
21459   var INFINITY$2 = 1 / 0,
21460       MAX_INTEGER = 1.7976931348623157e+308;
21461
21462   /**
21463    * Converts `value` to a finite number.
21464    *
21465    * @static
21466    * @memberOf _
21467    * @since 4.12.0
21468    * @category Lang
21469    * @param {*} value The value to convert.
21470    * @returns {number} Returns the converted number.
21471    * @example
21472    *
21473    * _.toFinite(3.2);
21474    * // => 3.2
21475    *
21476    * _.toFinite(Number.MIN_VALUE);
21477    * // => 5e-324
21478    *
21479    * _.toFinite(Infinity);
21480    * // => 1.7976931348623157e+308
21481    *
21482    * _.toFinite('3.2');
21483    * // => 3.2
21484    */
21485   function toFinite(value) {
21486     if (!value) {
21487       return value === 0 ? value : 0;
21488     }
21489     value = toNumber(value);
21490     if (value === INFINITY$2 || value === -INFINITY$2) {
21491       var sign = (value < 0 ? -1 : 1);
21492       return sign * MAX_INTEGER;
21493     }
21494     return value === value ? value : 0;
21495   }
21496
21497   /**
21498    * Converts `value` to an integer.
21499    *
21500    * **Note:** This method is loosely based on
21501    * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
21502    *
21503    * @static
21504    * @memberOf _
21505    * @since 4.0.0
21506    * @category Lang
21507    * @param {*} value The value to convert.
21508    * @returns {number} Returns the converted integer.
21509    * @example
21510    *
21511    * _.toInteger(3.2);
21512    * // => 3
21513    *
21514    * _.toInteger(Number.MIN_VALUE);
21515    * // => 0
21516    *
21517    * _.toInteger(Infinity);
21518    * // => 1.7976931348623157e+308
21519    *
21520    * _.toInteger('3.2');
21521    * // => 3
21522    */
21523   function toInteger(value) {
21524     var result = toFinite(value),
21525         remainder = result % 1;
21526
21527     return result === result ? (remainder ? result - remainder : result) : 0;
21528   }
21529
21530   /* Built-in method references for those with the same name as other `lodash` methods. */
21531   var nativeMax$1 = Math.max;
21532
21533   /**
21534    * This method is like `_.find` except that it returns the index of the first
21535    * element `predicate` returns truthy for instead of the element itself.
21536    *
21537    * @static
21538    * @memberOf _
21539    * @since 1.1.0
21540    * @category Array
21541    * @param {Array} array The array to inspect.
21542    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21543    * @param {number} [fromIndex=0] The index to search from.
21544    * @returns {number} Returns the index of the found element, else `-1`.
21545    * @example
21546    *
21547    * var users = [
21548    *   { 'user': 'barney',  'active': false },
21549    *   { 'user': 'fred',    'active': false },
21550    *   { 'user': 'pebbles', 'active': true }
21551    * ];
21552    *
21553    * _.findIndex(users, function(o) { return o.user == 'barney'; });
21554    * // => 0
21555    *
21556    * // The `_.matches` iteratee shorthand.
21557    * _.findIndex(users, { 'user': 'fred', 'active': false });
21558    * // => 1
21559    *
21560    * // The `_.matchesProperty` iteratee shorthand.
21561    * _.findIndex(users, ['active', false]);
21562    * // => 0
21563    *
21564    * // The `_.property` iteratee shorthand.
21565    * _.findIndex(users, 'active');
21566    * // => 2
21567    */
21568   function findIndex(array, predicate, fromIndex) {
21569     var length = array == null ? 0 : array.length;
21570     if (!length) {
21571       return -1;
21572     }
21573     var index = fromIndex == null ? 0 : toInteger(fromIndex);
21574     if (index < 0) {
21575       index = nativeMax$1(length + index, 0);
21576     }
21577     return baseFindIndex(array, baseIteratee(predicate, 3), index);
21578   }
21579
21580   /**
21581    * Iterates over elements of `collection`, returning the first element
21582    * `predicate` returns truthy for. The predicate is invoked with three
21583    * arguments: (value, index|key, collection).
21584    *
21585    * @static
21586    * @memberOf _
21587    * @since 0.1.0
21588    * @category Collection
21589    * @param {Array|Object} collection The collection to inspect.
21590    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21591    * @param {number} [fromIndex=0] The index to search from.
21592    * @returns {*} Returns the matched element, else `undefined`.
21593    * @example
21594    *
21595    * var users = [
21596    *   { 'user': 'barney',  'age': 36, 'active': true },
21597    *   { 'user': 'fred',    'age': 40, 'active': false },
21598    *   { 'user': 'pebbles', 'age': 1,  'active': true }
21599    * ];
21600    *
21601    * _.find(users, function(o) { return o.age < 40; });
21602    * // => object for 'barney'
21603    *
21604    * // The `_.matches` iteratee shorthand.
21605    * _.find(users, { 'age': 1, 'active': true });
21606    * // => object for 'pebbles'
21607    *
21608    * // The `_.matchesProperty` iteratee shorthand.
21609    * _.find(users, ['active', false]);
21610    * // => object for 'fred'
21611    *
21612    * // The `_.property` iteratee shorthand.
21613    * _.find(users, 'active');
21614    * // => object for 'barney'
21615    */
21616   var find$1 = createFind(findIndex);
21617
21618   /**
21619    * The base implementation of `_.map` without support for iteratee shorthands.
21620    *
21621    * @private
21622    * @param {Array|Object} collection The collection to iterate over.
21623    * @param {Function} iteratee The function invoked per iteration.
21624    * @returns {Array} Returns the new mapped array.
21625    */
21626   function baseMap(collection, iteratee) {
21627     var index = -1,
21628         result = isArrayLike(collection) ? Array(collection.length) : [];
21629
21630     baseEach(collection, function(value, key, collection) {
21631       result[++index] = iteratee(value, key, collection);
21632     });
21633     return result;
21634   }
21635
21636   /**
21637    * Creates an array of values by running each element in `collection` thru
21638    * `iteratee`. The iteratee is invoked with three arguments:
21639    * (value, index|key, collection).
21640    *
21641    * Many lodash methods are guarded to work as iteratees for methods like
21642    * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
21643    *
21644    * The guarded methods are:
21645    * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
21646    * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
21647    * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
21648    * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
21649    *
21650    * @static
21651    * @memberOf _
21652    * @since 0.1.0
21653    * @category Collection
21654    * @param {Array|Object} collection The collection to iterate over.
21655    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
21656    * @returns {Array} Returns the new mapped array.
21657    * @example
21658    *
21659    * function square(n) {
21660    *   return n * n;
21661    * }
21662    *
21663    * _.map([4, 8], square);
21664    * // => [16, 64]
21665    *
21666    * _.map({ 'a': 4, 'b': 8 }, square);
21667    * // => [16, 64] (iteration order is not guaranteed)
21668    *
21669    * var users = [
21670    *   { 'user': 'barney' },
21671    *   { 'user': 'fred' }
21672    * ];
21673    *
21674    * // The `_.property` iteratee shorthand.
21675    * _.map(users, 'user');
21676    * // => ['barney', 'fred']
21677    */
21678   function map$3(collection, iteratee) {
21679     var func = isArray(collection) ? arrayMap : baseMap;
21680     return func(collection, baseIteratee(iteratee, 3));
21681   }
21682
21683   /**
21684    * The base implementation of `_.values` and `_.valuesIn` which creates an
21685    * array of `object` property values corresponding to the property names
21686    * of `props`.
21687    *
21688    * @private
21689    * @param {Object} object The object to query.
21690    * @param {Array} props The property names to get values for.
21691    * @returns {Object} Returns the array of property values.
21692    */
21693   function baseValues(object, props) {
21694     return arrayMap(props, function(key) {
21695       return object[key];
21696     });
21697   }
21698
21699   /**
21700    * Creates an array of the own enumerable string keyed property values of `object`.
21701    *
21702    * **Note:** Non-object values are coerced to objects.
21703    *
21704    * @static
21705    * @since 0.1.0
21706    * @memberOf _
21707    * @category Object
21708    * @param {Object} object The object to query.
21709    * @returns {Array} Returns the array of property values.
21710    * @example
21711    *
21712    * function Foo() {
21713    *   this.a = 1;
21714    *   this.b = 2;
21715    * }
21716    *
21717    * Foo.prototype.c = 3;
21718    *
21719    * _.values(new Foo);
21720    * // => [1, 2] (iteration order is not guaranteed)
21721    *
21722    * _.values('hi');
21723    * // => ['h', 'i']
21724    */
21725   function values$1(object) {
21726     return object == null ? [] : baseValues(object, keys$1(object));
21727   }
21728
21729   /**
21730    * A specialized version of `_.every` for arrays without support for
21731    * iteratee shorthands.
21732    *
21733    * @private
21734    * @param {Array} [array] The array to iterate over.
21735    * @param {Function} predicate The function invoked per iteration.
21736    * @returns {boolean} Returns `true` if all elements pass the predicate check,
21737    *  else `false`.
21738    */
21739   function arrayEvery(array, predicate) {
21740     var index = -1,
21741         length = array == null ? 0 : array.length;
21742
21743     while (++index < length) {
21744       if (!predicate(array[index], index, array)) {
21745         return false;
21746       }
21747     }
21748     return true;
21749   }
21750
21751   /**
21752    * The base implementation of `_.every` without support for iteratee shorthands.
21753    *
21754    * @private
21755    * @param {Array|Object} collection The collection to iterate over.
21756    * @param {Function} predicate The function invoked per iteration.
21757    * @returns {boolean} Returns `true` if all elements pass the predicate check,
21758    *  else `false`
21759    */
21760   function baseEvery(collection, predicate) {
21761     var result = true;
21762     baseEach(collection, function(value, index, collection) {
21763       result = !!predicate(value, index, collection);
21764       return result;
21765     });
21766     return result;
21767   }
21768
21769   /**
21770    * Checks if `predicate` returns truthy for **all** elements of `collection`.
21771    * Iteration is stopped once `predicate` returns falsey. The predicate is
21772    * invoked with three arguments: (value, index|key, collection).
21773    *
21774    * **Note:** This method returns `true` for
21775    * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
21776    * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
21777    * elements of empty collections.
21778    *
21779    * @static
21780    * @memberOf _
21781    * @since 0.1.0
21782    * @category Collection
21783    * @param {Array|Object} collection The collection to iterate over.
21784    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21785    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
21786    * @returns {boolean} Returns `true` if all elements pass the predicate check,
21787    *  else `false`.
21788    * @example
21789    *
21790    * _.every([true, 1, null, 'yes'], Boolean);
21791    * // => false
21792    *
21793    * var users = [
21794    *   { 'user': 'barney', 'age': 36, 'active': false },
21795    *   { 'user': 'fred',   'age': 40, 'active': false }
21796    * ];
21797    *
21798    * // The `_.matches` iteratee shorthand.
21799    * _.every(users, { 'user': 'barney', 'active': false });
21800    * // => false
21801    *
21802    * // The `_.matchesProperty` iteratee shorthand.
21803    * _.every(users, ['active', false]);
21804    * // => true
21805    *
21806    * // The `_.property` iteratee shorthand.
21807    * _.every(users, 'active');
21808    * // => false
21809    */
21810   function every(collection, predicate, guard) {
21811     var func = isArray(collection) ? arrayEvery : baseEvery;
21812     if (guard && isIterateeCall(collection, predicate, guard)) {
21813       predicate = undefined;
21814     }
21815     return func(collection, baseIteratee(predicate, 3));
21816   }
21817
21818   /**
21819    * The base implementation of `_.isNaN` without support for number objects.
21820    *
21821    * @private
21822    * @param {*} value The value to check.
21823    * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
21824    */
21825   function baseIsNaN(value) {
21826     return value !== value;
21827   }
21828
21829   /**
21830    * A specialized version of `_.indexOf` which performs strict equality
21831    * comparisons of values, i.e. `===`.
21832    *
21833    * @private
21834    * @param {Array} array The array to inspect.
21835    * @param {*} value The value to search for.
21836    * @param {number} fromIndex The index to search from.
21837    * @returns {number} Returns the index of the matched value, else `-1`.
21838    */
21839   function strictIndexOf(array, value, fromIndex) {
21840     var index = fromIndex - 1,
21841         length = array.length;
21842
21843     while (++index < length) {
21844       if (array[index] === value) {
21845         return index;
21846       }
21847     }
21848     return -1;
21849   }
21850
21851   /**
21852    * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
21853    *
21854    * @private
21855    * @param {Array} array The array to inspect.
21856    * @param {*} value The value to search for.
21857    * @param {number} fromIndex The index to search from.
21858    * @returns {number} Returns the index of the matched value, else `-1`.
21859    */
21860   function baseIndexOf(array, value, fromIndex) {
21861     return value === value
21862       ? strictIndexOf(array, value, fromIndex)
21863       : baseFindIndex(array, baseIsNaN, fromIndex);
21864   }
21865
21866   /**
21867    * A specialized version of `_.includes` for arrays without support for
21868    * specifying an index to search from.
21869    *
21870    * @private
21871    * @param {Array} [array] The array to inspect.
21872    * @param {*} target The value to search for.
21873    * @returns {boolean} Returns `true` if `target` is found, else `false`.
21874    */
21875   function arrayIncludes(array, value) {
21876     var length = array == null ? 0 : array.length;
21877     return !!length && baseIndexOf(array, value, 0) > -1;
21878   }
21879
21880   /**
21881    * This function is like `arrayIncludes` except that it accepts a comparator.
21882    *
21883    * @private
21884    * @param {Array} [array] The array to inspect.
21885    * @param {*} target The value to search for.
21886    * @param {Function} comparator The comparator invoked per element.
21887    * @returns {boolean} Returns `true` if `target` is found, else `false`.
21888    */
21889   function arrayIncludesWith(array, value, comparator) {
21890     var index = -1,
21891         length = array == null ? 0 : array.length;
21892
21893     while (++index < length) {
21894       if (comparator(value, array[index])) {
21895         return true;
21896       }
21897     }
21898     return false;
21899   }
21900
21901   /**
21902    * This method returns `undefined`.
21903    *
21904    * @static
21905    * @memberOf _
21906    * @since 2.3.0
21907    * @category Util
21908    * @example
21909    *
21910    * _.times(2, _.noop);
21911    * // => [undefined, undefined]
21912    */
21913   function noop$3() {
21914     // No operation performed.
21915   }
21916
21917   /** Used as references for various `Number` constants. */
21918   var INFINITY$3 = 1 / 0;
21919
21920   /**
21921    * Creates a set object of `values`.
21922    *
21923    * @private
21924    * @param {Array} values The values to add to the set.
21925    * @returns {Object} Returns the new set.
21926    */
21927   var createSet = !(Set$1 && (1 / setToArray(new Set$1([,-0]))[1]) == INFINITY$3) ? noop$3 : function(values) {
21928     return new Set$1(values);
21929   };
21930
21931   /** Used as the size to enable large array optimizations. */
21932   var LARGE_ARRAY_SIZE$1 = 200;
21933
21934   /**
21935    * The base implementation of `_.uniqBy` without support for iteratee shorthands.
21936    *
21937    * @private
21938    * @param {Array} array The array to inspect.
21939    * @param {Function} [iteratee] The iteratee invoked per element.
21940    * @param {Function} [comparator] The comparator invoked per element.
21941    * @returns {Array} Returns the new duplicate free array.
21942    */
21943   function baseUniq(array, iteratee, comparator) {
21944     var index = -1,
21945         includes = arrayIncludes,
21946         length = array.length,
21947         isCommon = true,
21948         result = [],
21949         seen = result;
21950
21951     if (comparator) {
21952       isCommon = false;
21953       includes = arrayIncludesWith;
21954     }
21955     else if (length >= LARGE_ARRAY_SIZE$1) {
21956       var set = iteratee ? null : createSet(array);
21957       if (set) {
21958         return setToArray(set);
21959       }
21960       isCommon = false;
21961       includes = cacheHas;
21962       seen = new SetCache;
21963     }
21964     else {
21965       seen = iteratee ? [] : result;
21966     }
21967     outer:
21968     while (++index < length) {
21969       var value = array[index],
21970           computed = iteratee ? iteratee(value) : value;
21971
21972       value = (comparator || value !== 0) ? value : 0;
21973       if (isCommon && computed === computed) {
21974         var seenIndex = seen.length;
21975         while (seenIndex--) {
21976           if (seen[seenIndex] === computed) {
21977             continue outer;
21978           }
21979         }
21980         if (iteratee) {
21981           seen.push(computed);
21982         }
21983         result.push(value);
21984       }
21985       else if (!includes(seen, computed, comparator)) {
21986         if (seen !== result) {
21987           seen.push(computed);
21988         }
21989         result.push(value);
21990       }
21991     }
21992     return result;
21993   }
21994
21995   /**
21996    * This method is like `_.isArrayLike` except that it also checks if `value`
21997    * is an object.
21998    *
21999    * @static
22000    * @memberOf _
22001    * @since 4.0.0
22002    * @category Lang
22003    * @param {*} value The value to check.
22004    * @returns {boolean} Returns `true` if `value` is an array-like object,
22005    *  else `false`.
22006    * @example
22007    *
22008    * _.isArrayLikeObject([1, 2, 3]);
22009    * // => true
22010    *
22011    * _.isArrayLikeObject(document.body.children);
22012    * // => true
22013    *
22014    * _.isArrayLikeObject('abc');
22015    * // => false
22016    *
22017    * _.isArrayLikeObject(_.noop);
22018    * // => false
22019    */
22020   function isArrayLikeObject(value) {
22021     return isObjectLike(value) && isArrayLike(value);
22022   }
22023
22024   /**
22025    * Creates an array of unique values, in order, from all given arrays using
22026    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22027    * for equality comparisons.
22028    *
22029    * @static
22030    * @memberOf _
22031    * @since 0.1.0
22032    * @category Array
22033    * @param {...Array} [arrays] The arrays to inspect.
22034    * @returns {Array} Returns the new array of combined values.
22035    * @example
22036    *
22037    * _.union([2], [1, 2]);
22038    * // => [2, 1]
22039    */
22040   var union = baseRest(function(arrays) {
22041     return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
22042   });
22043
22044   /** Used as the size to enable large array optimizations. */
22045   var LARGE_ARRAY_SIZE$2 = 200;
22046
22047   /**
22048    * The base implementation of methods like `_.difference` without support
22049    * for excluding multiple arrays or iteratee shorthands.
22050    *
22051    * @private
22052    * @param {Array} array The array to inspect.
22053    * @param {Array} values The values to exclude.
22054    * @param {Function} [iteratee] The iteratee invoked per element.
22055    * @param {Function} [comparator] The comparator invoked per element.
22056    * @returns {Array} Returns the new array of filtered values.
22057    */
22058   function baseDifference(array, values, iteratee, comparator) {
22059     var index = -1,
22060         includes = arrayIncludes,
22061         isCommon = true,
22062         length = array.length,
22063         result = [],
22064         valuesLength = values.length;
22065
22066     if (!length) {
22067       return result;
22068     }
22069     if (iteratee) {
22070       values = arrayMap(values, baseUnary(iteratee));
22071     }
22072     if (comparator) {
22073       includes = arrayIncludesWith;
22074       isCommon = false;
22075     }
22076     else if (values.length >= LARGE_ARRAY_SIZE$2) {
22077       includes = cacheHas;
22078       isCommon = false;
22079       values = new SetCache(values);
22080     }
22081     outer:
22082     while (++index < length) {
22083       var value = array[index],
22084           computed = iteratee == null ? value : iteratee(value);
22085
22086       value = (comparator || value !== 0) ? value : 0;
22087       if (isCommon && computed === computed) {
22088         var valuesIndex = valuesLength;
22089         while (valuesIndex--) {
22090           if (values[valuesIndex] === computed) {
22091             continue outer;
22092           }
22093         }
22094         result.push(value);
22095       }
22096       else if (!includes(values, computed, comparator)) {
22097         result.push(value);
22098       }
22099     }
22100     return result;
22101   }
22102
22103   /**
22104    * Creates an array excluding all given values using
22105    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22106    * for equality comparisons.
22107    *
22108    * **Note:** Unlike `_.pull`, this method returns a new array.
22109    *
22110    * @static
22111    * @memberOf _
22112    * @since 0.1.0
22113    * @category Array
22114    * @param {Array} array The array to inspect.
22115    * @param {...*} [values] The values to exclude.
22116    * @returns {Array} Returns the new array of filtered values.
22117    * @see _.difference, _.xor
22118    * @example
22119    *
22120    * _.without([2, 1, 2, 3], 1, 2);
22121    * // => [3]
22122    */
22123   var without = baseRest(function(array, values) {
22124     return isArrayLikeObject(array)
22125       ? baseDifference(array, values)
22126       : [];
22127   });
22128
22129   function osmIsInterestingTag(key) {
22130       return key !== 'attribution' &&
22131           key !== 'created_by' &&
22132           key !== 'source' &&
22133           key !== 'odbl' &&
22134           key.indexOf('tiger:') !== 0;
22135   }
22136
22137
22138   var osmOneWayTags = {
22139       'aerialway': {
22140           'chair_lift': true,
22141           'drag_lift': true,
22142           'j-bar': true,
22143           'magic_carpet': true,
22144           'mixed_lift': true,
22145           'platter': true,
22146           'rope_tow': true,
22147           't-bar': true,
22148           'zipline': true
22149       },
22150       'highway': {
22151           'motorway': true
22152       },
22153       'junction': {
22154           'circular': true,
22155           'roundabout': true
22156       },
22157       'man_made': {
22158           'piste:halfpipe': true
22159       },
22160       'piste:type': {
22161           'downhill': true,
22162           'sled': true,
22163           'yes': true
22164       },
22165       'waterway': {
22166           'canal': true,
22167           'ditch': true,
22168           'drain': true,
22169           'river': true,
22170           'stream': true
22171       }
22172   };
22173
22174
22175   var osmPavedTags = {
22176       'surface': {
22177           'paved': true,
22178           'asphalt': true,
22179           'concrete': true,
22180           'concrete:lanes': true,
22181           'concrete:plates': true
22182       },
22183       'tracktype': {
22184           'grade1': true
22185       }
22186   };
22187
22188   var osmRightSideIsInsideTags = {
22189       'natural': {
22190           'cliff': true,
22191           'coastline': 'coastline',
22192       },
22193       'barrier': {
22194           'retaining_wall': true,
22195           'kerb': true,
22196           'guard_rail': true,
22197           'city_wall': true,
22198       },
22199       'man_made': {
22200           'embankment': true
22201       }
22202   };
22203
22204   var wikibooks = [
22205       [
22206           "Afrikaans",
22207           "Afrikaans",
22208           "af"
22209       ],
22210       [
22211           "Arabic",
22212           "العربية",
22213           "ar"
22214       ],
22215       [
22216           "Azerbaijani",
22217           "azərbaycanca",
22218           "az"
22219       ],
22220       [
22221           "Belarusian",
22222           "беларуская",
22223           "be"
22224       ],
22225       [
22226           "Bulgarian",
22227           "български",
22228           "bg"
22229       ],
22230       [
22231           "Bangla",
22232           "বাংলা",
22233           "bn"
22234       ],
22235       [
22236           "Bosnian",
22237           "bosanski",
22238           "bs"
22239       ],
22240       [
22241           "Catalan",
22242           "català",
22243           "ca"
22244       ],
22245       [
22246           "Czech",
22247           "čeština",
22248           "cs"
22249       ],
22250       [
22251           "Chuvash",
22252           "Чӑвашла",
22253           "cv"
22254       ],
22255       [
22256           "Welsh",
22257           "Cymraeg",
22258           "cy"
22259       ],
22260       [
22261           "Danish",
22262           "dansk",
22263           "da"
22264       ],
22265       [
22266           "German",
22267           "Deutsch",
22268           "de"
22269       ],
22270       [
22271           "Greek",
22272           "Ελληνικά",
22273           "el"
22274       ],
22275       [
22276           "English",
22277           "English",
22278           "en"
22279       ],
22280       [
22281           "Esperanto",
22282           "Esperanto",
22283           "eo"
22284       ],
22285       [
22286           "Spanish",
22287           "español",
22288           "es"
22289       ],
22290       [
22291           "Estonian",
22292           "eesti",
22293           "et"
22294       ],
22295       [
22296           "Basque",
22297           "euskara",
22298           "eu"
22299       ],
22300       [
22301           "Persian",
22302           "فارسی",
22303           "fa"
22304       ],
22305       [
22306           "Finnish",
22307           "suomi",
22308           "fi"
22309       ],
22310       [
22311           "French",
22312           "français",
22313           "fr"
22314       ],
22315       [
22316           "Western Frisian",
22317           "Frysk",
22318           "fy"
22319       ],
22320       [
22321           "Galician",
22322           "galego",
22323           "gl"
22324       ],
22325       [
22326           "Hebrew",
22327           "עברית",
22328           "he"
22329       ],
22330       [
22331           "Hindi",
22332           "हिन्दी",
22333           "hi"
22334       ],
22335       [
22336           "Croatian",
22337           "hrvatski",
22338           "hr"
22339       ],
22340       [
22341           "Hungarian",
22342           "magyar",
22343           "hu"
22344       ],
22345       [
22346           "Armenian",
22347           "Հայերեն",
22348           "hy"
22349       ],
22350       [
22351           "Interlingua",
22352           "interlingua",
22353           "ia"
22354       ],
22355       [
22356           "Indonesian",
22357           "Bahasa Indonesia",
22358           "id"
22359       ],
22360       [
22361           "Icelandic",
22362           "íslenska",
22363           "is"
22364       ],
22365       [
22366           "Italian",
22367           "italiano",
22368           "it"
22369       ],
22370       [
22371           "Japanese",
22372           "日本語",
22373           "ja"
22374       ],
22375       [
22376           "Georgian",
22377           "ქართული",
22378           "ka"
22379       ],
22380       [
22381           "Kazakh",
22382           "қазақша",
22383           "kk"
22384       ],
22385       [
22386           "Khmer",
22387           "ភាសាខ្មែរ",
22388           "km"
22389       ],
22390       [
22391           "Korean",
22392           "한국어",
22393           "ko"
22394       ],
22395       [
22396           "Kurdish",
22397           "Kurdî",
22398           "ku"
22399       ],
22400       [
22401           "Kyrgyz",
22402           "Кыргызча",
22403           "ky"
22404       ],
22405       [
22406           "Latin",
22407           "Latina",
22408           "la"
22409       ],
22410       [
22411           "Limburgish",
22412           "Limburgs",
22413           "li"
22414       ],
22415       [
22416           "Lithuanian",
22417           "lietuvių",
22418           "lt"
22419       ],
22420       [
22421           "Malagasy",
22422           "Malagasy",
22423           "mg"
22424       ],
22425       [
22426           "Macedonian",
22427           "македонски",
22428           "mk"
22429       ],
22430       [
22431           "Malayalam",
22432           "മലയാളം",
22433           "ml"
22434       ],
22435       [
22436           "Marathi",
22437           "मराठी",
22438           "mr"
22439       ],
22440       [
22441           "Malay",
22442           "Bahasa Melayu",
22443           "ms"
22444       ],
22445       [
22446           "Nepali",
22447           "नेपाली",
22448           "ne"
22449       ],
22450       [
22451           "Dutch",
22452           "Nederlands",
22453           "nl"
22454       ],
22455       [
22456           "Norwegian",
22457           "norsk bokmål",
22458           "no"
22459       ],
22460       [
22461           "Occitan",
22462           "occitan",
22463           "oc"
22464       ],
22465       [
22466           "Punjabi",
22467           "ਪੰਜਾਬੀ",
22468           "pa"
22469       ],
22470       [
22471           "Polish",
22472           "polski",
22473           "pl"
22474       ],
22475       [
22476           "Portuguese",
22477           "português",
22478           "pt"
22479       ],
22480       [
22481           "Romanian",
22482           "română",
22483           "ro"
22484       ],
22485       [
22486           "Russian",
22487           "русский",
22488           "ru"
22489       ],
22490       [
22491           "Sanskrit",
22492           "संस्कृतम्",
22493           "sa"
22494       ],
22495       [
22496           "Sinhala",
22497           "සිංහල",
22498           "si"
22499       ],
22500       [
22501           "Slovak",
22502           "slovenčina",
22503           "sk"
22504       ],
22505       [
22506           "Slovenian",
22507           "slovenščina",
22508           "sl"
22509       ],
22510       [
22511           "Albanian",
22512           "shqip",
22513           "sq"
22514       ],
22515       [
22516           "Serbian",
22517           "српски / srpski",
22518           "sr"
22519       ],
22520       [
22521           "Swedish",
22522           "svenska",
22523           "sv"
22524       ],
22525       [
22526           "Tamil",
22527           "தமிழ்",
22528           "ta"
22529       ],
22530       [
22531           "Telugu",
22532           "తెలుగు",
22533           "te"
22534       ],
22535       [
22536           "Tajik",
22537           "тоҷикӣ",
22538           "tg"
22539       ],
22540       [
22541           "Thai",
22542           "ไทย",
22543           "th"
22544       ],
22545       [
22546           "Tagalog",
22547           "Tagalog",
22548           "tl"
22549       ],
22550       [
22551           "Turkish",
22552           "Türkçe",
22553           "tr"
22554       ],
22555       [
22556           "Tatar",
22557           "татарча/tatarça",
22558           "tt"
22559       ],
22560       [
22561           "Ukrainian",
22562           "українська",
22563           "uk"
22564       ],
22565       [
22566           "Urdu",
22567           "اردو",
22568           "ur"
22569       ],
22570       [
22571           "Vietnamese",
22572           "Tiếng Việt",
22573           "vi"
22574       ],
22575       [
22576           "Chinese",
22577           "中文",
22578           "zh"
22579       ]
22580   ];
22581
22582   var wikibooks$1 = /*#__PURE__*/Object.freeze({
22583     default: wikibooks
22584   });
22585
22586   var wikinews = [
22587       [
22588           "Arabic",
22589           "العربية",
22590           "ar"
22591       ],
22592       [
22593           "Bulgarian",
22594           "български",
22595           "bg"
22596       ],
22597       [
22598           "Bosnian",
22599           "bosanski",
22600           "bs"
22601       ],
22602       [
22603           "Catalan",
22604           "català",
22605           "ca"
22606       ],
22607       [
22608           "Czech",
22609           "čeština",
22610           "cs"
22611       ],
22612       [
22613           "German",
22614           "Deutsch",
22615           "de"
22616       ],
22617       [
22618           "Greek",
22619           "Ελληνικά",
22620           "el"
22621       ],
22622       [
22623           "English",
22624           "English",
22625           "en"
22626       ],
22627       [
22628           "Esperanto",
22629           "Esperanto",
22630           "eo"
22631       ],
22632       [
22633           "Spanish",
22634           "español",
22635           "es"
22636       ],
22637       [
22638           "Persian",
22639           "فارسی",
22640           "fa"
22641       ],
22642       [
22643           "Finnish",
22644           "suomi",
22645           "fi"
22646       ],
22647       [
22648           "French",
22649           "français",
22650           "fr"
22651       ],
22652       [
22653           "Hebrew",
22654           "עברית",
22655           "he"
22656       ],
22657       [
22658           "Italian",
22659           "italiano",
22660           "it"
22661       ],
22662       [
22663           "Japanese",
22664           "日本語",
22665           "ja"
22666       ],
22667       [
22668           "Korean",
22669           "한국어",
22670           "ko"
22671       ],
22672       [
22673           "Norwegian",
22674           "norsk bokmål",
22675           "no"
22676       ],
22677       [
22678           "Polish",
22679           "polski",
22680           "pl"
22681       ],
22682       [
22683           "Portuguese",
22684           "português",
22685           "pt"
22686       ],
22687       [
22688           "Romanian",
22689           "română",
22690           "ro"
22691       ],
22692       [
22693           "Russian",
22694           "русский",
22695           "ru"
22696       ],
22697       [
22698           "Albanian",
22699           "shqip",
22700           "sq"
22701       ],
22702       [
22703           "Serbian",
22704           "српски / srpski",
22705           "sr"
22706       ],
22707       [
22708           "Swedish",
22709           "svenska",
22710           "sv"
22711       ],
22712       [
22713           "Tamil",
22714           "தமிழ்",
22715           "ta"
22716       ],
22717       [
22718           "Turkish",
22719           "Türkçe",
22720           "tr"
22721       ],
22722       [
22723           "Ukrainian",
22724           "українська",
22725           "uk"
22726       ],
22727       [
22728           "Chinese",
22729           "中文",
22730           "zh"
22731       ]
22732   ];
22733
22734   var wikinews$1 = /*#__PURE__*/Object.freeze({
22735     default: wikinews
22736   });
22737
22738   var wikiquote = [
22739       [
22740           "Afrikaans",
22741           "Afrikaans",
22742           "af"
22743       ],
22744       [
22745           "Arabic",
22746           "العربية",
22747           "ar"
22748       ],
22749       [
22750           "Azerbaijani",
22751           "azərbaycanca",
22752           "az"
22753       ],
22754       [
22755           "Belarusian",
22756           "беларуская",
22757           "be"
22758       ],
22759       [
22760           "Bulgarian",
22761           "български",
22762           "bg"
22763       ],
22764       [
22765           "Breton",
22766           "brezhoneg",
22767           "br"
22768       ],
22769       [
22770           "Bosnian",
22771           "bosanski",
22772           "bs"
22773       ],
22774       [
22775           "Catalan",
22776           "català",
22777           "ca"
22778       ],
22779       [
22780           "Czech",
22781           "čeština",
22782           "cs"
22783       ],
22784       [
22785           "Welsh",
22786           "Cymraeg",
22787           "cy"
22788       ],
22789       [
22790           "Danish",
22791           "dansk",
22792           "da"
22793       ],
22794       [
22795           "German",
22796           "Deutsch",
22797           "de"
22798       ],
22799       [
22800           "Greek",
22801           "Ελληνικά",
22802           "el"
22803       ],
22804       [
22805           "English",
22806           "English",
22807           "en"
22808       ],
22809       [
22810           "Esperanto",
22811           "Esperanto",
22812           "eo"
22813       ],
22814       [
22815           "Spanish",
22816           "español",
22817           "es"
22818       ],
22819       [
22820           "Estonian",
22821           "eesti",
22822           "et"
22823       ],
22824       [
22825           "Basque",
22826           "euskara",
22827           "eu"
22828       ],
22829       [
22830           "Persian",
22831           "فارسی",
22832           "fa"
22833       ],
22834       [
22835           "Finnish",
22836           "suomi",
22837           "fi"
22838       ],
22839       [
22840           "French",
22841           "français",
22842           "fr"
22843       ],
22844       [
22845           "Galician",
22846           "galego",
22847           "gl"
22848       ],
22849       [
22850           "Gujarati",
22851           "ગુજરાતી",
22852           "gu"
22853       ],
22854       [
22855           "Hebrew",
22856           "עברית",
22857           "he"
22858       ],
22859       [
22860           "Hindi",
22861           "हिन्दी",
22862           "hi"
22863       ],
22864       [
22865           "Croatian",
22866           "hrvatski",
22867           "hr"
22868       ],
22869       [
22870           "Hungarian",
22871           "magyar",
22872           "hu"
22873       ],
22874       [
22875           "Armenian",
22876           "Հայերեն",
22877           "hy"
22878       ],
22879       [
22880           "Indonesian",
22881           "Bahasa Indonesia",
22882           "id"
22883       ],
22884       [
22885           "Icelandic",
22886           "íslenska",
22887           "is"
22888       ],
22889       [
22890           "Italian",
22891           "italiano",
22892           "it"
22893       ],
22894       [
22895           "Japanese",
22896           "日本語",
22897           "ja"
22898       ],
22899       [
22900           "Georgian",
22901           "ქართული",
22902           "ka"
22903       ],
22904       [
22905           "Kannada",
22906           "ಕನ್ನಡ",
22907           "kn"
22908       ],
22909       [
22910           "Korean",
22911           "한국어",
22912           "ko"
22913       ],
22914       [
22915           "Kurdish",
22916           "Kurdî",
22917           "ku"
22918       ],
22919       [
22920           "Kyrgyz",
22921           "Кыргызча",
22922           "ky"
22923       ],
22924       [
22925           "Latin",
22926           "Latina",
22927           "la"
22928       ],
22929       [
22930           "Limburgish",
22931           "Limburgs",
22932           "li"
22933       ],
22934       [
22935           "Lithuanian",
22936           "lietuvių",
22937           "lt"
22938       ],
22939       [
22940           "Malayalam",
22941           "മലയാളം",
22942           "ml"
22943       ],
22944       [
22945           "Marathi",
22946           "मराठी",
22947           "mr"
22948       ],
22949       [
22950           "Dutch",
22951           "Nederlands",
22952           "nl"
22953       ],
22954       [
22955           "Norwegian Nynorsk",
22956           "norsk nynorsk",
22957           "nn"
22958       ],
22959       [
22960           "Norwegian",
22961           "norsk bokmål",
22962           "no"
22963       ],
22964       [
22965           "Polish",
22966           "polski",
22967           "pl"
22968       ],
22969       [
22970           "Portuguese",
22971           "português",
22972           "pt"
22973       ],
22974       [
22975           "Romanian",
22976           "română",
22977           "ro"
22978       ],
22979       [
22980           "Russian",
22981           "русский",
22982           "ru"
22983       ],
22984       [
22985           "Sanskrit",
22986           "संस्कृतम्",
22987           "sa"
22988       ],
22989       [
22990           "Slovak",
22991           "slovenčina",
22992           "sk"
22993       ],
22994       [
22995           "Slovenian",
22996           "slovenščina",
22997           "sl"
22998       ],
22999       [
23000           "Albanian",
23001           "shqip",
23002           "sq"
23003       ],
23004       [
23005           "Serbian",
23006           "српски / srpski",
23007           "sr"
23008       ],
23009       [
23010           "Sundanese",
23011           "Basa Sunda",
23012           "su"
23013       ],
23014       [
23015           "Swedish",
23016           "svenska",
23017           "sv"
23018       ],
23019       [
23020           "Tamil",
23021           "தமிழ்",
23022           "ta"
23023       ],
23024       [
23025           "Telugu",
23026           "తెలుగు",
23027           "te"
23028       ],
23029       [
23030           "Thai",
23031           "ไทย",
23032           "th"
23033       ],
23034       [
23035           "Turkish",
23036           "Türkçe",
23037           "tr"
23038       ],
23039       [
23040           "Ukrainian",
23041           "українська",
23042           "uk"
23043       ],
23044       [
23045           "Urdu",
23046           "اردو",
23047           "ur"
23048       ],
23049       [
23050           "Uzbek",
23051           "oʻzbekcha/ўзбекча",
23052           "uz"
23053       ],
23054       [
23055           "Vietnamese",
23056           "Tiếng Việt",
23057           "vi"
23058       ],
23059       [
23060           "Wolof",
23061           "Wolof",
23062           "wo"
23063       ],
23064       [
23065           "Chinese",
23066           "中文",
23067           "zh"
23068       ]
23069   ];
23070
23071   var wikiquote$1 = /*#__PURE__*/Object.freeze({
23072     default: wikiquote
23073   });
23074
23075   var wikiversity = [
23076       [
23077           "Arabic",
23078           "العربية",
23079           "ar"
23080       ],
23081       [
23082           "Czech",
23083           "čeština",
23084           "cs"
23085       ],
23086       [
23087           "German",
23088           "Deutsch",
23089           "de"
23090       ],
23091       [
23092           "Greek",
23093           "Ελληνικά",
23094           "el"
23095       ],
23096       [
23097           "English",
23098           "English",
23099           "en"
23100       ],
23101       [
23102           "Spanish",
23103           "español",
23104           "es"
23105       ],
23106       [
23107           "Finnish",
23108           "suomi",
23109           "fi"
23110       ],
23111       [
23112           "French",
23113           "français",
23114           "fr"
23115       ],
23116       [
23117           "Italian",
23118           "italiano",
23119           "it"
23120       ],
23121       [
23122           "Japanese",
23123           "日本語",
23124           "ja"
23125       ],
23126       [
23127           "Korean",
23128           "한국어",
23129           "ko"
23130       ],
23131       [
23132           "Portuguese",
23133           "português",
23134           "pt"
23135       ],
23136       [
23137           "Russian",
23138           "русский",
23139           "ru"
23140       ],
23141       [
23142           "Slovenian",
23143           "slovenščina",
23144           "sl"
23145       ],
23146       [
23147           "Swedish",
23148           "svenska",
23149           "sv"
23150       ]
23151   ];
23152
23153   var wikiversity$1 = /*#__PURE__*/Object.freeze({
23154     default: wikiversity
23155   });
23156
23157   var wikivoyage = [
23158       [
23159           "German",
23160           "Deutsch",
23161           "de"
23162       ],
23163       [
23164           "Greek",
23165           "Ελληνικά",
23166           "el"
23167       ],
23168       [
23169           "English",
23170           "English",
23171           "en"
23172       ],
23173       [
23174           "Spanish",
23175           "español",
23176           "es"
23177       ],
23178       [
23179           "Persian",
23180           "فارسی",
23181           "fa"
23182       ],
23183       [
23184           "Finnish",
23185           "suomi",
23186           "fi"
23187       ],
23188       [
23189           "French",
23190           "français",
23191           "fr"
23192       ],
23193       [
23194           "Hebrew",
23195           "עברית",
23196           "he"
23197       ],
23198       [
23199           "Italian",
23200           "italiano",
23201           "it"
23202       ],
23203       [
23204           "Dutch",
23205           "Nederlands",
23206           "nl"
23207       ],
23208       [
23209           "Polish",
23210           "polski",
23211           "pl"
23212       ],
23213       [
23214           "Portuguese",
23215           "português",
23216           "pt"
23217       ],
23218       [
23219           "Romanian",
23220           "română",
23221           "ro"
23222       ],
23223       [
23224           "Russian",
23225           "русский",
23226           "ru"
23227       ],
23228       [
23229           "Swedish",
23230           "svenska",
23231           "sv"
23232       ],
23233       [
23234           "Ukrainian",
23235           "українська",
23236           "uk"
23237       ],
23238       [
23239           "Vietnamese",
23240           "Tiếng Việt",
23241           "vi"
23242       ],
23243       [
23244           "Chinese",
23245           "中文",
23246           "zh"
23247       ]
23248   ];
23249
23250   var wikivoyage$1 = /*#__PURE__*/Object.freeze({
23251     default: wikivoyage
23252   });
23253
23254   var wiktionary = [
23255       [
23256           "Afrikaans",
23257           "Afrikaans",
23258           "af"
23259       ],
23260       [
23261           "Amharic",
23262           "አማርኛ",
23263           "am"
23264       ],
23265       [
23266           "Aragonese",
23267           "aragonés",
23268           "an"
23269       ],
23270       [
23271           "Old English",
23272           "Ænglisc",
23273           "ang"
23274       ],
23275       [
23276           "Arabic",
23277           "العربية",
23278           "ar"
23279       ],
23280       [
23281           "Asturian",
23282           "asturianu",
23283           "ast"
23284       ],
23285       [
23286           "Aymara",
23287           "Aymar aru",
23288           "ay"
23289       ],
23290       [
23291           "Azerbaijani",
23292           "azərbaycanca",
23293           "az"
23294       ],
23295       [
23296           "Belarusian",
23297           "беларуская",
23298           "be"
23299       ],
23300       [
23301           "Bulgarian",
23302           "български",
23303           "bg"
23304       ],
23305       [
23306           "Bangla",
23307           "বাংলা",
23308           "bn"
23309       ],
23310       [
23311           "Breton",
23312           "brezhoneg",
23313           "br"
23314       ],
23315       [
23316           "Bosnian",
23317           "bosanski",
23318           "bs"
23319       ],
23320       [
23321           "Catalan",
23322           "català",
23323           "ca"
23324       ],
23325       [
23326           "Cherokee",
23327           "ᏣᎳᎩ",
23328           "chr"
23329       ],
23330       [
23331           "Corsican",
23332           "corsu",
23333           "co"
23334       ],
23335       [
23336           "Czech",
23337           "čeština",
23338           "cs"
23339       ],
23340       [
23341           "Kashubian",
23342           "kaszëbsczi",
23343           "csb"
23344       ],
23345       [
23346           "Welsh",
23347           "Cymraeg",
23348           "cy"
23349       ],
23350       [
23351           "Danish",
23352           "dansk",
23353           "da"
23354       ],
23355       [
23356           "German",
23357           "Deutsch",
23358           "de"
23359       ],
23360       [
23361           "Divehi",
23362           "ދިވެހިބަސް",
23363           "dv"
23364       ],
23365       [
23366           "Greek",
23367           "Ελληνικά",
23368           "el"
23369       ],
23370       [
23371           "English",
23372           "English",
23373           "en"
23374       ],
23375       [
23376           "Esperanto",
23377           "Esperanto",
23378           "eo"
23379       ],
23380       [
23381           "Spanish",
23382           "español",
23383           "es"
23384       ],
23385       [
23386           "Estonian",
23387           "eesti",
23388           "et"
23389       ],
23390       [
23391           "Basque",
23392           "euskara",
23393           "eu"
23394       ],
23395       [
23396           "Persian",
23397           "فارسی",
23398           "fa"
23399       ],
23400       [
23401           "Finnish",
23402           "suomi",
23403           "fi"
23404       ],
23405       [
23406           "Fijian",
23407           "Na Vosa Vakaviti",
23408           "fj"
23409       ],
23410       [
23411           "Faroese",
23412           "føroyskt",
23413           "fo"
23414       ],
23415       [
23416           "French",
23417           "français",
23418           "fr"
23419       ],
23420       [
23421           "Western Frisian",
23422           "Frysk",
23423           "fy"
23424       ],
23425       [
23426           "Irish",
23427           "Gaeilge",
23428           "ga"
23429       ],
23430       [
23431           "Scottish Gaelic",
23432           "Gàidhlig",
23433           "gd"
23434       ],
23435       [
23436           "Galician",
23437           "galego",
23438           "gl"
23439       ],
23440       [
23441           "Guarani",
23442           "Avañe'ẽ",
23443           "gn"
23444       ],
23445       [
23446           "Gujarati",
23447           "ગુજરાતી",
23448           "gu"
23449       ],
23450       [
23451           "Manx",
23452           "Gaelg",
23453           "gv"
23454       ],
23455       [
23456           "Hausa",
23457           "Hausa",
23458           "ha"
23459       ],
23460       [
23461           "Hebrew",
23462           "עברית",
23463           "he"
23464       ],
23465       [
23466           "Hindi",
23467           "हिन्दी",
23468           "hi"
23469       ],
23470       [
23471           "Croatian",
23472           "hrvatski",
23473           "hr"
23474       ],
23475       [
23476           "Upper Sorbian",
23477           "hornjoserbsce",
23478           "hsb"
23479       ],
23480       [
23481           "Hungarian",
23482           "magyar",
23483           "hu"
23484       ],
23485       [
23486           "Armenian",
23487           "Հայերեն",
23488           "hy"
23489       ],
23490       [
23491           "Interlingua",
23492           "interlingua",
23493           "ia"
23494       ],
23495       [
23496           "Indonesian",
23497           "Bahasa Indonesia",
23498           "id"
23499       ],
23500       [
23501           "Interlingue",
23502           "Interlingue",
23503           "ie"
23504       ],
23505       [
23506           "Ido",
23507           "Ido",
23508           "io"
23509       ],
23510       [
23511           "Icelandic",
23512           "íslenska",
23513           "is"
23514       ],
23515       [
23516           "Italian",
23517           "italiano",
23518           "it"
23519       ],
23520       [
23521           "Inuktitut",
23522           "ᐃᓄᒃᑎᑐᑦ/inuktitut",
23523           "iu"
23524       ],
23525       [
23526           "Japanese",
23527           "日本語",
23528           "ja"
23529       ],
23530       [
23531           "Lojban",
23532           "la .lojban.",
23533           "jbo"
23534       ],
23535       [
23536           "Javanese",
23537           "Basa Jawa",
23538           "jv"
23539       ],
23540       [
23541           "Georgian",
23542           "ქართული",
23543           "ka"
23544       ],
23545       [
23546           "Kazakh",
23547           "қазақша",
23548           "kk"
23549       ],
23550       [
23551           "Kalaallisut",
23552           "kalaallisut",
23553           "kl"
23554       ],
23555       [
23556           "Khmer",
23557           "ភាសាខ្មែរ",
23558           "km"
23559       ],
23560       [
23561           "Kannada",
23562           "ಕನ್ನಡ",
23563           "kn"
23564       ],
23565       [
23566           "Korean",
23567           "한국어",
23568           "ko"
23569       ],
23570       [
23571           "Kashmiri",
23572           "कॉशुर / کٲشُر",
23573           "ks"
23574       ],
23575       [
23576           "Kurdish",
23577           "Kurdî",
23578           "ku"
23579       ],
23580       [
23581           "Cornish",
23582           "kernowek",
23583           "kw"
23584       ],
23585       [
23586           "Kyrgyz",
23587           "Кыргызча",
23588           "ky"
23589       ],
23590       [
23591           "Latin",
23592           "Latina",
23593           "la"
23594       ],
23595       [
23596           "Luxembourgish",
23597           "Lëtzebuergesch",
23598           "lb"
23599       ],
23600       [
23601           "Limburgish",
23602           "Limburgs",
23603           "li"
23604       ],
23605       [
23606           "Lingala",
23607           "lingála",
23608           "ln"
23609       ],
23610       [
23611           "Lao",
23612           "ລາວ",
23613           "lo"
23614       ],
23615       [
23616           "Lithuanian",
23617           "lietuvių",
23618           "lt"
23619       ],
23620       [
23621           "Latvian",
23622           "latviešu",
23623           "lv"
23624       ],
23625       [
23626           "Malagasy",
23627           "Malagasy",
23628           "mg"
23629       ],
23630       [
23631           "Maori",
23632           "Māori",
23633           "mi"
23634       ],
23635       [
23636           "Macedonian",
23637           "македонски",
23638           "mk"
23639       ],
23640       [
23641           "Malayalam",
23642           "മലയാളം",
23643           "ml"
23644       ],
23645       [
23646           "Mongolian",
23647           "монгол",
23648           "mn"
23649       ],
23650       [
23651           "Marathi",
23652           "मराठी",
23653           "mr"
23654       ],
23655       [
23656           "Malay",
23657           "Bahasa Melayu",
23658           "ms"
23659       ],
23660       [
23661           "Maltese",
23662           "Malti",
23663           "mt"
23664       ],
23665       [
23666           "Burmese",
23667           "မြန်မာဘာသာ",
23668           "my"
23669       ],
23670       [
23671           "Nauru",
23672           "Dorerin Naoero",
23673           "na"
23674       ],
23675       [
23676           "Nāhuatl",
23677           "Nāhuatl",
23678           "nah"
23679       ],
23680       [
23681           "Low German",
23682           "Plattdüütsch",
23683           "nds"
23684       ],
23685       [
23686           "Nepali",
23687           "नेपाली",
23688           "ne"
23689       ],
23690       [
23691           "Dutch",
23692           "Nederlands",
23693           "nl"
23694       ],
23695       [
23696           "Norwegian Nynorsk",
23697           "norsk nynorsk",
23698           "nn"
23699       ],
23700       [
23701           "Norwegian",
23702           "norsk bokmål",
23703           "no"
23704       ],
23705       [
23706           "Occitan",
23707           "occitan",
23708           "oc"
23709       ],
23710       [
23711           "Oromo",
23712           "Oromoo",
23713           "om"
23714       ],
23715       [
23716           "Odia",
23717           "ଓଡ଼ିଆ",
23718           "or"
23719       ],
23720       [
23721           "Punjabi",
23722           "ਪੰਜਾਬੀ",
23723           "pa"
23724       ],
23725       [
23726           "Polish",
23727           "polski",
23728           "pl"
23729       ],
23730       [
23731           "Western Punjabi",
23732           "پنجابی",
23733           "pnb"
23734       ],
23735       [
23736           "Pashto",
23737           "پښتو",
23738           "ps"
23739       ],
23740       [
23741           "Portuguese",
23742           "português",
23743           "pt"
23744       ],
23745       [
23746           "Quechua",
23747           "Runa Simi",
23748           "qu"
23749       ],
23750       [
23751           "Romanian",
23752           "română",
23753           "ro"
23754       ],
23755       [
23756           "Aromanian",
23757           "armãneashti",
23758           "roa-rup"
23759       ],
23760       [
23761           "Russian",
23762           "русский",
23763           "ru"
23764       ],
23765       [
23766           "Kinyarwanda",
23767           "Kinyarwanda",
23768           "rw"
23769       ],
23770       [
23771           "Sanskrit",
23772           "संस्कृतम्",
23773           "sa"
23774       ],
23775       [
23776           "Sicilian",
23777           "sicilianu",
23778           "scn"
23779       ],
23780       [
23781           "Sindhi",
23782           "سنڌي",
23783           "sd"
23784       ],
23785       [
23786           "Sango",
23787           "Sängö",
23788           "sg"
23789       ],
23790       [
23791           "Serbo-Croatian",
23792           "srpskohrvatski / српскохрватски",
23793           "sh"
23794       ],
23795       [
23796           "Sinhala",
23797           "සිංහල",
23798           "si"
23799       ],
23800       [
23801           "Simple English",
23802           "Simple English",
23803           "simple"
23804       ],
23805       [
23806           "Slovak",
23807           "slovenčina",
23808           "sk"
23809       ],
23810       [
23811           "Slovenian",
23812           "slovenščina",
23813           "sl"
23814       ],
23815       [
23816           "Samoan",
23817           "Gagana Samoa",
23818           "sm"
23819       ],
23820       [
23821           "Somali",
23822           "Soomaaliga",
23823           "so"
23824       ],
23825       [
23826           "Albanian",
23827           "shqip",
23828           "sq"
23829       ],
23830       [
23831           "Serbian",
23832           "српски / srpski",
23833           "sr"
23834       ],
23835       [
23836           "Swati",
23837           "SiSwati",
23838           "ss"
23839       ],
23840       [
23841           "Southern Sotho",
23842           "Sesotho",
23843           "st"
23844       ],
23845       [
23846           "Sundanese",
23847           "Basa Sunda",
23848           "su"
23849       ],
23850       [
23851           "Swedish",
23852           "svenska",
23853           "sv"
23854       ],
23855       [
23856           "Swahili",
23857           "Kiswahili",
23858           "sw"
23859       ],
23860       [
23861           "Tamil",
23862           "தமிழ்",
23863           "ta"
23864       ],
23865       [
23866           "Telugu",
23867           "తెలుగు",
23868           "te"
23869       ],
23870       [
23871           "Tajik",
23872           "тоҷикӣ",
23873           "tg"
23874       ],
23875       [
23876           "Thai",
23877           "ไทย",
23878           "th"
23879       ],
23880       [
23881           "Tigrinya",
23882           "ትግርኛ",
23883           "ti"
23884       ],
23885       [
23886           "Turkmen",
23887           "Türkmençe",
23888           "tk"
23889       ],
23890       [
23891           "Tagalog",
23892           "Tagalog",
23893           "tl"
23894       ],
23895       [
23896           "Tswana",
23897           "Setswana",
23898           "tn"
23899       ],
23900       [
23901           "Tok Pisin",
23902           "Tok Pisin",
23903           "tpi"
23904       ],
23905       [
23906           "Turkish",
23907           "Türkçe",
23908           "tr"
23909       ],
23910       [
23911           "Tsonga",
23912           "Xitsonga",
23913           "ts"
23914       ],
23915       [
23916           "Tatar",
23917           "татарча/tatarça",
23918           "tt"
23919       ],
23920       [
23921           "Uyghur",
23922           "ئۇيغۇرچە / Uyghurche",
23923           "ug"
23924       ],
23925       [
23926           "Ukrainian",
23927           "українська",
23928           "uk"
23929       ],
23930       [
23931           "Urdu",
23932           "اردو",
23933           "ur"
23934       ],
23935       [
23936           "Uzbek",
23937           "oʻzbekcha/ўзбекча",
23938           "uz"
23939       ],
23940       [
23941           "Venetian",
23942           "vèneto",
23943           "vec"
23944       ],
23945       [
23946           "Vietnamese",
23947           "Tiếng Việt",
23948           "vi"
23949       ],
23950       [
23951           "Volapük",
23952           "Volapük",
23953           "vo"
23954       ],
23955       [
23956           "Walloon",
23957           "walon",
23958           "wa"
23959       ],
23960       [
23961           "Wolof",
23962           "Wolof",
23963           "wo"
23964       ],
23965       [
23966           "Yiddish",
23967           "ייִדיש",
23968           "yi"
23969       ],
23970       [
23971           "Chinese",
23972           "中文",
23973           "zh"
23974       ],
23975       [
23976           "Chinese (Min Nan)",
23977           "Bân-lâm-gú",
23978           "zh-min-nan"
23979       ],
23980       [
23981           "Zulu",
23982           "isiZulu",
23983           "zu"
23984       ]
23985   ];
23986
23987   var wiktionary$1 = /*#__PURE__*/Object.freeze({
23988     default: wiktionary
23989   });
23990
23991   var wikipedia = [
23992       [
23993           "Abkhazian",
23994           "Аҧсшәа",
23995           "ab"
23996       ],
23997       [
23998           "Achinese",
23999           "Acèh",
24000           "ace"
24001       ],
24002       [
24003           "Adyghe",
24004           "адыгабзэ",
24005           "ady"
24006       ],
24007       [
24008           "Afrikaans",
24009           "Afrikaans",
24010           "af"
24011       ],
24012       [
24013           "Akan",
24014           "Akan",
24015           "ak"
24016       ],
24017       [
24018           "Alemannisch",
24019           "Alemannisch",
24020           "als"
24021       ],
24022       [
24023           "Amharic",
24024           "አማርኛ",
24025           "am"
24026       ],
24027       [
24028           "Aragonese",
24029           "aragonés",
24030           "an"
24031       ],
24032       [
24033           "Old English",
24034           "Ænglisc",
24035           "ang"
24036       ],
24037       [
24038           "Arabic",
24039           "العربية",
24040           "ar"
24041       ],
24042       [
24043           "Aramaic",
24044           "ܐܪܡܝܐ",
24045           "arc"
24046       ],
24047       [
24048           "Egyptian Arabic",
24049           "مصرى",
24050           "arz"
24051       ],
24052       [
24053           "Assamese",
24054           "অসমীয়া",
24055           "as"
24056       ],
24057       [
24058           "Asturian",
24059           "asturianu",
24060           "ast"
24061       ],
24062       [
24063           "Avaric",
24064           "авар",
24065           "av"
24066       ],
24067       [
24068           "Aymara",
24069           "Aymar aru",
24070           "ay"
24071       ],
24072       [
24073           "Azerbaijani",
24074           "azərbaycanca",
24075           "az"
24076       ],
24077       [
24078           "تۆرکجه",
24079           "تۆرکجه",
24080           "azb"
24081       ],
24082       [
24083           "Bashkir",
24084           "башҡортса",
24085           "ba"
24086       ],
24087       [
24088           "Bavarian",
24089           "Boarisch",
24090           "bar"
24091       ],
24092       [
24093           "Samogitian",
24094           "žemaitėška",
24095           "bat-smg"
24096       ],
24097       [
24098           "Bikol Central",
24099           "Bikol Central",
24100           "bcl"
24101       ],
24102       [
24103           "Belarusian",
24104           "беларуская",
24105           "be"
24106       ],
24107       [
24108           "беларуская (тарашкевіца)‎",
24109           "беларуская (тарашкевіца)‎",
24110           "be-x-old"
24111       ],
24112       [
24113           "Bulgarian",
24114           "български",
24115           "bg"
24116       ],
24117       [
24118           "भोजपुरी",
24119           "भोजपुरी",
24120           "bh"
24121       ],
24122       [
24123           "Bislama",
24124           "Bislama",
24125           "bi"
24126       ],
24127       [
24128           "Banjar",
24129           "Bahasa Banjar",
24130           "bjn"
24131       ],
24132       [
24133           "Bambara",
24134           "bamanankan",
24135           "bm"
24136       ],
24137       [
24138           "Bangla",
24139           "বাংলা",
24140           "bn"
24141       ],
24142       [
24143           "Tibetan",
24144           "བོད་ཡིག",
24145           "bo"
24146       ],
24147       [
24148           "Bishnupriya",
24149           "বিষ্ণুপ্রিয়া মণিপুরী",
24150           "bpy"
24151       ],
24152       [
24153           "Breton",
24154           "brezhoneg",
24155           "br"
24156       ],
24157       [
24158           "Bosnian",
24159           "bosanski",
24160           "bs"
24161       ],
24162       [
24163           "Buginese",
24164           "ᨅᨔ ᨕᨘᨁᨗ",
24165           "bug"
24166       ],
24167       [
24168           "буряад",
24169           "буряад",
24170           "bxr"
24171       ],
24172       [
24173           "Catalan",
24174           "català",
24175           "ca"
24176       ],
24177       [
24178           "Chavacano de Zamboanga",
24179           "Chavacano de Zamboanga",
24180           "cbk-zam"
24181       ],
24182       [
24183           "Min Dong Chinese",
24184           "Mìng-dĕ̤ng-ngṳ̄",
24185           "cdo"
24186       ],
24187       [
24188           "Chechen",
24189           "нохчийн",
24190           "ce"
24191       ],
24192       [
24193           "Cebuano",
24194           "Cebuano",
24195           "ceb"
24196       ],
24197       [
24198           "Chamorro",
24199           "Chamoru",
24200           "ch"
24201       ],
24202       [
24203           "Cherokee",
24204           "ᏣᎳᎩ",
24205           "chr"
24206       ],
24207       [
24208           "Cheyenne",
24209           "Tsetsêhestâhese",
24210           "chy"
24211       ],
24212       [
24213           "Central Kurdish",
24214           "کوردیی ناوەندی",
24215           "ckb"
24216       ],
24217       [
24218           "Corsican",
24219           "corsu",
24220           "co"
24221       ],
24222       [
24223           "Cree",
24224           "Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ",
24225           "cr"
24226       ],
24227       [
24228           "Crimean Turkish",
24229           "qırımtatarca",
24230           "crh"
24231       ],
24232       [
24233           "Czech",
24234           "čeština",
24235           "cs"
24236       ],
24237       [
24238           "Kashubian",
24239           "kaszëbsczi",
24240           "csb"
24241       ],
24242       [
24243           "Church Slavic",
24244           "словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ",
24245           "cu"
24246       ],
24247       [
24248           "Chuvash",
24249           "Чӑвашла",
24250           "cv"
24251       ],
24252       [
24253           "Welsh",
24254           "Cymraeg",
24255           "cy"
24256       ],
24257       [
24258           "Danish",
24259           "dansk",
24260           "da"
24261       ],
24262       [
24263           "German",
24264           "Deutsch",
24265           "de"
24266       ],
24267       [
24268           "Zazaki",
24269           "Zazaki",
24270           "diq"
24271       ],
24272       [
24273           "Lower Sorbian",
24274           "dolnoserbski",
24275           "dsb"
24276       ],
24277       [
24278           "Divehi",
24279           "ދިވެހިބަސް",
24280           "dv"
24281       ],
24282       [
24283           "Dzongkha",
24284           "ཇོང་ཁ",
24285           "dz"
24286       ],
24287       [
24288           "Ewe",
24289           "eʋegbe",
24290           "ee"
24291       ],
24292       [
24293           "Greek",
24294           "Ελληνικά",
24295           "el"
24296       ],
24297       [
24298           "Emiliano-Romagnolo",
24299           "emiliàn e rumagnòl",
24300           "eml"
24301       ],
24302       [
24303           "English",
24304           "English",
24305           "en"
24306       ],
24307       [
24308           "Esperanto",
24309           "Esperanto",
24310           "eo"
24311       ],
24312       [
24313           "Spanish",
24314           "español",
24315           "es"
24316       ],
24317       [
24318           "Estonian",
24319           "eesti",
24320           "et"
24321       ],
24322       [
24323           "Basque",
24324           "euskara",
24325           "eu"
24326       ],
24327       [
24328           "Extremaduran",
24329           "estremeñu",
24330           "ext"
24331       ],
24332       [
24333           "Persian",
24334           "فارسی",
24335           "fa"
24336       ],
24337       [
24338           "Fulah",
24339           "Fulfulde",
24340           "ff"
24341       ],
24342       [
24343           "Finnish",
24344           "suomi",
24345           "fi"
24346       ],
24347       [
24348           "Võro",
24349           "Võro",
24350           "fiu-vro"
24351       ],
24352       [
24353           "Fijian",
24354           "Na Vosa Vakaviti",
24355           "fj"
24356       ],
24357       [
24358           "Faroese",
24359           "føroyskt",
24360           "fo"
24361       ],
24362       [
24363           "French",
24364           "français",
24365           "fr"
24366       ],
24367       [
24368           "Arpitan",
24369           "arpetan",
24370           "frp"
24371       ],
24372       [
24373           "Northern Frisian",
24374           "Nordfriisk",
24375           "frr"
24376       ],
24377       [
24378           "Friulian",
24379           "furlan",
24380           "fur"
24381       ],
24382       [
24383           "Western Frisian",
24384           "Frysk",
24385           "fy"
24386       ],
24387       [
24388           "Irish",
24389           "Gaeilge",
24390           "ga"
24391       ],
24392       [
24393           "Gagauz",
24394           "Gagauz",
24395           "gag"
24396       ],
24397       [
24398           "Gan Chinese",
24399           "贛語",
24400           "gan"
24401       ],
24402       [
24403           "Scottish Gaelic",
24404           "Gàidhlig",
24405           "gd"
24406       ],
24407       [
24408           "Galician",
24409           "galego",
24410           "gl"
24411       ],
24412       [
24413           "Gilaki",
24414           "گیلکی",
24415           "glk"
24416       ],
24417       [
24418           "Guarani",
24419           "Avañe'ẽ",
24420           "gn"
24421       ],
24422       [
24423           "Goan Konkani",
24424           "गोंयची कोंकणी / Gõychi Konknni",
24425           "gom"
24426       ],
24427       [
24428           "Gothic",
24429           "𐌲𐌿𐍄𐌹𐍃𐌺",
24430           "got"
24431       ],
24432       [
24433           "Gujarati",
24434           "ગુજરાતી",
24435           "gu"
24436       ],
24437       [
24438           "Manx",
24439           "Gaelg",
24440           "gv"
24441       ],
24442       [
24443           "Hausa",
24444           "Hausa",
24445           "ha"
24446       ],
24447       [
24448           "Hakka Chinese",
24449           "客家語/Hak-kâ-ngî",
24450           "hak"
24451       ],
24452       [
24453           "Hawaiian",
24454           "Hawaiʻi",
24455           "haw"
24456       ],
24457       [
24458           "Hebrew",
24459           "עברית",
24460           "he"
24461       ],
24462       [
24463           "Hindi",
24464           "हिन्दी",
24465           "hi"
24466       ],
24467       [
24468           "Fiji Hindi",
24469           "Fiji Hindi",
24470           "hif"
24471       ],
24472       [
24473           "Croatian",
24474           "hrvatski",
24475           "hr"
24476       ],
24477       [
24478           "Upper Sorbian",
24479           "hornjoserbsce",
24480           "hsb"
24481       ],
24482       [
24483           "Haitian Creole",
24484           "Kreyòl ayisyen",
24485           "ht"
24486       ],
24487       [
24488           "Hungarian",
24489           "magyar",
24490           "hu"
24491       ],
24492       [
24493           "Armenian",
24494           "Հայերեն",
24495           "hy"
24496       ],
24497       [
24498           "Interlingua",
24499           "interlingua",
24500           "ia"
24501       ],
24502       [
24503           "Indonesian",
24504           "Bahasa Indonesia",
24505           "id"
24506       ],
24507       [
24508           "Interlingue",
24509           "Interlingue",
24510           "ie"
24511       ],
24512       [
24513           "Igbo",
24514           "Igbo",
24515           "ig"
24516       ],
24517       [
24518           "Inupiaq",
24519           "Iñupiak",
24520           "ik"
24521       ],
24522       [
24523           "Iloko",
24524           "Ilokano",
24525           "ilo"
24526       ],
24527       [
24528           "Ido",
24529           "Ido",
24530           "io"
24531       ],
24532       [
24533           "Icelandic",
24534           "íslenska",
24535           "is"
24536       ],
24537       [
24538           "Italian",
24539           "italiano",
24540           "it"
24541       ],
24542       [
24543           "Inuktitut",
24544           "ᐃᓄᒃᑎᑐᑦ/inuktitut",
24545           "iu"
24546       ],
24547       [
24548           "Japanese",
24549           "日本語",
24550           "ja"
24551       ],
24552       [
24553           "Jamaican Creole English",
24554           "Patois",
24555           "jam"
24556       ],
24557       [
24558           "Lojban",
24559           "la .lojban.",
24560           "jbo"
24561       ],
24562       [
24563           "Javanese",
24564           "Basa Jawa",
24565           "jv"
24566       ],
24567       [
24568           "Georgian",
24569           "ქართული",
24570           "ka"
24571       ],
24572       [
24573           "Kara-Kalpak",
24574           "Qaraqalpaqsha",
24575           "kaa"
24576       ],
24577       [
24578           "Kabyle",
24579           "Taqbaylit",
24580           "kab"
24581       ],
24582       [
24583           "Kabardian",
24584           "Адыгэбзэ",
24585           "kbd"
24586       ],
24587       [
24588           "Kongo",
24589           "Kongo",
24590           "kg"
24591       ],
24592       [
24593           "Kikuyu",
24594           "Gĩkũyũ",
24595           "ki"
24596       ],
24597       [
24598           "Kazakh",
24599           "қазақша",
24600           "kk"
24601       ],
24602       [
24603           "Kalaallisut",
24604           "kalaallisut",
24605           "kl"
24606       ],
24607       [
24608           "Khmer",
24609           "ភាសាខ្មែរ",
24610           "km"
24611       ],
24612       [
24613           "Kannada",
24614           "ಕನ್ನಡ",
24615           "kn"
24616       ],
24617       [
24618           "Korean",
24619           "한국어",
24620           "ko"
24621       ],
24622       [
24623           "Komi-Permyak",
24624           "Перем Коми",
24625           "koi"
24626       ],
24627       [
24628           "Karachay-Balkar",
24629           "къарачай-малкъар",
24630           "krc"
24631       ],
24632       [
24633           "Kashmiri",
24634           "कॉशुर / کٲشُر",
24635           "ks"
24636       ],
24637       [
24638           "Colognian",
24639           "Ripoarisch",
24640           "ksh"
24641       ],
24642       [
24643           "Kurdish",
24644           "Kurdî",
24645           "ku"
24646       ],
24647       [
24648           "Komi",
24649           "коми",
24650           "kv"
24651       ],
24652       [
24653           "Cornish",
24654           "kernowek",
24655           "kw"
24656       ],
24657       [
24658           "Kyrgyz",
24659           "Кыргызча",
24660           "ky"
24661       ],
24662       [
24663           "Latin",
24664           "Latina",
24665           "la"
24666       ],
24667       [
24668           "Ladino",
24669           "Ladino",
24670           "lad"
24671       ],
24672       [
24673           "Luxembourgish",
24674           "Lëtzebuergesch",
24675           "lb"
24676       ],
24677       [
24678           "лакку",
24679           "лакку",
24680           "lbe"
24681       ],
24682       [
24683           "Lezghian",
24684           "лезги",
24685           "lez"
24686       ],
24687       [
24688           "Ganda",
24689           "Luganda",
24690           "lg"
24691       ],
24692       [
24693           "Limburgish",
24694           "Limburgs",
24695           "li"
24696       ],
24697       [
24698           "Ligurian",
24699           "Ligure",
24700           "lij"
24701       ],
24702       [
24703           "Lombard",
24704           "lumbaart",
24705           "lmo"
24706       ],
24707       [
24708           "Lingala",
24709           "lingála",
24710           "ln"
24711       ],
24712       [
24713           "Lao",
24714           "ລາວ",
24715           "lo"
24716       ],
24717       [
24718           "Northern Luri",
24719           "لۊری شومالی",
24720           "lrc"
24721       ],
24722       [
24723           "Lithuanian",
24724           "lietuvių",
24725           "lt"
24726       ],
24727       [
24728           "Latgalian",
24729           "latgaļu",
24730           "ltg"
24731       ],
24732       [
24733           "Latvian",
24734           "latviešu",
24735           "lv"
24736       ],
24737       [
24738           "Maithili",
24739           "मैथिली",
24740           "mai"
24741       ],
24742       [
24743           "Basa Banyumasan",
24744           "Basa Banyumasan",
24745           "map-bms"
24746       ],
24747       [
24748           "Moksha",
24749           "мокшень",
24750           "mdf"
24751       ],
24752       [
24753           "Malagasy",
24754           "Malagasy",
24755           "mg"
24756       ],
24757       [
24758           "Eastern Mari",
24759           "олык марий",
24760           "mhr"
24761       ],
24762       [
24763           "Maori",
24764           "Māori",
24765           "mi"
24766       ],
24767       [
24768           "Minangkabau",
24769           "Baso Minangkabau",
24770           "min"
24771       ],
24772       [
24773           "Macedonian",
24774           "македонски",
24775           "mk"
24776       ],
24777       [
24778           "Malayalam",
24779           "മലയാളം",
24780           "ml"
24781       ],
24782       [
24783           "Mongolian",
24784           "монгол",
24785           "mn"
24786       ],
24787       [
24788           "Marathi",
24789           "मराठी",
24790           "mr"
24791       ],
24792       [
24793           "Western Mari",
24794           "кырык мары",
24795           "mrj"
24796       ],
24797       [
24798           "Malay",
24799           "Bahasa Melayu",
24800           "ms"
24801       ],
24802       [
24803           "Maltese",
24804           "Malti",
24805           "mt"
24806       ],
24807       [
24808           "Mirandese",
24809           "Mirandés",
24810           "mwl"
24811       ],
24812       [
24813           "Burmese",
24814           "မြန်မာဘာသာ",
24815           "my"
24816       ],
24817       [
24818           "Erzya",
24819           "эрзянь",
24820           "myv"
24821       ],
24822       [
24823           "Mazanderani",
24824           "مازِرونی",
24825           "mzn"
24826       ],
24827       [
24828           "Nauru",
24829           "Dorerin Naoero",
24830           "na"
24831       ],
24832       [
24833           "Nāhuatl",
24834           "Nāhuatl",
24835           "nah"
24836       ],
24837       [
24838           "Neapolitan",
24839           "Napulitano",
24840           "nap"
24841       ],
24842       [
24843           "Low German",
24844           "Plattdüütsch",
24845           "nds"
24846       ],
24847       [
24848           "Low Saxon",
24849           "Nedersaksies",
24850           "nds-nl"
24851       ],
24852       [
24853           "Nepali",
24854           "नेपाली",
24855           "ne"
24856       ],
24857       [
24858           "Newari",
24859           "नेपाल भाषा",
24860           "new"
24861       ],
24862       [
24863           "Dutch",
24864           "Nederlands",
24865           "nl"
24866       ],
24867       [
24868           "Norwegian Nynorsk",
24869           "norsk nynorsk",
24870           "nn"
24871       ],
24872       [
24873           "Norwegian",
24874           "norsk bokmål",
24875           "no"
24876       ],
24877       [
24878           "Novial",
24879           "Novial",
24880           "nov"
24881       ],
24882       [
24883           "Nouormand",
24884           "Nouormand",
24885           "nrm"
24886       ],
24887       [
24888           "Northern Sotho",
24889           "Sesotho sa Leboa",
24890           "nso"
24891       ],
24892       [
24893           "Navajo",
24894           "Diné bizaad",
24895           "nv"
24896       ],
24897       [
24898           "Nyanja",
24899           "Chi-Chewa",
24900           "ny"
24901       ],
24902       [
24903           "Occitan",
24904           "occitan",
24905           "oc"
24906       ],
24907       [
24908           "Livvi-Karelian",
24909           "Livvinkarjala",
24910           "olo"
24911       ],
24912       [
24913           "Oromo",
24914           "Oromoo",
24915           "om"
24916       ],
24917       [
24918           "Odia",
24919           "ଓଡ଼ିଆ",
24920           "or"
24921       ],
24922       [
24923           "Ossetic",
24924           "Ирон",
24925           "os"
24926       ],
24927       [
24928           "Punjabi",
24929           "ਪੰਜਾਬੀ",
24930           "pa"
24931       ],
24932       [
24933           "Pangasinan",
24934           "Pangasinan",
24935           "pag"
24936       ],
24937       [
24938           "Pampanga",
24939           "Kapampangan",
24940           "pam"
24941       ],
24942       [
24943           "Papiamento",
24944           "Papiamentu",
24945           "pap"
24946       ],
24947       [
24948           "Picard",
24949           "Picard",
24950           "pcd"
24951       ],
24952       [
24953           "Pennsylvania German",
24954           "Deitsch",
24955           "pdc"
24956       ],
24957       [
24958           "Palatine German",
24959           "Pälzisch",
24960           "pfl"
24961       ],
24962       [
24963           "Pali",
24964           "पालि",
24965           "pi"
24966       ],
24967       [
24968           "Norfuk / Pitkern",
24969           "Norfuk / Pitkern",
24970           "pih"
24971       ],
24972       [
24973           "Polish",
24974           "polski",
24975           "pl"
24976       ],
24977       [
24978           "Piedmontese",
24979           "Piemontèis",
24980           "pms"
24981       ],
24982       [
24983           "Western Punjabi",
24984           "پنجابی",
24985           "pnb"
24986       ],
24987       [
24988           "Pontic",
24989           "Ποντιακά",
24990           "pnt"
24991       ],
24992       [
24993           "Pashto",
24994           "پښتو",
24995           "ps"
24996       ],
24997       [
24998           "Portuguese",
24999           "português",
25000           "pt"
25001       ],
25002       [
25003           "Quechua",
25004           "Runa Simi",
25005           "qu"
25006       ],
25007       [
25008           "Romansh",
25009           "rumantsch",
25010           "rm"
25011       ],
25012       [
25013           "Romani",
25014           "Romani",
25015           "rmy"
25016       ],
25017       [
25018           "Rundi",
25019           "Kirundi",
25020           "rn"
25021       ],
25022       [
25023           "Romanian",
25024           "română",
25025           "ro"
25026       ],
25027       [
25028           "Aromanian",
25029           "armãneashti",
25030           "roa-rup"
25031       ],
25032       [
25033           "tarandíne",
25034           "tarandíne",
25035           "roa-tara"
25036       ],
25037       [
25038           "Russian",
25039           "русский",
25040           "ru"
25041       ],
25042       [
25043           "Rusyn",
25044           "русиньскый",
25045           "rue"
25046       ],
25047       [
25048           "Kinyarwanda",
25049           "Kinyarwanda",
25050           "rw"
25051       ],
25052       [
25053           "Sanskrit",
25054           "संस्कृतम्",
25055           "sa"
25056       ],
25057       [
25058           "Sakha",
25059           "саха тыла",
25060           "sah"
25061       ],
25062       [
25063           "Sardinian",
25064           "sardu",
25065           "sc"
25066       ],
25067       [
25068           "Sicilian",
25069           "sicilianu",
25070           "scn"
25071       ],
25072       [
25073           "Scots",
25074           "Scots",
25075           "sco"
25076       ],
25077       [
25078           "Sindhi",
25079           "سنڌي",
25080           "sd"
25081       ],
25082       [
25083           "Northern Sami",
25084           "sámegiella",
25085           "se"
25086       ],
25087       [
25088           "Sango",
25089           "Sängö",
25090           "sg"
25091       ],
25092       [
25093           "Serbo-Croatian",
25094           "srpskohrvatski / српскохрватски",
25095           "sh"
25096       ],
25097       [
25098           "Sinhala",
25099           "සිංහල",
25100           "si"
25101       ],
25102       [
25103           "Simple English",
25104           "Simple English",
25105           "simple"
25106       ],
25107       [
25108           "Slovak",
25109           "slovenčina",
25110           "sk"
25111       ],
25112       [
25113           "Slovenian",
25114           "slovenščina",
25115           "sl"
25116       ],
25117       [
25118           "Samoan",
25119           "Gagana Samoa",
25120           "sm"
25121       ],
25122       [
25123           "Shona",
25124           "chiShona",
25125           "sn"
25126       ],
25127       [
25128           "Somali",
25129           "Soomaaliga",
25130           "so"
25131       ],
25132       [
25133           "Albanian",
25134           "shqip",
25135           "sq"
25136       ],
25137       [
25138           "Serbian",
25139           "српски / srpski",
25140           "sr"
25141       ],
25142       [
25143           "Sranan Tongo",
25144           "Sranantongo",
25145           "srn"
25146       ],
25147       [
25148           "Swati",
25149           "SiSwati",
25150           "ss"
25151       ],
25152       [
25153           "Southern Sotho",
25154           "Sesotho",
25155           "st"
25156       ],
25157       [
25158           "Saterland Frisian",
25159           "Seeltersk",
25160           "stq"
25161       ],
25162       [
25163           "Sundanese",
25164           "Basa Sunda",
25165           "su"
25166       ],
25167       [
25168           "Swedish",
25169           "svenska",
25170           "sv"
25171       ],
25172       [
25173           "Swahili",
25174           "Kiswahili",
25175           "sw"
25176       ],
25177       [
25178           "Silesian",
25179           "ślůnski",
25180           "szl"
25181       ],
25182       [
25183           "Tamil",
25184           "தமிழ்",
25185           "ta"
25186       ],
25187       [
25188           "Tulu",
25189           "ತುಳು",
25190           "tcy"
25191       ],
25192       [
25193           "Telugu",
25194           "తెలుగు",
25195           "te"
25196       ],
25197       [
25198           "Tetum",
25199           "tetun",
25200           "tet"
25201       ],
25202       [
25203           "Tajik",
25204           "тоҷикӣ",
25205           "tg"
25206       ],
25207       [
25208           "Thai",
25209           "ไทย",
25210           "th"
25211       ],
25212       [
25213           "Tigrinya",
25214           "ትግርኛ",
25215           "ti"
25216       ],
25217       [
25218           "Turkmen",
25219           "Türkmençe",
25220           "tk"
25221       ],
25222       [
25223           "Tagalog",
25224           "Tagalog",
25225           "tl"
25226       ],
25227       [
25228           "Tswana",
25229           "Setswana",
25230           "tn"
25231       ],
25232       [
25233           "Tongan",
25234           "lea faka-Tonga",
25235           "to"
25236       ],
25237       [
25238           "Tok Pisin",
25239           "Tok Pisin",
25240           "tpi"
25241       ],
25242       [
25243           "Turkish",
25244           "Türkçe",
25245           "tr"
25246       ],
25247       [
25248           "Tsonga",
25249           "Xitsonga",
25250           "ts"
25251       ],
25252       [
25253           "Tatar",
25254           "татарча/tatarça",
25255           "tt"
25256       ],
25257       [
25258           "Tumbuka",
25259           "chiTumbuka",
25260           "tum"
25261       ],
25262       [
25263           "Twi",
25264           "Twi",
25265           "tw"
25266       ],
25267       [
25268           "Tahitian",
25269           "reo tahiti",
25270           "ty"
25271       ],
25272       [
25273           "Tuvinian",
25274           "тыва дыл",
25275           "tyv"
25276       ],
25277       [
25278           "Udmurt",
25279           "удмурт",
25280           "udm"
25281       ],
25282       [
25283           "Uyghur",
25284           "ئۇيغۇرچە / Uyghurche",
25285           "ug"
25286       ],
25287       [
25288           "Ukrainian",
25289           "українська",
25290           "uk"
25291       ],
25292       [
25293           "Urdu",
25294           "اردو",
25295           "ur"
25296       ],
25297       [
25298           "Uzbek",
25299           "oʻzbekcha/ўзбекча",
25300           "uz"
25301       ],
25302       [
25303           "Venda",
25304           "Tshivenda",
25305           "ve"
25306       ],
25307       [
25308           "Venetian",
25309           "vèneto",
25310           "vec"
25311       ],
25312       [
25313           "Veps",
25314           "vepsän kel’",
25315           "vep"
25316       ],
25317       [
25318           "Vietnamese",
25319           "Tiếng Việt",
25320           "vi"
25321       ],
25322       [
25323           "West Flemish",
25324           "West-Vlams",
25325           "vls"
25326       ],
25327       [
25328           "Volapük",
25329           "Volapük",
25330           "vo"
25331       ],
25332       [
25333           "Walloon",
25334           "walon",
25335           "wa"
25336       ],
25337       [
25338           "Waray",
25339           "Winaray",
25340           "war"
25341       ],
25342       [
25343           "Wolof",
25344           "Wolof",
25345           "wo"
25346       ],
25347       [
25348           "Wu Chinese",
25349           "吴语",
25350           "wuu"
25351       ],
25352       [
25353           "Kalmyk",
25354           "хальмг",
25355           "xal"
25356       ],
25357       [
25358           "Xhosa",
25359           "isiXhosa",
25360           "xh"
25361       ],
25362       [
25363           "Mingrelian",
25364           "მარგალური",
25365           "xmf"
25366       ],
25367       [
25368           "Yiddish",
25369           "ייִדיש",
25370           "yi"
25371       ],
25372       [
25373           "Yoruba",
25374           "Yorùbá",
25375           "yo"
25376       ],
25377       [
25378           "Zhuang",
25379           "Vahcuengh",
25380           "za"
25381       ],
25382       [
25383           "Zeelandic",
25384           "Zeêuws",
25385           "zea"
25386       ],
25387       [
25388           "Chinese",
25389           "中文",
25390           "zh"
25391       ],
25392       [
25393           "Classical Chinese",
25394           "文言",
25395           "zh-classical"
25396       ],
25397       [
25398           "Chinese (Min Nan)",
25399           "Bân-lâm-gú",
25400           "zh-min-nan"
25401       ],
25402       [
25403           "Cantonese",
25404           "粵語",
25405           "zh-yue"
25406       ],
25407       [
25408           "Zulu",
25409           "isiZulu",
25410           "zu"
25411       ]
25412   ];
25413
25414   var wikipedia$1 = /*#__PURE__*/Object.freeze({
25415     default: wikipedia
25416   });
25417
25418   var wikisource = [
25419       [
25420           "Arabic",
25421           "العربية",
25422           "ar"
25423       ],
25424       [
25425           "Assamese",
25426           "অসমীয়া",
25427           "as"
25428       ],
25429       [
25430           "Azerbaijani",
25431           "azərbaycanca",
25432           "az"
25433       ],
25434       [
25435           "Belarusian",
25436           "беларуская",
25437           "be"
25438       ],
25439       [
25440           "Bulgarian",
25441           "български",
25442           "bg"
25443       ],
25444       [
25445           "Bangla",
25446           "বাংলা",
25447           "bn"
25448       ],
25449       [
25450           "Breton",
25451           "brezhoneg",
25452           "br"
25453       ],
25454       [
25455           "Bosnian",
25456           "bosanski",
25457           "bs"
25458       ],
25459       [
25460           "Catalan",
25461           "català",
25462           "ca"
25463       ],
25464       [
25465           "Czech",
25466           "čeština",
25467           "cs"
25468       ],
25469       [
25470           "Welsh",
25471           "Cymraeg",
25472           "cy"
25473       ],
25474       [
25475           "Danish",
25476           "dansk",
25477           "da"
25478       ],
25479       [
25480           "German",
25481           "Deutsch",
25482           "de"
25483       ],
25484       [
25485           "Greek",
25486           "Ελληνικά",
25487           "el"
25488       ],
25489       [
25490           "English",
25491           "English",
25492           "en"
25493       ],
25494       [
25495           "Esperanto",
25496           "Esperanto",
25497           "eo"
25498       ],
25499       [
25500           "Spanish",
25501           "español",
25502           "es"
25503       ],
25504       [
25505           "Estonian",
25506           "eesti",
25507           "et"
25508       ],
25509       [
25510           "Persian",
25511           "فارسی",
25512           "fa"
25513       ],
25514       [
25515           "Finnish",
25516           "suomi",
25517           "fi"
25518       ],
25519       [
25520           "Faroese",
25521           "føroyskt",
25522           "fo"
25523       ],
25524       [
25525           "French",
25526           "français",
25527           "fr"
25528       ],
25529       [
25530           "Galician",
25531           "galego",
25532           "gl"
25533       ],
25534       [
25535           "Gujarati",
25536           "ગુજરાતી",
25537           "gu"
25538       ],
25539       [
25540           "Hebrew",
25541           "עברית",
25542           "he"
25543       ],
25544       [
25545           "Croatian",
25546           "hrvatski",
25547           "hr"
25548       ],
25549       [
25550           "Hungarian",
25551           "magyar",
25552           "hu"
25553       ],
25554       [
25555           "Armenian",
25556           "Հայերեն",
25557           "hy"
25558       ],
25559       [
25560           "Indonesian",
25561           "Bahasa Indonesia",
25562           "id"
25563       ],
25564       [
25565           "Icelandic",
25566           "íslenska",
25567           "is"
25568       ],
25569       [
25570           "Italian",
25571           "italiano",
25572           "it"
25573       ],
25574       [
25575           "Japanese",
25576           "日本語",
25577           "ja"
25578       ],
25579       [
25580           "Kannada",
25581           "ಕನ್ನಡ",
25582           "kn"
25583       ],
25584       [
25585           "Korean",
25586           "한국어",
25587           "ko"
25588       ],
25589       [
25590           "Latin",
25591           "Latina",
25592           "la"
25593       ],
25594       [
25595           "Limburgish",
25596           "Limburgs",
25597           "li"
25598       ],
25599       [
25600           "Lithuanian",
25601           "lietuvių",
25602           "lt"
25603       ],
25604       [
25605           "Macedonian",
25606           "македонски",
25607           "mk"
25608       ],
25609       [
25610           "Malayalam",
25611           "മലയാളം",
25612           "ml"
25613       ],
25614       [
25615           "Marathi",
25616           "मराठी",
25617           "mr"
25618       ],
25619       [
25620           "Dutch",
25621           "Nederlands",
25622           "nl"
25623       ],
25624       [
25625           "Norwegian",
25626           "norsk bokmål",
25627           "no"
25628       ],
25629       [
25630           "Odia",
25631           "ଓଡ଼ିଆ",
25632           "or"
25633       ],
25634       [
25635           "Punjabi",
25636           "ਪੰਜਾਬੀ",
25637           "pa"
25638       ],
25639       [
25640           "Polish",
25641           "polski",
25642           "pl"
25643       ],
25644       [
25645           "Portuguese",
25646           "português",
25647           "pt"
25648       ],
25649       [
25650           "Romanian",
25651           "română",
25652           "ro"
25653       ],
25654       [
25655           "Russian",
25656           "русский",
25657           "ru"
25658       ],
25659       [
25660           "Sanskrit",
25661           "संस्कृतम्",
25662           "sa"
25663       ],
25664       [
25665           "Sakha",
25666           "саха тыла",
25667           "sah"
25668       ],
25669       [
25670           "Slovak",
25671           "slovenčina",
25672           "sk"
25673       ],
25674       [
25675           "Slovenian",
25676           "slovenščina",
25677           "sl"
25678       ],
25679       [
25680           "Serbian",
25681           "српски / srpski",
25682           "sr"
25683       ],
25684       [
25685           "Swedish",
25686           "svenska",
25687           "sv"
25688       ],
25689       [
25690           "Tamil",
25691           "தமிழ்",
25692           "ta"
25693       ],
25694       [
25695           "Telugu",
25696           "తెలుగు",
25697           "te"
25698       ],
25699       [
25700           "Thai",
25701           "ไทย",
25702           "th"
25703       ],
25704       [
25705           "Turkish",
25706           "Türkçe",
25707           "tr"
25708       ],
25709       [
25710           "Ukrainian",
25711           "українська",
25712           "uk"
25713       ],
25714       [
25715           "Venetian",
25716           "vèneto",
25717           "vec"
25718       ],
25719       [
25720           "Vietnamese",
25721           "Tiếng Việt",
25722           "vi"
25723       ],
25724       [
25725           "Yiddish",
25726           "ייִדיש",
25727           "yi"
25728       ],
25729       [
25730           "Chinese",
25731           "中文",
25732           "zh"
25733       ],
25734       [
25735           "Chinese (Min Nan)",
25736           "Bân-lâm-gú",
25737           "zh-min-nan"
25738       ]
25739   ];
25740
25741   var wikisource$1 = /*#__PURE__*/Object.freeze({
25742     default: wikisource
25743   });
25744
25745   var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
25746
25747   function unwrapExports (x) {
25748         return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x.default : x;
25749   }
25750
25751   function createCommonjsModule(fn, module) {
25752         return module = { exports: {} }, fn(module, module.exports), module.exports;
25753   }
25754
25755   function getCjsExportFromNamespace (n) {
25756         return n && n.default || n;
25757   }
25758
25759   getCjsExportFromNamespace(wikibooks$1);
25760
25761   getCjsExportFromNamespace(wikinews$1);
25762
25763   getCjsExportFromNamespace(wikiquote$1);
25764
25765   getCjsExportFromNamespace(wikiversity$1);
25766
25767   getCjsExportFromNamespace(wikivoyage$1);
25768
25769   getCjsExportFromNamespace(wiktionary$1);
25770
25771   var require$$6 = getCjsExportFromNamespace(wikipedia$1);
25772
25773   getCjsExportFromNamespace(wikisource$1);
25774
25775   var wikipedia$2 = require$$6;
25776
25777   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"]]}];
25778
25779   var dataDeprecated = [{old:{amenity:"advertising"},replace:{advertising:"*"}},{old:{amenity:"artwork"},replace:{tourism:"artwork"}},{old:{amenity:"car_repair"},replace:{shop:"car_repair"}},{old:{amenity:"citymap_post"},replace:{tourism:"information"}},{old:{amenity:"community_center"},replace:{amenity:"community_centre"}},{old:{amenity:"ev_charging"},replace:{amenity:"charging_station"}},{old:{amenity:"firepit"},replace:{leisure:"firepit"}},{old:{amenity:"garage"},replace:{landuse:"garages"}},{old:{amenity:"garages"},replace:{landuse:"garages"}},{old:{amenity:"public_building"},replace:{building:"public"}},{old:{amenity:"real_estate"},replace:{office:"estate_agent"}},{old:{amenity:"register_office"},replace:{office:"government",government:"register_office"}},{old:{amenity:"sauna"},replace:{leisure:"sauna"}},{old:{amenity:"scrapyard"},replace:{landuse:"industrial",industrial:"scrap_yard"}},{old:{amenity:"shop"},replace:{shop:"*"}},{old:{amenity:"swimming_pool"},replace:{leisure:"swimming_pool"}},{old:{amenity:"vending_machine",vending:"news_papers"},replace:{amenity:"vending_machine",vending:"newspapers"}},{old:{amenity:"youth_center"},replace:{amenity:"community_centre","community_centre:for":"juvenile"}},{old:{amenity:"youth_centre"},replace:{amenity:"community_centre","community_centre:for":"juvenile"}},{old:{barrier:"wire_fence"},replace:{barrier:"fence",fence_type:"chain"}},{old:{barrier:"wood_fence"},replace:{barrier:"fence",fence_type:"wood"}},{old:{building:"entrance"},replace:{entrance:"*"}},{old:{"building:roof:colour":"*"},replace:{"roof:colour":"$1"}},{old:{"building:type":"*"},replace:{building:"$1"}},{old:{color:"*"},replace:{colour:"$1"}},{old:{craft:"jeweler"},replace:{shop:"jewelery"}},{old:{craft:"optician"},replace:{shop:"optician"}},{old:{drinkable:"*"},replace:{drinking_water:"$1"}},{old:{escalator:"*"},replace:{highway:"steps",conveying:"$1"}},{old:{fenced:"yes"},replace:{barrier:"fence"}},{old:{highway:"ford"},replace:{ford:"*"}},{old:{highway:"no"}},{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:"farm"},replace:{landuse:"farmland"}},{old:{landuse:"field"},replace:{landuse:"farmland"}},{old:{landuse:"pond"},replace:{natural:"water",water:"pond"}},{old:{landuse:"wood"},replace:{natural:"wood"}},{old:{leisure:"beach"},replace:{natural:"beach"}},{old:{leisure:"club"},replace:{club:"*"}},{old:{man_made:"jetty"},replace:{man_made:"pier"}},{old:{man_made:"mdf"},replace:{telecom:"exchange"}},{old:{man_made:"MDF"},replace:{telecom:"exchange"}},{old:{man_made:"water_tank"},replace:{man_made:"storage_tank",content:"water"}},{old:{man_made:"well"},replace:{man_made:"water_well"}},{old:{natural:"marsh"},replace:{natural:"wetland",wetland:"marsh"}},{old:{office:"administrative"},replace:{office:"government"}},{old:{office:"real_estate"},replace:{office:"estate_agent"}},{old:{place_name:"*"},replace:{name:"$1"}},{old:{pole:"transition"},replace:{"location:transition":"yes"}},{old:{power:"sub_station"},replace:{power:"substation"}},{old:{power_source:"*"},replace:{"generator:source":"$1"}},{old:{power_rating:"*"},replace:{"generator:output":"$1"}},{old:{"roof:color":"*"},replace:{"roof:colour":"$1"}},{old:{route:"ncn"},replace:{route:"bicycle",network:"ncn"}},{old:{shop:"betting"},replace:{shop:"bookmaker"}},{old:{shop:"organic"},replace:{shop:"supermarket",organic:"only"}},{old:{shop:"fish"},replace:{shop:"seafood"}},{old:{shop:"fishmonger"},replace:{shop:"seafood"}},{old:{shop:"furnace"},replace:{shop:"fireplace"}},{old:{shop:"gallery"},replace:{shop:"art"}},{old:{shop:"perfume"},replace:{shop:"perfumery"}},{old:{shop:"real_estate"},replace:{office:"estate_agent"}},{old:{tourism:"bed_and_breakfast"},replace:{tourism:"guest_house"}},{old:{water:"intermittent"},replace:{natural:"water",intermittent:"yes"}},{old:{water:"riverbank"},replace:{natural:"water",water:"river"}},{old:{water:"salt"},replace:{natural:"water",salt:"yes"}},{old:{water:"tidal"},replace:{natural:"water",tidal:"yes"}},{old:{waterway:"aqueduct"},replace:{waterway:"canal",bridge:"aqueduct"}}];
25780
25781   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};
25782
25783   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}};
25784
25785   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"};
25786
25787   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:["sidebar.key","`","²"],text:"shortcuts.browsing.display_options.sidebar"},{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:["inspector.zoom_to.key"],text:"shortcuts.browsing.with_selected.zoom_to"},{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"}]}]}];
25788
25789   var type$2 = "FeatureCollection";
25790   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]]]}}];
25791   var dataImperial = {
25792   type: type$2,
25793   features: features
25794   };
25795
25796   var type$3 = "FeatureCollection";
25797   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]]]}}];
25798   var dataDriveLeft = {
25799   type: type$3,
25800   features: features$1
25801   };
25802
25803   var en = {icons:{download:"download",information:"info",remove:"remove",undo:"undo",zoom_to:"zoom to",copy:"copy",open_wikidata:"open on wikidata.org"},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:{from_vertex:{to_point:"Connected a way to a point.",to_vertex:"Connected a way to another.",to_line:"Connected a way to a line.",to_area:"Connected a way to an area.",to_adjacent_vertex:"Merged adjacent points in a way.",to_sibling_vertex:"Connected a way to itself."},from_point:{to_point:"Merged a point with another.",to_vertex:"Merged a point with a point in a way.",to_line:"Moved a point to a line.",to_area:"Moved a point 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.",paths_intersect:"These features can't be merged because the resulting path would intersect itself."},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",sidebar:{key:"`",tooltip:"Toggle the sidebar."},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",errors:"Errors",warnings:"Warnings",modified:"Modified",deleted:"Deleted",created:"Created",outstanding_errors_message:"Please resolve all errors first. {count} remaining.",comment_needed_message:"Please add a changeset comment first.",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:{zoom_to:{key:"Z",title:"Zoom to this",tooltip_feature:"Center and zoom the map to focus on this feature.",tooltip_note:"Center and zoom the map to focus on this note.",tooltip_data:"Center and zoom the map to focus on this data.",tooltip_issue:"Center and zoom the map to focus on this issue."},show_more:"Show More",view_on_osm:"View on openstreetmap.org",view_on_keepRight:"View on keepright.at",all_fields:"All fields",all_tags:"All tags",all_members:"All members",all_relations:"All relations",new_relation:"New relation...",choose_relation:"Choose a parent relation",role:"Role",choose:"Select feature type",results:"{n} results for {search}",no_documentation_key:"There is no documentation available.",edit_reference:"edit/translate",wiki_reference:"View documentation",wiki_en_reference:"View documentation in English",hidden_preset:{manual:"{features} are hidden. Enable them in the Map Data pane.",zoom:"{features} are hidden. Zoom in to enable them."},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:",lock:{suggestion:"The \"{label}\" field is locked because there is a Wikidata tag. You can delete it or edit the tags in the \"All tags\" section."}},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"},keepRight:{tooltip:"Automatically detected map issues from keepright.at",title:"KeepRight Issues"},improveOSM:{tooltip:"Missing data automatically detected by improveosm.org",title:"ImproveOSM Issues"},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 Features",tooltip:"Proposed, Construction, Abandoned, Demolished, etc."},others:{description:"Other Features",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}"},zoom:{"in":"Zoom in",out:"Zoom out"},cannot_zoom:"Cannot zoom out further in current mode.",full_screen:"Toggle Full Screen",QA:{improveOSM:{title:"ImproveOSM Detection",geometry_types:{path:"paths",parking:"parking",road:"roads",both:"roads and parking"},directions:{east:"east",north:"north",northeast:"northeast",northwest:"northwest",south:"south",southeast:"southeast",southwest:"southwest",west:"west"},error_types:{ow:{title:"Missing One-way",description:"Along this section of {highway}, {percentage}% of {num_trips} recorded trips travel from {from_node} to {to_node}. There may be missing a \"oneway\" tag."},mr:{title:"Missing Geometry",description:"{num_trips} recorded trips in this area suggest there may be unmapped {geometry_type} here.",description_alt:"Data from a 3rd party suggests there may be unmapped {geometry_type} here."},tr:{title:"Missing Turn Restriction",description:"{num_passed} of {num_trips} recorded trips (travelling {travel_direction}) make a turn from {from_way} to {to_way} at {junction}. There may be a missing \"{turn_restriction}\" restriction."}}},keepRight:{title:"KeepRight Error",detail_title:"Error",detail_description:"Description",comment:"Comment",comment_placeholder:"Enter a comment to share with other users.",close:"Close (Error Fixed)",ignore:"Ignore (Not an Error)",save_comment:"Save Comment",close_comment:"Close and Comment",ignore_comment:"Ignore and Comment",error_parts:{this_node:"this node",this_way:"this way",this_relation:"this relation",this_oneway:"this oneway",this_highway:"this highway",this_railway:"this railway",this_waterway:"this waterway",this_cycleway:"this cycleway",this_cycleway_footpath:"this cycleway/footpath",this_riverbank:"this riverbank",this_crossing:"this crossing",this_railway_crossing:"this railway crossing",this_bridge:"this bridge",this_tunnel:"this tunnel",this_boundary:"this boundary",this_turn_restriction:"this turn restriction",this_roundabout:"this roundabout",this_mini_roundabout:"this mini-roundabout",this_track:"this track",this_feature:"this feature",highway:"highway",railway:"railway",waterway:"waterway",cycleway:"cycleway",cycleway_footpath:"cycleway/footpath",riverbank:"riverbank",place_of_worship:"place of worship",pub:"pub",restaurant:"restaurant",school:"school",university:"university",hospital:"hospital",library:"library",theatre:"theatre",courthouse:"courthouse",bank:"bank",cinema:"cinema",pharmacy:"pharmacy",cafe:"cafe",fast_food:"fast food",fuel:"fuel",from:"from",to:"to",left_hand:"left-hand",right_hand:"right-hand"},errorTypes:{"20":{title:"Multiple nodes on the same spot",description:"There is more than one node in this spot. Node IDs: {var1}."},"30":{title:"Non-closed area",description:"{var1} is tagged with \"{var2}\" and should be a closed loop."},"40":{title:"Impossible oneway",description:"The first node {var1} of {var2} is not connected to any other way."},"41":{description:"The last node {var1} of {var2} is not connected to any other way."},"42":{description:"You cannot reach {var1} because all ways leading from it are oneway."},"43":{description:"You cannot escape from {var1} because all ways leading to it are oneway."},"50":{title:"Almost junction",description:"{var1} is very close but not connected to way {var2}."},"60":{title:"Deprecated tag",description:"{var1} uses deprecated tag \"{var2}\". Please use \"{var3}\" instead."},"70":{title:"Missing tag",description:"{var1} has an empty tag: \"{var2}\"."},"71":{description:"{var1} has no tags."},"72":{description:"{var1} is not member of any way and doesn't have any tags."},"73":{description:"{var1} has a \"{var2}\" tag but no \"highway\" tag."},"74":{description:"{var1} has an empty tag: \"{var2}\"."},"75":{description:"{var1} has a name \"{var2}\" but no other tags."},"90":{title:"Motorway without ref tag",description:"{var1} is tagged as a motorway and therefore needs a \"ref\", \"nat_ref\", or \"int_ref\" tag."},"100":{title:"Place of worship without religion",description:"{var1} is tagged as a place of worship and therefore needs a religion tag."},"110":{title:"Point of interest without name",description:"{var1} is tagged as a \"{var2}\" and therefore needs a name tag."},"120":{title:"Way without nodes",description:"{var1} has just one single node."},"130":{title:"Disconnected way",description:"{var1} is not connected to the rest of the map."},"150":{title:"Railway crossing without tag",description:"{var1} of a highway and a railway needs to be tagged as \"railway=crossing\" or \"railway=level_crossing\"."},"160":{title:"Railway layer conflict",description:"There are ways in different layers (e.g. tunnel or bridge) meeting at {var1}."},"170":{title:"FIXME tagged item",description:"{var1} has a FIXME tag: {var2}"},"180":{title:"Relation without type",description:"{var1} is missing a \"type\" tag."},"190":{title:"Intersection without junction",description:"{var1} intersects the {var2} {var3} but there is no junction node, bridge, or tunnel."},"200":{title:"Overlapping ways",description:"{var1} overlaps the {var2} {var3}."},"210":{title:"Self-intersecting way",description:"There is an unspecified issue with self intersecting ways."},"211":{description:"{var1} contains more than one node multiple times. Nodes are {var2}. This may or may not be an error."},"212":{description:"{var1} has only two different nodes and contains one of them more than once."},"220":{title:"Misspelled tag",description:"{var1} is tagged \"{var2}\" where \"{var3}\" looks like \"{var4}\"."},"221":{description:"{var1} has a suspicious tag \"{var2}\"."},"230":{title:"Layer conflict",description:"{var1} is a junction of ways on different layers."},"231":{description:"{var1} is a junction of ways on different layers: {var2}.",layer:"(layer: {layer})"},"232":{description:"{var1} is tagged with \"layer={var2}\". This need not be an error but it looks strange."},"270":{title:"Unusual motorway connection",description:"{var1} is a junction of a motorway and a highway other than \"motorway\", \"motorway_link\", \"trunk\", \"rest_area\", or \"construction\". Connection to \"service\" or \"unclassified\" is only valid if it has \"access=no/private\", or it leads to a motorway service area, or if it is a \"service=parking_aisle\"."},"280":{title:"Boundary issue",description:"There is an unspecified issue with this boundary."},"281":{title:"Boundary missing name",description:"{var1} has no name."},"282":{title:"Boundary missing admin level",description:"The boundary of {var1} has no valid numeric admin_level. Please do not mix admin levels (e.g. \"6;7\"). Always tag the lowest admin_level of all boundaries."},"283":{title:"Boundary not a closed loop",description:"The boundary of {var1} is not a closed loop."},"284":{title:"Boundary is split",description:"The boundary of {var1} splits here."},"285":{title:"Boundary admin_level too high",description:"{var1} has \"admin_level={var2}\" but belongs to a relation with lower \"admin_level\" (e.g. higher priority); it should have the lowest \"admin_level\" of all relations."},"290":{title:"Restriction issue",description:"There is an unspecified issue with this restriction."},"291":{title:"Restriction missing type",description:"{var1} has an unrecognized restriction type."},"292":{title:"Restriction missing \"from\" way",description:"{var1} has {var2} \"from\" members, but it should have 1."},"293":{title:"Restriction missing \"to\" way",description:"{var1} has {var2} \"to\" members, but it should have 1."},"294":{title:"Restriction \"from\" or \"to\" is not a way",description:"{var1} has \"from\" or \"to\" members which should be ways. {var2}."},"295":{title:"Restriction \"via\" is not an endpoint",description:"{var1} has a \"via\" (node {var2}) which is not the first or the last member of \"{var3}\" (way {var4})."},"296":{title:"Unusual restriction angle",description:"{var1} has a restriction type \"{var2}\" but the angle is {var3} degrees. Maybe the restriction type is not appropriate?"},"297":{title:"Wrong direction of \"to\" way",description:"{var1} does not match the direction of \"to\" way {var2}."},"298":{title:"Redundant restriction - oneway",description:"{var1} may be redundant. Entry already prohibited by \"oneway\" tag on {var2}."},"300":{title:"Missing maxspeed",description:"{var1} is missing a \"maxspeed\" tag and is tagged as motorway, trunk, primary, or secondary."},"310":{title:"Roundabout issue",description:"There is an unspecified issue with this roundabout."},"311":{title:"Roundabout not closed loop",description:"{var1} is part of a roundabout but is not closed-loop. (Split carriageways approaching a roundabout should not be tagged as roundabout)."},"312":{title:"Roundabout wrong direction",description:"If {var1} is in a country with {var2} traffic then its orientation goes the wrong way around."},"313":{title:"Roundabout weakly connected",description:"{var1} has only {var2} other road(s) connected. Roundabouts typically have 3 or more."},"320":{title:"Improper link connection",description:"{var1} is tagged as \"{var2}\" but doesn't have a connection to any other \"{var3}\" or \"{var4}\"."},"350":{title:"Improper bridge tag",description:"{var1} doesn't have a tag in common with its surrounding ways that shows the purpose of this bridge. There should be one of these tags: {var2}."},"360":{title:"Missing local name tag",description:"It would be nice if {var1} had a local name tag \"name:XX={var2}\" where XX shows the language of its common name \"{var2}\"."},"370":{title:"Doubled places",description:"{var1} has tags in common with the surrounding way {var2} {var3} and seems to be redundant.",including_the_name:"(including the name {name})"},"380":{title:"Non-physical use of sport tag",description:"{var1} is tagged \"{var2}\" but has no physical tag (e.g. \"leisure\", \"building\", \"amenity\", or \"highway\")."},"390":{title:"Missing tracktype",description:"{var1} doesn't have a \"tracktype\" tag."},"400":{title:"Geometry issue",description:"There is an unspecified issue with the geometry here."},"401":{title:"Missing turn restriction",description:"Ways {var1} and {var2} join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning."},"402":{title:"Impossible angle",description:"{var1} bends in a very sharp angle here."},"410":{title:"Website issue",description:"There is an unspecified issue with a contact website or URL."},"411":{description:"{var1} may have an outdated URL: {var2} returned HTTP status code {var3}."},"412":{description:"{var1} may have an outdated URL: {var2} contained suspicious text \"{var3}\"."},"413":{description:"{var1} may have an outdated URL: {var2} did not contain keywords \"{var3}\"."}}}},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 {leftclick} 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."},qa:{title:"Quality Assurance",intro:"*Quality Assurance* (Q/A) tools can find improper tags, disconnected roads, and other issues with OpenStreetMap, which mappers can then fix. To view existing Q/A issues, click the {data} **Map data** panel to enable a specific Q/A layer.",tools_h:"Tools",tools:"The following tools are currently supported: [KeepRight](https://www.keepright.at/) and [ImproveOSM](https://improveosm.org/en/). Expect iD to support [Osmose](https://osmose.openstreetmap.fr/) and more Q/A tools in the future.",issues_h:"Handling Issues",issues:"Handling Q/A issues is similar to handling notes. Click on a marker to view the issue details in the sidebar. Each tool has its own capabilities, but generally you can comment and/or close an issue."},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."}}}},issues:{title:"Issues",key:"I",list_title:"Issues ({count})",errors:{list_title:"Errors ({count})"},warnings:{list_title:"Warnings ({count})"},no_issues:{message:"Everything looks fine",info:"Any issues will show up here as you edit"},almost_junction:{message:"{feature} is very close but not connected to {feature2}","highway-highway":{tip:"Intersecting highways should share a junction vertex."}},crossing_ways:{message:"{feature} crosses {feature2}","building-building":{tip:"Buildings should not intersect except on different layers."},"building-highway":{tip:"Highways crossing buildings should use bridges, tunnels, coverings, or entrances."},"building-railway":{tip:"Railways crossing buildings should use bridges or tunnels."},"building-waterway":{tip:"Waterways crossing buildings should use tunnels or different layers."},"highway-highway":{tip:"Crossing highways should use bridges, tunnels, or intersections."},"highway-railway":{tip:"Highways crossing railways should use bridges, tunnels, or level crossings."},"highway-waterway":{tip:"Highways crossing waterways should use bridges, tunnels, or fords."},"railway-railway":{tip:"Crossing railways should be connected or use bridges or tunnels."},"railway-waterway":{tip:"Railways crossing waterways should use bridges or tunnels."},"waterway-waterway":{tip:"Crossing waterways should be connected or use tunnels."},"tunnel-tunnel":{tip:"Crossing tunnels should use different layers."},"tunnel-tunnel_connectable":{tip:"Crossing tunnels should be connected or use different layers."},"bridge-bridge":{tip:"Crossing bridges should use different layers."},"bridge-bridge_connectable":{tip:"Crossing bridges should be connected or use different layers."},"indoor-indoor":{tip:"Crossing indoor features should use different levels."},"indoor-indoor_connectable":{tip:"Crossing indoor features should be connected or use different levels."}},deprecated_tag:{single:{message:"{feature} has the outdated tag \"{tag}\""},combination:{message:"{feature} has an outdated tag combination: {tags}"},tip:"Some tags become deprecated over time and should be replaced."},disconnected_way:{highway:{message:"{highway} is disconnected from other roads and paths",tip:"Highways should connect to other highways or building entrances."}},generic_name:{message:"{feature} has the generic name \"{name}\"",tip:"Names should be the actual, on-the-ground names of features."},many_deletions:{"points-lines-areas":{message:"Deleting {n} features: {p} points, {l} lines, and {a} areas"},"points-lines-areas-relations":{message:"Deleting {n} features: {p} points, {l} lines, {a} areas, and {r} relations"},tip:"Only redundant or nonexistent features should be deleted."},missing_tag:{any:{message:"{feature} has no tags"},descriptive:{message:"{feature} has no descriptive tags"},specific:{message:"{feature} has no \"{tag}\" tag"},tip:"Features must have tags that define what they are."},old_multipolygon:{message:"{multipolygon} has misplaced tags",tip:"Multipolygons should be tagged on their relation, not their outer way."},tag_suggests_area:{message:"{feature} should be a closed area based on the tag \"{tag}\"",tip:"Areas must have connected endpoints."},fix:{connect_almost_junction:{annotation:"Connected very close features."},connect_crossing_features:{annotation:"Connected crossing features."},connect_endpoints:{title:"Connect the ends",annotation:"Connected the endpoints of a way."},connect_features:{title:"Connect the features"},continue_from_start:{title:"Continue drawing from start"},continue_from_end:{title:"Continue drawing from end"},delete_feature:{title:"Delete this feature"},move_tags:{title:"Move the tags",annotation:"Moved tags."},remove_deprecated_tag:{annotation:"Removed an old tag."},remove_deprecated_tag_combo:{annotation:"Removed an old tag combination."},remove_generic_name:{title:"Remove the name",annotation:"Removed a generic name."},remove_tag:{title:"Remove the tag",annotation:"Removed tag."},remove_tags:{title:"Remove the tags"},reposition_features:{title:"Reposition the features"},select_preset:{title:"Select a feature type"},tag_as_disconnected:{title:"Tag as disconnected",annotation:"Tagged very close features as disconnected."},upgrade_tag:{title:"Upgrade the tag",annotation:"Upgraded an old tag."},upgrade_tag_combo:{title:"Upgrade the tags",annotation:"Upgraded an old tag combination."},use_bridge_or_tunnel:{title:"Use a bridge or tunnel"},use_different_layers:{title:"Use different layers"},use_different_levels:{title:"Use different levels"},use_tunnel:{title:"Use a tunnel"}}},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",sidebar:"Toggle sidebar",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",zoom_to:"Zoom to selected feature"},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}"},wikidata:{identifier:"Identifier",label:"Label",description:"Description"},presets:{categories:{"category-barrier":{name:"Barrier Features"},"category-building":{name:"Building Features"},"category-golf-area":{name:"Golf Features"},"category-golf-line":{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-utility":{name:"Utility 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"},architect:{label:"Architect"},"area/highway":{label:"Type"},artist:{label:"Artist"},artwork_type:{label:"Type"},atm:{label:"ATM"},attraction:{label:"Type"},backrest:{label:"Backrest"},barrier:{label:"Type"},basin:{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:"Beauty Specialty"},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"},"bridge/support":{label:"Type"},building_area:{label:"Building"},building:{label:"Building"},"building/material":{label:"Material"},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"},check_date:{label:"Last Checked Date"},clothes:{label:"Clothes"},club:{label:"Type"},collection_times:{label:"Collection Times"},colour:{label:"Color"},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"},conveying:{label:"Movement Direction",options:{forward:"Forward",backward:"Backward",reversible:"Reversible"}},country:{label:"Country"},couplings:{label:"Couplings",placeholder:"1, 2, 3..."},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"},departures_board:{label:"Departures Board",options:{yes:"Yes",timetable:"Timetable",realtime:"Realtime",no:"None"}},description:{label:"Description"},design:{label:"Design"},destination_oneway:{label:"Destinations"},"destination/ref_oneway":{label:"Destination Road Numbers"},"destination/symbol_oneway":{label:"Destination Symbols"},devices:{label:"Devices",placeholder:"1, 2, 3..."},diaper:{label:"Diaper Changing Available"},diet_multi:{label:"Diet Types"},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:"Distance"},dock:{label:"Type"},dog:{label:"Dogs",options:{yes:"Allowed",leashed:"Leashed Only",no:"Not Allowed"}},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"},enforcement:{label:"Type"},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/diameter":{label:"Diameter (mm, in, or letters)"},"fire_hydrant/pressure":{label:"Pressure (bar)"},"fire_hydrant/type":{label:"Shape",options:{pillar:"Pillar/Aboveground",underground:"Underground",wall:"Wall",pipe:"Capped Pipe"}},fireplace:{label:"Fireplace"},fitness_station:{label:"Equipment Type"},fixme:{label:"Fix Me"},"flag/type":{label:"Flag Type"},ford:{label:"Type",placeholder:"Default"},frequency_electrified:{label:"Operating Frequency"},frequency:{label:"Operating Frequency"},from:{label:"From"},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"},"historic/wreck/date_sunk":{label:"Date Sunk"},"historic/wreck/visible_at_high_tide":{label:"Visible At High Tide"},"historic/wreck/visible_at_low_tide":{label:"Visible At Low Tide"},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_yes:{label:"Intermittent"},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)"},junction_line:{label:"Junction",options:{roundabout:"Roundabout",circular:"Traffic Circle",jughandle:"Jughandle"}},"junction/ref_oneway":{label:"Junction Number"},kerb:{label:"Curb"},label:{label:"Label"},lamp_type:{label:"Type"},landuse:{label:"Type"},lanes:{label:"Lanes",placeholder:"1, 2, 3..."},language_multi:{label:"Languages"},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_pool:{label:"Location",options:{outdoor:"Outdoor",indoor:"Indoor",roof:"Rooftop"}},location:{label:"Location"},man_made:{label:"Type"},manhole:{label:"Type"},map_size:{label:"Coverage"},map_type:{label:"Type"},material:{label:"Material"},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"},minspeed:{label:"Minimum Speed Limit",placeholder:"20, 30, 40..."},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"}},"oneway/bicycle":{label:"One Way (Bicycles)"},opening_date:{label:"Expected Opening Date"},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"}},payment_multi:{label:"Payment Types"},phases:{label:"Phases",placeholder:"1, 2, 3..."},phone:{label:"Telephone",placeholder:"+31 42 123 4567"},"piste/difficulty_downhill":{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/difficulty_nordic":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice - Flat, no effort needed",easy:"Easy - Soft hills, short steep section",intermediate:"Intermediate - Steep section",advanced:"Advanced - Narrow, steep or icy section, sharp turn",expert:"Expert - Dangerous terrain around"}},"piste/difficulty_skitour":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice - L: <30° incline",easy:"Easy - WS: 30-35° incline",intermediate:"Intermediate - ZS: 35-40° incline",advanced:"Advanced - S: 40-45° incline",expert:"Expert - SS: 45–50° incline",freeride:"Freeride - AS: 50–55° incline",extreme:"Extreme - EX: >55° incline"}},"piste/difficulty":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice",easy:"Easy",intermediate:"Intermediate",advanced:"Advanced",expert:"Expert",freeride:"Freeride",extreme:"Extreme"}},"piste/grooming_downhill":{label:"Grooming",options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry - no grooming"}},"piste/grooming_hike":{label:"Grooming",options:{classic:"Classic - Winter Hiking",backcountry:"Backcountry - Snowshoeing"}},"piste/grooming_nordic":{label:"Grooming",options:{classic:"Classic",backcountry:"Backcountry, no grooming","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}},"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",connection:"Connection"}},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"},recycling_type:{label:"Type",placeholder:"Container, Center",options:{container:"Container",centre:"Center"}},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"},"roof/colour":{label:"Roof Color"},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"}},salt:{label:"Salt"},sanitary_dump_station:{label:"Toilet Disposal"},scuba_diving:{label:"Services"},"seamark/beacon_isolated_danger/shape":{label:"Shape"},"seamark/beacon_lateral/category":{label:"Category",options:{port:"Port",starboard:"Starboard",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right"}},"seamark/beacon_lateral/colour":{label:"Color",options:{red:"Red",green:"Green",grey:"Grey"}},"seamark/beacon_lateral/shape":{label:"Shape"},"seamark/beacon_lateral/system":{label:"System",options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}},"seamark/buoy_lateral/category":{label:"Category",options:{port:"Port",starboard:"Starboard",channel_left:"Channel Left",channel_right:"Channel Right",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right",preferred_channel_port:"Preferred Channel Port",preferred_channel_starboard:"Preferred Channel Starboard"}},"seamark/buoy_lateral/colour":{label:"Color",options:{red:"Red",green:"Green","red;white;red;white":"Red-White-Red-White","green;white;green;white":"Green-White-Green-White","red;green;red":"Red-Green-Red","green;red;green":"Green-Red-Green",white:"White",yellow:"Yellow"}},"seamark/buoy_lateral/shape":{label:"Shape"},"seamark/buoy_lateral/system":{label:"System",options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}},"seamark/mooring/category":{label:"Category"},"seamark/type":{label:"Seamark"},"seamark/wreck/category":{label:"Category"},seasonal:{label:"Seasonal"},seats:{label:"Seats",placeholder:"2, 4, 6..."},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"},"survey/date":{label:"Last Survey Date"},swimming_pool:{label:"Type"},"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"}},tidal:{label:"Tidal"},to:{label:"To"},"toilets/disposal":{label:"Disposal",options:{flush:"Flush",pitlatrine:"Pit/Latrine",chemical:"Chemical",bucket:"Bucket"}},toll:{label:"Toll"},tomb:{label:"Type"},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_sign:{label:"Traffic Sign"},"traffic_sign/direction":{label:"Direction",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},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_electrified:{label:"Voltage"},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_source:{label:"Water Source"},water_volume:{label:"Water Reserve Volume (m³)"},water:{label:"Type"},waterway:{label:"Type"},website:{label:"Website",placeholder:"https://example.com"},wetland:{label:"Type"},wheelchair:{label:"Wheelchair Access"},wholesale:{label:"Wholesale"},width:{label:"Width (Meters)"},wikidata:{label:"Wikidata"},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:""},aeroway:{name:"Aeroway",terms:""},amenity:{name:"Amenity",terms:""},attraction:{name:"Attraction",terms:""},circular:{name:"Traffic Circle",terms:""},embankment:{name:"Embankment",terms:""},highway:{name:"Highway",terms:""},landuse:{name:"Land Use",terms:""},leisure:{name:"Leisure",terms:""},man_made:{name:"Man Made",terms:""},natural:{name:"Natural",terms:""},place:{name:"Place",terms:""},power:{name:"Power",terms:""},railway:{name:"Railway",terms:""},roundabout:{name:"Roundabout",terms:""},seamark:{name:"Seamark",terms:""},tourism:{name:"Tourism",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/recycling":{name:"Recycling",terms:"bin,can,bottle,glass,garbage,rubbish,scrap,trash"},"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/clock/sundial":{name:"Sundial",terms:"gnomon,shadow"},"amenity/college":{name:"College Grounds",terms:"university,undergraduate school"},"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/dive_centre":{name:"Dive Center",terms:"diving,scuba"},"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:"potable water source,water fountain,drinking fountain,bubbler,water tap"},"amenity/driving_school":{name:"Driving School",terms:""},"amenity/embassy":{name:"Embassy",terms:""},"amenity/fast_food":{name:"Fast Food",terms:"restaurant,takeaway"},"amenity/fast_food/burger":{name:"Burger Fast Food",terms:"breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/chicken":{name:"Chicken Fast Food",terms:"breakfast,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/fish_and_chips":{name:"Fish & Chips Fast Food",terms:"breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table,french fries"},"amenity/fast_food/kebab":{name:"Kebab Fast Food",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/mexican":{name:"Mexican Fast Food",terms:"breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,tacos,burritos,enchiladas,fajitas,nachos,tortillas,salsa,tamales,quesadillas"},"amenity/fast_food/pizza":{name:"Pizza Fast Food",terms:"dine,dining,dinner,drive-in,eat,lunch,table,deep dish,thin crust,slice"},"amenity/fast_food/sandwich":{name:"Sandwich Fast Food",terms:"breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"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/language_school":{name:"Language School",terms:"esl"},"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/money_transfer":{name:"Money Transfer Station",terms:"money order,check,bill,currency,finance,wire transfer,cable,person to person,cash to cash,exchange"},"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:"Parking Lot",terms:"automobile parking,car lot,car parking,rv parking,truck parking,vehicle parking"},"amenity/parking/multi-storey":{name:"Multilevel Parking Garage",terms:"car,indoor parking,multistorey car park,parkade,parking building,parking deck,parking garage,parking ramp,parking structure"},"amenity/payment_centre":{name:"Payment Center",terms:"check,tax pay,bill pay,currency,finance,cash,money"},"amenity/payment_terminal":{name:"Payment Terminal",terms:"interactive kiosk,ekiosk,atm,bill pay,tax pay,phone pay,finance,cash,money transfer,card"},"amenity/pharmacy":{name:"Pharmacy Counter",terms:"apothecary,drug store,drugstore,med*,prescription"},"amenity/photo_booth":{name:"Photo Booth",terms:"photobooth,photo,booth,kiosk,camera"},"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:"Christian 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:"Jewish Synagogue",terms:"jewish"},"amenity/place_of_worship/muslim":{name:"Muslim 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_container":{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/restaurant/american":{name:"American Restaurant",terms:"bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/asian":{name:"Asian Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/chinese":{name:"Chinese Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/french":{name:"French Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/german":{name:"German Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/greek":{name:"Greek Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,gyros,pitas,olives"},"amenity/restaurant/indian":{name:"Indian Restaurant",terms:"bar,breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,curry"},"amenity/restaurant/italian":{name:"Italian Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,pasta,pizza"},"amenity/restaurant/japanese":{name:"Japanese Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/mexican":{name:"Mexican Restaurant",terms:"bar,breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,tacos,burritos,enchiladas,fajitas,nachos,tortillas,salsa,tamales,quesadillas"},"amenity/restaurant/noodle":{name:"Noodle Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,ramen noodles,soup,soba noodles,cellophane noodles,rice noodles"},"amenity/restaurant/pizza":{name:"Pizza Restaurant",terms:"bar,dine,dining,dinner,drive-in,eat,lunch,table,deep dish,thin crust,slice"},"amenity/restaurant/seafood":{name:"Seafood Restaurant",terms:"bar,breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table,fish,shellfish,molluscs,crustaceans,clams,oysters,lobsters,crab,shrimp,squid,octopus"},"amenity/restaurant/steakhouse":{name:"Steakhouse",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,steak house,chop house,beef"},"amenity/restaurant/sushi":{name:"Sushi Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/thai":{name:"Thai Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/turkish":{name:"Turkish Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/vietnamese":{name:"Vietnamese Restaurant",terms:"bar,breakfast,cafe,café,canteen,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/shelter/gazebo":{name:"Gazebo",terms:""},"amenity/shelter/lean_to":{name:"Lean-To",terms:""},"amenity/shelter/picnic_shelter":{name:"Picnic Shelter",terms:"pavilion"},"amenity/shelter/public_transport":{name:"Transit Shelter",terms:"bus stop,metro stop,waiting"},"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/theatre/type/amphi":{name:"Amphitheatre",terms:"open air,outdoor,greek,ampi"},"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,graduate school,PhD program,master's degree program"},"amenity/vehicle_inspection":{name:"Vehicle Inspection",terms:"car inspection"},"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 Dispenser",terms:"excrement bags,poop,waste,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 Locker",terms:"mail,parcel,pickup"},"amenity/vending_machine/parcel_pickup":{name:"Parcel Pickup Locker",terms:"amazon,locker,mail,parcel,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/summer_toboggan":{name:"Summer Toboggan",terms:"alpine slide,mountain coaster"},"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/fence/railing":{name:"Railing",terms:"railing,handrail,guard rail"},"barrier/gate":{name:"Gate",terms:""},"barrier/guard_rail":{name:"Guard Rail",terms:"guardrail,traffic barrier,crash barrier,median barrier,roadside barrier,Armco barrier"},"barrier/hedge":{name:"Hedge",terms:""},"barrier/kerb":{name:"Curb",terms:""},"barrier/kerb/flush":{name:"Flush Curb",terms:"even curb,level curb,tactile curb"},"barrier/kerb/lowered":{name:"Lowered Curb",terms:"curb cut,curb ramp,kerb ramp,dropped kerb,pram ramp"},"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:""},"bridge/support":{name:"Bridge Support",terms:""},"bridge/support/pier":{name:"Bridge Pier",terms:""},building:{name:"Building",terms:""},"building/bunker":{name:"Bunker",terms:""},"building/entrance":{name:"Entrance/Exit",terms:""},"building/train_station":{name:"Train Station Building",terms:""},"building/apartments":{name:"Apartment Building",terms:""},"building/barn":{name:"Barn",terms:""},"building/boathouse":{name:"Boathouse",terms:""},"building/bungalow":{name:"Bungalow",terms:"home,detached"},"building/cabin":{name:"Cabin",terms:""},"building/carport":{name:"Carport",terms:"covered parking space,garage,car,porch"},"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/pavilion":{name:"Pavilion Building",terms:"sports"},"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"},"club/sport":{name:"Sports Club",terms:"athletics club,sporting club,sports association,sports society"},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:""},"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,fire water well,hydrant"},"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"},ford:{name:"Ford",terms:""},"golf/bunker":{name:"Sand Trap",terms:"hazard,bunker"},"golf/cartpath_service":{name:"Golf Cartpath / Service Road",terms:""},"golf/cartpath":{name:"Golf Cartpath",terms:""},"golf/driving_range":{name:"Driving Range",terms:""},"golf/fairway":{name:"Fairway",terms:""},"golf/green":{name:"Putting Green",terms:""},"golf/hole":{name:"Golf Hole",terms:""},"golf/lateral_water_hazard":{name:"Lateral Water Hazard",terms:""},"golf/path":{name:"Golf Walking Path",terms:""},"golf/rough":{name:"Rough",terms:""},"golf/tee":{name:"Tee Box",terms:"teeing ground"},"golf/water_hazard":{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/construction":{name:"Road Closed",terms:"closed,closure,construction"},"highway/corridor":{name:"Indoor Corridor",terms:"gallery,hall,hallway,indoor,passage,passageway"},"highway/crossing/zebra-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/crossing/zebra":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/crossing/marked-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/crossing/marked":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/crossing/unmarked-raised":{name:"Unmarked Crossing (Raised)",terms:"flat top,hump,speed,slow"},"highway/crossing/unmarked":{name:"Unmarked Crossing",terms:""},"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/footway/zebra-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/footway/zebra":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/footway/conveying":{name:"Moving Walkway",terms:"moving sidewalk,autwalk,skywalk,travolator,travelator,travellator,conveyor"},"highway/footway/marked-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/footway/marked":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/footway/sidewalk":{name:"Sidewalk",terms:"pavement,sidepath"},"highway/footway/unmarked-raised":{name:"Unmarked Crossing (Raised)",terms:"flat top,hump,speed,slow"},"highway/footway/unmarked":{name:"Unmarked Crossing",terms:""},"highway/give_way":{name:"Yield Sign",terms:"give way,yield,sign"},"highway/living_street":{name:"Living Street",terms:""},"highway/milestone":{name:"Highway Milestone",terms:"milestone,marker"},"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/steps/conveying":{name:"Escalator",terms:"moving staircase,moving stairway,people mover"},"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:""},"historic/wreck":{name:"Shipwreck",terms:"hull,mast,maritime,remains,ship,boat"},"internet_access/wlan":{name:"Wi-Fi Hotspot",terms:"wi-fi,wifi,hotspot"},junction:{name:"Junction",terms:""},"landuse/basin":{name:"Basin",terms:""},"landuse/farm":{name:"Farmland",terms:""},"landuse/pond":{name:"Pond",terms:""},"landuse/reservoir":{name:"Reservoir",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/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:"Managed Forest",terms:"cut,forest,forestry,lumber,silviculture,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/residential/apartments":{name:"Apartment Complex",terms:"flat,residence,tenement"},"landuse/retail":{name:"Retail Area",terms:""},"landuse/vineyard":{name:"Vineyard",terms:"grape,wine"},"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/bandstand":{name:"Bandstand",terms:""},"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/fishing":{name:"Fishing Spot",terms:"angler"},"leisure/fitness_centre":{name:"Gym / Fitness Center",terms:"health,gym,leisure,studio"},"leisure/fitness_centre/yoga":{name:"Yoga Studio",terms:"studio,asanas,modern yoga,meditation"},"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/picnic_table/chess":{name:"Chess Table",terms:"bench,chess board,checkerboard,checkers,chequerboard,game table"},"leisure/pitch":{name:"Sport Pitch",terms:"field"},"leisure/pitch/american_football":{name:"American Football Field",terms:"football,gridiron"},"leisure/pitch/australian_football":{name:"Australian Football Field",terms:"Aussie,AFL,football"},"leisure/pitch/badminton":{name:"Badminton Court",terms:""},"leisure/pitch/baseball":{name:"Baseball Field",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/netball":{name:"Netball Court",terms:""},"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/softball":{name:"Softball Field",terms:"softball,diamond"},"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/sauna":{name:"Sauna",terms:""},"leisure/slipway":{name:"Slipway",terms:"boat launch,boat ramp,boat landing"},"leisure/sports_centre":{name:"Sports Center / Complex",terms:""},"leisure/sports_centre/climbing":{name:"Climbing Gym",terms:"abseiling,artificial climbing wall,belaying,bouldering,rock climbing facility,indoor rock wall,rappeling,rock gym,ropes"},"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,aquatics"},"leisure/track":{name:"Racetrack (Non-Motorsport)",terms:"cycle,dog,greyhound,horse,race*,track"},"leisure/track/horse_racing":{name:"Racetrack (Horse Racing)",terms:"race*,horse,track"},"leisure/track/running":{name:"Racetrack (Running)",terms:"race*,running,sprint,track"},"leisure/water_park":{name:"Water Park",terms:"swim,pool,dive"},line:{name:"Line",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/embankment":{name:"Embankment",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/mast/communication":{name:"Communication 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/mast/communication/mobile_phone":{name:"Mobile Phone Mast",terms:"antenna,cell mast,cell phone mast,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,transmission mast,transmission tower"},"man_made/mast/communication/radio":{name:"Radio Broadcast Mast",terms:"antenna,broadcast tower,communication mast,communication tower,guyed tower,radio mast,radio tower,transmission mast,transmission tower"},"man_made/mast/communication/television":{name:"Television Broadcast Mast",terms:"antenna,broadcast tower,communication mast,communication tower,guyed tower,television mast,television tower,transmission mast,transmission tower,tv mast,tv tower"},"man_made/monitoring_station":{name:"Monitoring Station",terms:"weather,earthquake,seismology,air,gps"},"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:"oil,natural gas,water,sewer,sewage"},"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":{name:"Surveillance",terms:"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"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/survey_point":{name:"Survey Point",terms:"trig point,triangulation pillar,trigonometrical station"},"man_made/tower":{name:"Tower",terms:""},"man_made/tower/bell_tower":{name:"Bell Tower",terms:"belfry,bell gable,campanile,church tower,klockstapel"},"man_made/tower/communication":{name:"Communication Tower",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/tower/minaret":{name:"Minaret",terms:"Islam,mosque,Muezzin,Muslim"},"man_made/tower/observation":{name:"Observation Tower",terms:"lookout tower,fire tower"},"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/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/basin":{name:"Basin",terms:"detention,drain,overflow,rain,retention"},"natural/water/canal":{name:"Canal",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/water/river":{name:"River",terms:"beck,branch,brook,course,creek,estuary,rill,riverbank,rivulet,run,runnel,stream,tributary,watercourse"},"natural/water/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"},"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:"real estate"},"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/religion":{name:"Religious Office",terms:""},"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/downhill":{name:"Downhill Piste/Ski Run",terms:"ski,alpine,snowboard,downhill,piste"},"piste/downhill/halfpipe":{name:"Halfpipe",terms:"ski,alpine,halfpipe,half pipe,snowboard,downhill,piste"},"piste/hike":{name:"Snowshoeing or Winter Hiking Trail",terms:"hike,winter hiking,snowshoe,snowshoeing,piste,ski"},"piste/ice_skate":{name:"Ice Skating Piste",terms:"ice,skating,ski,piste"},"piste/nordic":{name:"Nordic or Crosscountry Piste/Ski Trail",terms:"ski,nordic,crosscountry,skating,piste"},"piste/piste":{name:"Winter Sport Trails",terms:"ski,nordic,crosscountry,downhill,alpine,snowboard,skitour,ski touring,sled,luge,sleigh,sledge,ski-joring,husky,horse,winter hiking,snowshoe,snowshoeing,ice,skating"},"piste/skitour":{name:"Ski Touring Trail",terms:"ski,skitour,crosscountry,ski touring,piste"},"piste/sled":{name:"Sled Piste",terms:"ski,sled,luge,sleigh,sledge,piste"},"piste/sleigh":{name:"Sleigh Piste",terms:"ski,piste,sled,luge,sleigh,sledge,ski-joring,husky,horse"},"place/farm":{name:"Farm",terms:""},"place/city_block":{name:"City Block",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/cable/underground":{name:"Underground Power Cable",terms:""},"power/generator":{name:"Power Generator",terms:"hydro,solar,turbine,wind"},"power/generator/method/photovoltaic":{name:"Solar Panel",terms:"photovoltaic module,PV module,sunlight"},"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"},"power/transformer":{name:"Transformer",terms:""},"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:""},"seamark/beacon_isolated_danger":{name:"Danger Beacon",terms:"beacon isolated danger,isolated danger beacon,iala"},"seamark/beacon_lateral":{name:"Channel Beacon",terms:"lateral beacon,beacon lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral":{name:"Channel Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral/green":{name:"Green Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral/red":{name:"Red Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/mooring":{name:"Mooring",terms:"dolphin,pile,bollard,buoy,post"},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:"bread,cakes,rolls"},"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:"drinks"},"shop/bicycle":{name:"Bicycle Shop",terms:"bike,repair,tricycle,unicycle"},"shop/bookmaker":{name:"Bookmaker",terms:"betting,bookie"},"shop/books":{name:"Book Store",terms:""},"shop/boutique":{name:"Boutique",terms:""},"shop/butcher":{name:"Butcher",terms:"chicken,beef,lamb,meat,pork"},"shop/candles":{name:"Candle Shop",terms:"wax"},"shop/car_parts":{name:"Car Parts Store",terms:"automobile,automotive"},"shop/car_repair":{name:"Car Repair Shop",terms:"automobile,automotive,garage,service"},"shop/car":{name:"Car Dealership",terms:"automobile,automotive"},"shop/caravan":{name:"RV Dealership",terms:"auto,camper,recreational vehicle"},"shop/carpet":{name:"Carpet Store",terms:"rug"},"shop/catalogue":{name:"Catalog Shop",terms:""},"shop/charity":{name:"Charity Store",terms:"thrift,op shop,nonprofit"},"shop/cheese":{name:"Cheese Store",terms:""},"shop/chemist":{name:"Drugstore",terms:"apothecary,beauty,drug store,drugstore,gift,hair,med*,pharmacy,prescription,tooth"},"shop/chocolate":{name:"Chocolate Store",terms:"cocoa"},"shop/clothes":{name:"Clothing Store",terms:""},"shop/coffee":{name:"Coffee Store",terms:""},"shop/computer":{name:"Computer Store",terms:"desktop,laptop,hardware,operating system,software"},"shop/confectionery":{name:"Candy Store",terms:"sweet"},"shop/convenience":{name:"Convenience Store",terms:""},"shop/copyshop":{name:"Copy Store",terms:"print,scan"},"shop/cosmetics":{name:"Cosmetics Store",terms:"make-up,makeup"},"shop/country_store":{name:"Country 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,vape,vaping,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/fireplace":{name:"Fireplace Store",terms:"fireplace,stove,masonry heater"},"shop/fishing":{name:"Fishing Shop",terms:"bait,fishing line,flies,fly,lure,reel,rod,tackle"},"shop/florist":{name:"Florist",terms:"flower"},"shop/frame":{name:"Framing Shop",terms:"art*,paint*,photo*,frame"},"shop/frozen_food":{name:"Frozen Food",terms:""},"shop/fuel":{name:"Fuel Shop",terms:""},"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,produce,vegetable"},"shop/hairdresser_supply":{name:"Hairdresser Supply Store",terms:"barber,shampoo,conditioner"},"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:"audio,hi-fi,high fidelity,stereo,video"},"shop/houseware":{name:"Houseware Store",terms:"home,household"},"shop/hunting":{name:"Hunting Shop",terms:"arrows,bows,bullets,crossbows,rifles,traps"},"shop/interior_decoration":{name:"Interior Decoration Store",terms:""},"shop/jewelry":{name:"Jeweler",terms:"bracelet,diamond,earrings,gem,necklace,pins,ring"},"shop/kiosk":{name:"Kiosk",terms:""},"shop/kitchen":{name:"Kitchen Design Store",terms:"cabinets,countertops,sinks"},"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:"tape casettes,CDs,compact discs,vinyl records"},"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,outfitter,outdoor equipment,outdoor supplies"},"shop/paint":{name:"Paint Store",terms:""},"shop/party":{name:"Party Supply Store",terms:"balloons,costumes,decorations,invitations"},"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:"cat,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:"antenna,transistor"},"shop/religion":{name:"Religious Store",terms:""},"shop/scuba_diving":{name:"Scuba Diving Shop",terms:"diving,scuba"},"shop/seafood":{name:"Seafood Shop",terms:"fishmonger"},"shop/second_hand":{name:"Consignment/Thrift Store",terms:"secondhand,second hand,resale,thrift,used"},"shop/sewing":{name:"Sewing Supply Shop",terms:"haberdashery"},"shop/shoes":{name:"Shoe Store",terms:"boots,cleats,clogs,heels,loafers,oxfords,sneakers"},"shop/sports":{name:"Sporting Goods Store",terms:"athletics"},"shop/stationery":{name:"Stationery Store",terms:"card,paper"},"shop/storage_rental":{name:"Storage Rental",terms:"garages"},"shop/supermarket":{name:"Supermarket",terms:"grocery,store,shop"},"shop/tailor":{name:"Tailor",terms:"clothes,suit"},"shop/tattoo":{name:"Tattoo Parlor",terms:"ink"},"shop/tea":{name:"Tea Store",terms:""},"shop/ticket":{name:"Ticket Seller",terms:"box office"},"shop/tiles":{name:"Tile Shop",terms:""},"shop/tobacco":{name:"Tobacco Shop",terms:"cigarettes,cigars"},"shop/toys":{name:"Toy Store",terms:"games"},"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,VHS,video casette"},"shop/watches":{name:"Watches Shop",terms:""},"shop/water_sports":{name:"Watersport/Swim Shop",terms:""},"shop/water":{name:"Drinking Water 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/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/artwork/mural":{name:"Mural",terms:"fresco,wall painting"},"tourism/artwork/sculpture":{name:"Sculpture",terms:"statue,figure,carving"},"tourism/artwork/statue":{name:"Statue",terms:"sculpture,figure,carving"},"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"},traffic_sign_vertex:{name:"Traffic Sign",terms:"road,highway"},traffic_sign:{name:"Traffic Sign",terms:"road,highway"},"traffic_sign/city_limit_vertex":{name:"City Limit Sign",terms:"town,village,hamlet,boundary,edge,border,road,highway"},"traffic_sign/city_limit":{name:"City Limit Sign",terms:"town,village,hamlet,boundary,edge,border,road,highway"},"traffic_sign/maxspeed_vertex":{name:"Speed Limit Sign",terms:"max speed,maximum speed,road,highway"},"traffic_sign/maxspeed":{name:"Speed Limit Sign",terms:"max speed,maximum speed,road,highway"},"type/multipolygon":{name:"Multipolygon",terms:""},"type/boundary":{name:"Boundary",terms:""},"type/boundary/administrative":{name:"Administrative Boundary",terms:""},"type/enforcement":{name:"Enforcement",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/riverbank":{name:"Riverbank",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/milestone":{name:"Waterway Milestone",terms:"milestone,marker"},"waterway/river":{name:"River",terms:"beck,branch,brook,course,creek,estuary,rill,rivulet,run,runnel,stream,tributary,watercourse"},"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-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-TIGER-Roads-2018":{description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",name:"TIGER Roads 2018"},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"},UrbISOrtho2018:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2018"},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"},"eufar-balaton":{attribution:{text:"EUFAR Balaton ortofotó 2010"},description:"1940 geo-tagged photography from Balaton Limnological Institute.",name:"EUFAR Balaton orthophotos"},"finds.jp_KBN_2500":{attribution:{text:"GSI KIBAN 2500"},description:"GSI Kiban 2500 via finds.jp. Good for tracing, but a bit older.",name:"Japan GSI KIBAN 2500"},"gsi.go.jp":{attribution:{text:"GSI Japan"},description:"Japan GSI ortho Imagery. Usually better than bing, but a bit older.",name:"Japan GSI ortho Imagery"},"gsi.go.jp_airphoto":{attribution:{text:"GSI Japan"},description:"Japan GSI airphoto Imagery. Not fully orthorectified, but a bit newer and/or differently covered than GSI ortho Imagery.",name:"Japan GSI airphoto Imagery"},"gsi.go.jp_seamlessphoto":{attribution:{text:"GSI Japan seamless photo"},description:"Japan GSI seamlessphoto Imagery. The collection of latest imageries of GSI ortho, airphoto, post disaster and others.",name:"Japan GSI seamlessphoto Imagery"},"gsi.go.jp_std_map":{attribution:{text:"GSI Japan"},description:"Japan GSI Standard Map. Widely covered.",name:"Japan GSI Standard Map"},"helsingborg-orto":{attribution:{text:"© Helsingborg municipality"},description:"Orthophotos from the municipality of Helsingborg 2016, public domain",name:"Helsingborg Orthophoto"},"kalmar-orto-2014":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for the north coast of the municipality of Kalmar 2014",name:"Kalmar North Orthophoto 2014"},"kalmar-orto-2016":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for the south coast of the municipality of Kalmar 2016",name:"Kalmar South Orthophoto 2016"},"kalmar-orto-2018":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for urban areas of the municipality of Kalmar 2018",name:"Kalmar Urban Orthophoto 2018"},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"},"lantmateriet-topowebb":{attribution:{text:"© Lantmäteriet, CC0"},description:"Topographic map of Sweden 1:50 000",name:"Lantmäteriet Topographic Map"},"linkoping-orto":{attribution:{text:"© Linköping municipality"},description:"Orthophotos from the municipality of Linköping 2010, open data",name:"Linköping Orthophoto"},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"},"stockholm-orto":{attribution:{text:"© Stockholm municipality, CC0"},description:"Orthophotos from the municipality of Stockholm 2015, CC0 license",name:"Stockholm Orthophoto"},"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-forum":{name:"OpenStreetMap India forum",description:"OpenStreetMap India web forum"},"osm-india-github":{name:"OpenStreetMap India GitHub",description:"Code with us: {url}"},"OSM-india-mailinglist":{name:"OpenStreetMap India Mailinglist",description:"Talk-in is the official Mailinglist for Indian Community"},"osm-india-telegram":{name:"OpenStreetMap India Telegram",description:"Join our family: {url}"},"OSM-india-twitter":{name:"OpenStreetMap India Twitter",description:"We are just a tweet away: {url}"},"osm-india-website":{name:"OpenStreetMap India",description:"Mappers and OpenStreetMap users in India"},"osm-india-wiki":{name:"OpenStreetMap Wikiproject India",description:"Everything you need to know about mapping in India: {url}"},"osm-india-youtube":{name:"OpenStreetMap India Youtube",description:"Subscribe to our channel: {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-Puducherry-Mailing-List":{name:"Free Software Hardware Movement - Mailing List",description:"FSHM Puducherry mailing list to discuss mapping in Puducherry and other things.",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap."},"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-iran-aparat":{name:"OpenStreetMap Iran Aparat",description:"Subscribe to our channel at {url}",extendedDescription:"A good resource of videos about anything related to OpenStreetMap. Mainly in Persian."},"osm-iran-forum":{name:"OpenStreetMap Iran web forum",description:"OpenStreetMap Iran web forum",extendedDescription:"A web forum for OpenStreetMap users in Iran. Feel free to ask questions and discuss with others!"},"osm-iran-telegram":{name:"OpenStreetMap Iran Telegram",description:"You're welcome to join our Telegram channel at {url}. We also have a supergroup of many OSMers interested in Iran. Find its link in bio of channel."},"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-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-Asia-mailinglist":{name:"OpenStreetMap Asia Mailinglist",description:"Talk-asia is the official Mailinglist for Asian Community"},"osm-asia-telegram":{name:"OpenStreetMap Asia Telegram",description:"Join our family: {url}"},"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-south-korea-telegram":{name:"OSM South Korea Telegram",description:"Unofficial Channnel for OpenStreetMap contributors, communities, and users in South Korea to share and discuss."},"OSM-sri-lanka-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-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"},"kosovo-telegram":{name:"OpenStreetMap Kosovo on Telegram",description:"Semi-official all-Kosovo Telegram public group. We welcome all mappers from anywhere in any language."},"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"},"no-telegram":{name:"@OSM_no on Telegram",description:"OpenStreetMap Norway Telegram chat"},"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."},"MaptimeHRVA-twitter":{name:"MaptimeHRVA Twitter",description:"Follow us on Twitter at {url}"},"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-Discord":{name:"OpenStreetMap Discord",description:"Get in touch with other mappers via Discord"},"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-IRC":{name:"OpenStreetMap IRC",description:"Join #osm on irc.oftc.net (port 6667)"},"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"}}}}};
25804
25805   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]]]}},asia_full:{type:"Feature",id:"asia_full",properties:{},geometry:{type:"Polygon",coordinates:[[[51,13.5],[43.5,12.3],[34.25,27.3],[34.9,29.45],[34,31.9],[27,34.7],[25.1,39],[25.6,40.2],[26.33,40.98],[26.33,41.23],[26.63,41.36],[26.58,41.6],[26.32,41.76],[27.2,42.1],[27.55,41.93],[35,43],[38.3,47.6],[38.7,47.7],[38.86,47.86],[39.74,47.82],[40.1,49.6],[38,50],[37.4,50.4],[36.65,50.25],[35.66,50.35],[35.2,51.1],[34.28,51.27],[34.1,51.7],[34.4,51.73],[33.9,52.35],[31.8,52.05],[31.3,53.1],[32.8,53.3],[30.77,54.78],[30.95,55.61],[28.19,56.13],[27.83,57.29],[27.33,57.53],[27.7,57.9],[27.3,58.7],[28.2,59.37],[27.2,60.2],[31.5,62.6],[29,67],[30,67.66],[28.27,68.6],[31,70],[31,90],[180,90],[180,60],[130,7],[130,-0.5],[131.8,-3.5],[132.3,-8],[128,-11.3],[65,-11.3],[51,13.5]]]}},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_andhrapradesh:{type:"Feature",id:"india_andhrapradesh",properties:{},geometry:{type:"Polygon",coordinates:[[[76.76365,14.98503],[76.78952,15.01589],[76.77614,15.05336],[76.80034,15.09466],[76.86072,15.05669],[76.87678,15.02859],[76.94279,15.02725],[76.98159,15.0103],[77.00077,15.02948],[77.04671,15.02904],[77.07882,15.00004],[77.1096,15.02859],[77.12744,15.09371],[77.14751,15.10753],[77.16873,15.17462],[77.14554,15.22413],[77.15223,15.29148],[77.12118,15.29418],[77.11387,15.3334],[77.07705,15.32577],[77.0421,15.36103],[77.027,15.44075],[76.97414,15.50807],[77.02697,15.5037],[77.03509,15.63815],[77.08728,15.65733],[77.08192,15.69524],[77.05293,15.72914],[77.05561,15.82458],[77.03333,15.85326],[77.07659,15.90991],[77.14448,15.94265],[77.2479,15.96378],[77.3564,15.95008],[77.42745,15.94836],[77.46652,15.93453],[77.61152,15.91691],[77.6536,15.88393],[77.72205,15.89199],[77.80554,15.87083],[77.8616,15.88138],[77.89376,15.90154],[78.00803,15.86506],[78.03641,15.90188],[78.06997,15.85048],[78.10755,15.83401],[78.17153,15.85511],[78.17371,15.89569],[78.20995,15.9197],[78.2507,15.96993],[78.2682,16.02857],[78.29785,16.01169],[78.40727,16.0756],[78.45394,16.07503],[78.55814,16.04517],[78.59917,16.08361],[78.64311,16.08312],[78.68277,16.03346],[78.73718,16.0097],[78.78267,16.02125],[78.8419,16.08707],[78.83228,16.13919],[78.87606,16.13902],[78.88876,16.0879],[78.92138,16.10307],[78.9049,16.17711],[78.92807,16.19871],[78.98352,16.21074],[79.01236,16.24173],[79.09802,16.2236],[79.12305,16.23187],[79.1593,16.20893],[79.22111,16.23251],[79.23438,16.32518],[79.21143,16.35493],[79.21112,16.44396],[79.22091,16.51631],[79.25265,16.57381],[79.37802,16.58412],[79.41773,16.57986],[79.44409,16.61796],[79.49421,16.63408],[79.53884,16.63046],[79.60613,16.67239],[79.63566,16.6594],[79.68544,16.69755],[79.72286,16.68966],[79.74673,16.72106],[79.79256,16.72485],[79.81796,16.69098],[79.84286,16.70561],[79.88555,16.68642],[79.90723,16.63408],[79.95306,16.63621],[80.00576,16.70857],[80.05536,16.74833],[80.07093,16.81323],[80.0332,16.85233],[79.99173,16.86303],[80.04569,16.96517],[80.08405,16.96339],[80.134,16.98524],[80.18217,17.04501],[80.19555,17.01825],[80.26201,17.01066],[80.28877,16.97677],[80.31553,16.91254],[80.3191,16.87106],[80.35879,16.85501],[80.37306,16.8113],[80.41856,16.84252],[80.45647,16.78989],[80.56262,16.76268],[80.6041,16.78766],[80.55593,16.81843],[80.56485,16.86883],[80.59027,16.91165],[80.53184,16.95001],[80.44264,16.9451],[80.35835,16.97052],[80.38778,17.0071],[80.36682,17.0566],[80.39001,17.07623],[80.42034,17.02494],[80.48234,17.05036],[80.49616,17.10789],[80.56039,17.13822],[80.68393,17.06865],[80.82309,17.03787],[80.85877,17.05081],[80.87714,17.10478],[80.88011,17.1644],[80.91689,17.15439],[80.91892,17.22003],[80.99838,17.19012],[81.03576,17.19196],[81.05653,17.22041],[81.16295,17.23278],[81.18035,17.25463],[81.17053,17.29656],[81.19016,17.32733],[81.26732,17.3202],[81.31385,17.37576],[81.24132,17.40667],[81.22725,17.43762],[81.17746,17.45203],[81.15755,17.47938],[81.11343,17.49477],[81.08374,17.45957],[81.01198,17.49248],[80.99962,17.53013],[80.95671,17.58749],[80.85431,17.59347],[80.86444,17.62914],[80.90266,17.63912],[80.90684,17.67993],[80.89153,17.74125],[80.94636,17.76025],[81.03556,17.74495],[81.07481,17.76038],[81.08891,17.81081],[81.15938,17.85273],[81.19194,17.84694],[81.25394,17.81215],[81.40915,17.80501],[81.47025,17.8233],[81.48096,17.80278],[81.5541,17.81616],[81.61119,17.81527],[81.66293,17.87682],[81.70307,17.86121],[81.78246,17.90982],[81.80119,17.93614],[81.89932,17.9687],[82.0019,18.02356],[82.03316,18.06597],[82.08072,18.07378],[82.14091,18.0439],[82.17228,18.04993],[82.25028,17.9883],[82.27583,17.995],[82.2667,18.04332],[82.29628,18.06899],[82.34354,18.07485],[82.33329,18.1422],[82.30608,18.19572],[82.33284,18.21579],[82.33685,18.26619],[82.37209,18.27421],[82.39305,18.30633],[82.33462,18.31703],[82.38458,18.36922],[82.36138,18.4098],[82.43513,18.48477],[82.48969,18.52285],[82.53139,18.51177],[82.54422,18.41638],[82.60918,18.37427],[82.59758,18.26516],[82.64005,18.23708],[82.67329,18.29908],[82.70644,18.30476],[82.77538,18.33958],[82.79251,18.36262],[82.78448,18.42803],[82.80742,18.44772],[82.89919,18.40074],[82.91103,18.36453],[82.98471,18.36362],[83.0002,18.38368],[83.04775,18.37883],[83.07472,18.401],[83.04552,18.44345],[83.05997,18.48603],[83.09665,18.54123],[83.05931,18.54334],[83.0336,18.57266],[83.05776,18.62215],[83.09414,18.63021],[83.15495,18.70089],[83.23099,18.75616],[83.27407,18.76523],[83.28745,18.79777],[83.36791,18.81557],[83.40661,18.84174],[83.39569,18.87914],[83.35554,18.92896],[83.36892,18.96132],[83.32119,18.97447],[83.3428,19.01449],[83.41665,19.00408],[83.45049,18.95576],[83.48237,19.00825],[83.46716,19.07746],[83.51314,19.07262],[83.52143,19.03271],[83.61209,19.10076],[83.62679,19.14969],[83.69206,19.05202],[83.71342,18.99346],[83.73398,18.98382],[83.79596,19.01607],[83.84255,18.9178],[83.85136,18.86003],[83.87788,18.82716],[84.05557,18.79246],[84.0894,18.75373],[84.16689,18.78415],[84.22422,18.79642],[84.2535,18.78262],[84.2914,18.8],[84.33966,18.80123],[84.39349,18.89211],[84.43671,18.92277],[84.42292,18.94711],[84.47894,18.99017],[84.51711,19.04634],[84.62687,19.08543],[84.61653,19.12624],[84.66828,19.13065],[84.6721,19.16552],[84.71352,19.1524],[84.70468,19.11772],[84.76857,19.08003],[85.15481,18.87834],[85.14492,18.85295],[85.05442,18.77126],[85.01176,18.69225],[84.94947,18.67649],[84.44354,18.21885],[83.98107,17.79763],[83.77893,17.63361],[83.20925,17.15734],[82.8246,16.92714],[82.20846,16.16914],[81.78413,16.05362],[81.60171,16.04774],[80.84225,15.52037],[80.65306,15.4875],[80.54735,15.42991],[80.4922,15.34128],[80.47381,15.25261],[80.48624,15.06582],[80.49835,15.0251],[80.66968,13.56514],[80.26863,13.56255],[80.24181,13.46797],[80.22545,13.48346],[80.14774,13.49443],[80.08045,13.49111],[80.08,13.52565],[80.00213,13.53964],[80.01841,13.50074],[79.97441,13.46419],[79.96622,13.38714],[79.93821,13.34898],[79.86379,13.31632],[79.8129,13.31712],[79.79245,13.29487],[79.73437,13.27843],[79.79598,13.24103],[79.75102,13.21106],[79.68369,13.24845],[79.68102,13.29448],[79.57781,13.26176],[79.54809,13.32329],[79.42941,13.33391],[79.41957,13.24971],[79.43293,13.1966],[79.39666,13.19679],[79.36005,13.17504],[79.36244,13.13752],[79.31106,13.1268],[79.28351,13.14994],[79.23853,13.1464],[79.20549,13.10147],[79.16498,13.01908],[79.06532,13.04951],[78.99361,13.08754],[78.95768,13.07478],[78.81243,13.08649],[78.75104,13.05634],[78.71387,13.06691],[78.70525,13.01518],[78.6625,13.02861],[78.63167,12.98455],[78.63629,12.92494],[78.60313,12.84933],[78.59178,12.77804],[78.55737,12.73938],[78.55312,12.69582],[78.50595,12.74103],[78.50517,12.68031],[78.46933,12.67292],[78.47136,12.62811],[78.3799,12.62235],[78.30177,12.66322],[78.27563,12.70205],[78.23857,12.6994],[78.23025,12.75702],[78.2528,12.82236],[78.25198,12.85741],[78.31411,12.85733],[78.32741,12.90272],[78.35638,12.93819],[78.38944,12.90542],[78.41213,12.94302],[78.46924,12.97546],[78.46092,13.03126],[78.5219,13.06638],[78.54509,13.11098],[78.57956,13.21461],[78.57797,13.28201],[78.51185,13.28722],[78.44649,13.30825],[78.43949,13.327],[78.36546,13.36503],[78.38151,13.40071],[78.37259,13.46181],[78.38241,13.52477],[78.40574,13.57659],[78.39268,13.5915],[78.32632,13.59445],[78.25894,13.58461],[78.20436,13.60369],[78.16645,13.65721],[78.11784,13.65587],[78.12295,13.71405],[78.09423,13.74251],[78.12795,13.78565],[78.11441,13.8625],[78.04999,13.89494],[78.04642,13.86104],[78.00476,13.87355],[77.95566,13.82664],[77.95098,13.88825],[77.98752,13.89784],[77.97015,13.95827],[77.92868,13.90698],[77.89567,13.93954],[77.83858,13.93508],[77.81494,13.91679],[77.83635,13.86863],[77.79261,13.8211],[77.6267,13.76984],[77.53033,13.69514],[77.45805,13.68671],[77.47014,13.7502],[77.45855,13.79212],[77.41662,13.80595],[77.43223,13.84163],[77.32787,13.83226],[77.31449,13.86393],[77.25829,13.84609],[77.21904,13.86794],[77.18236,13.8682],[77.15308,13.84278],[77.18088,13.78098],[77.17444,13.76135],[77.10308,13.76759],[77.06516,13.74405],[77.0277,13.77651],[77.00003,13.74482],[76.97723,13.81547],[77.01323,13.85558],[77.04239,13.9332],[76.99574,13.96114],[77.00108,13.98729],[76.93324,14.03009],[76.97878,14.07002],[76.89779,14.16518],[76.96469,14.18169],[77.02696,14.17477],[77.02154,14.13052],[77.03389,14.05587],[77.13014,14.04533],[77.1441,14.00245],[77.28518,14.01342],[77.31997,14.03126],[77.3503,13.95767],[77.35476,13.90325],[77.39713,13.90415],[77.42702,13.98353],[77.39,14.01386],[77.33291,14.02947],[77.40204,14.1102],[77.38331,14.13607],[77.39624,14.17175],[77.51711,14.17844],[77.49659,14.23419],[77.50284,14.27834],[77.45021,14.28414],[77.44887,14.31625],[77.37617,14.33081],[77.38984,14.26937],[77.28608,14.2828],[77.28786,14.33766],[77.23835,14.31759],[77.1661,14.34301],[77.13845,14.33721],[77.11838,14.29395],[77.11539,14.22104],[77.0818,14.2159],[77.05638,14.24623],[76.9426,14.2444],[76.92967,14.27651],[76.94748,14.31179],[76.9038,14.32379],[76.88373,14.35055],[76.88774,14.3947],[76.97828,14.48256],[76.91138,14.48836],[76.87481,14.47275],[76.83244,14.52761],[76.80434,14.53207],[76.76554,14.60075],[76.77639,14.68002],[76.80359,14.7398],[76.78371,14.78455],[76.83756,14.78968],[76.86771,14.96792],[76.76736,14.97267],[76.76365,14.98503]]]}},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_karnataka:{type:"Feature",id:"india_karnataka",properties:{},geometry:{type:"Polygon",coordinates:[[[73.87267,14.75312],[74.17989,14.95708],[74.2532,14.95804],[74.29821,15.04123],[74.31574,15.18805],[74.27607,15.27727],[74.32187,15.34414],[74.28027,15.38891],[74.27464,15.54999],[74.24074,15.66684],[74.11652,15.65308],[74.16212,15.75075],[74.28923,15.73953],[74.36893,15.78648],[74.34579,15.84959],[74.43203,15.95338],[74.46484,16.0421],[74.37226,16.07692],[74.48045,16.14527],[74.50509,16.22265],[74.31843,16.32588],[74.33806,16.40125],[74.26427,16.53936],[74.33986,16.54825],[74.54427,16.63407],[74.6313,16.57831],[74.68877,16.71489],[74.91203,16.7883],[74.99259,16.95146],[75.09075,16.95064],[75.18186,16.84374],[75.26705,16.86247],[75.28311,16.95524],[75.46783,16.98524],[75.51065,16.94733],[75.66898,16.97766],[75.67389,17.11369],[75.62834,17.18928],[75.65739,17.27069],[75.58469,17.34963],[75.63468,17.47651],[75.77995,17.37683],[75.89432,17.40292],[75.93159,17.32197],[76.11996,17.37007],[76.22917,17.36301],[76.38171,17.31172],[76.37153,17.4341],[76.33086,17.46872],[76.41561,17.60431],[76.48659,17.66155],[76.48652,17.71358],[76.56488,17.76523],[76.66314,17.68771],[76.8094,17.8693],[76.92164,17.94103],[76.9513,18.05843],[76.92422,18.14531],[77.14325,18.20848],[77.20119,18.27828],[77.24726,18.41311],[77.31257,18.43674],[77.41407,18.39352],[77.3672,18.30846],[77.46332,18.26219],[77.57345,18.24294],[77.59821,18.0861],[77.64737,17.99934],[77.6208,17.9031],[77.5709,17.86625],[77.53999,17.72825],[77.45138,17.69052],[77.44541,17.58272],[77.6912,17.50865],[77.53911,17.44295],[77.52471,17.36431],[77.45747,17.34038],[77.3772,17.14285],[77.46328,17.11129],[77.50069,17.01255],[77.45223,16.91995],[77.47617,16.7804],[77.46008,16.61106],[77.37653,16.48644],[77.25617,16.47308],[77.28927,16.408],[77.41673,16.36775],[77.52418,16.3753],[77.59655,16.31743],[77.49303,16.25534],[77.51178,15.92828],[77.2479,15.96378],[77.07659,15.90991],[77.03509,15.63815],[77.027,15.44075],[77.0421,15.36103],[77.15223,15.29148],[77.16873,15.17462],[77.1096,15.02859],[76.98159,15.0103],[76.87678,15.02859],[76.80034,15.09466],[76.76736,14.97267],[76.86771,14.96792],[76.83756,14.78968],[76.77639,14.68002],[76.76554,14.60075],[76.87481,14.47275],[76.88373,14.35055],[76.94748,14.31179],[76.9426,14.2444],[77.05638,14.24623],[77.1661,14.34301],[77.28608,14.2828],[77.38984,14.26937],[77.44887,14.31625],[77.50284,14.27834],[77.51711,14.17844],[77.39624,14.17175],[77.40204,14.1102],[77.33291,14.02947],[77.42702,13.98353],[77.35476,13.90325],[77.31997,14.03126],[77.1441,14.00245],[77.03389,14.05587],[77.02696,14.17477],[76.89779,14.16518],[76.97878,14.07002],[76.93324,14.03009],[77.04239,13.9332],[76.97723,13.81547],[77.06516,13.74405],[77.17444,13.76135],[77.18236,13.8682],[77.32787,13.83226],[77.43223,13.84163],[77.47014,13.7502],[77.53033,13.69514],[77.6267,13.76984],[77.79261,13.8211],[77.89567,13.93954],[77.95098,13.88825],[78.04999,13.89494],[78.11441,13.8625],[78.11784,13.65587],[78.20436,13.60369],[78.40574,13.57659],[78.37068,13.46984],[78.40217,13.31113],[78.58854,13.26912],[78.5219,13.06638],[78.46924,12.97546],[78.35684,12.94022],[78.31447,12.8595],[78.25248,12.85994],[78.23196,12.76495],[78.08636,12.80344],[77.99036,12.80553],[77.93327,12.8876],[77.81099,12.8303],[77.74108,12.67162],[77.60006,12.6661],[77.58743,12.51473],[77.63575,12.48605],[77.61553,12.36799],[77.52722,12.27746],[77.51993,12.19264],[77.60853,12.20409],[77.73432,12.17555],[77.77447,12.12033],[77.67932,11.97287],[77.60217,11.93627],[77.49513,11.94251],[77.42332,11.77259],[77.29576,11.80871],[77.11315,11.77337],[77.01458,11.81306],[76.90977,11.79343],[76.8262,11.60485],[76.56305,11.62046],[76.51399,11.70565],[76.41621,11.67255],[76.20482,11.86247],[76.1155,11.8579],[76.11204,11.97862],[76.00455,11.93123],[75.86924,11.95161],[75.79654,12.0533],[75.63883,12.14712],[75.5804,12.1556],[75.4863,12.29074],[75.43456,12.29653],[75.37427,12.46113],[75.22345,12.56714],[75.1619,12.66883],[75.06067,12.66842],[75.00958,12.79255],[74.8591,12.76032],[74.64061,12.65899],[74.51827,12.99543],[74.32397,13.82179],[73.87267,14.75312]]]}},india_kerala:{type:"Feature",id:"india_kerala",properties:{},geometry:{type:"Polygon",coordinates:[[[74.64061,12.65899],[74.8591,12.76032],[74.88399,12.75347],[74.95843,12.78474],[75.00958,12.79255],[74.99766,12.73819],[75.05297,12.71899],[75.06067,12.66842],[75.11342,12.67842],[75.1619,12.66883],[75.14362,12.63805],[75.18287,12.63181],[75.22345,12.56714],[75.23683,12.56625],[75.28071,12.61847],[75.29121,12.59649],[75.27114,12.55367],[75.28095,12.51799],[75.33492,12.49034],[75.3573,12.46234],[75.39003,12.49736],[75.41661,12.49293],[75.4241,12.46603],[75.39599,12.45143],[75.37427,12.46113],[75.36747,12.41202],[75.38331,12.39011],[75.42333,12.37233],[75.41374,12.34763],[75.43456,12.29653],[75.4863,12.29074],[75.51484,12.25818],[75.53759,12.20064],[75.5804,12.1556],[75.63883,12.14712],[75.66604,12.09583],[75.68727,12.10816],[75.73047,12.07283],[75.75506,12.08318],[75.79833,12.08006],[75.79654,12.0533],[75.82391,12.01308],[75.82999,11.98372],[75.86924,11.95161],[76.00455,11.93123],[76.03621,11.9406],[76.07903,11.96914],[76.11204,11.97862],[76.1155,11.8579],[76.15528,11.87128],[76.20482,11.86247],[76.22662,11.80542],[76.27964,11.81018],[76.30774,11.78297],[76.31799,11.75041],[76.34252,11.73748],[76.41129,11.75913],[76.42399,11.72006],[76.40338,11.70748],[76.41621,11.67255],[76.44345,11.63744],[76.42497,11.62329],[76.37992,11.6224],[76.37056,11.59341],[76.29786,11.56442],[76.2711,11.59296],[76.2256,11.56442],[76.24255,11.52874],[76.24478,11.49439],[76.32105,11.44489],[76.33354,11.45871],[76.39063,11.42794],[76.44861,11.38155],[76.53826,11.35167],[76.54532,11.30094],[76.52349,11.27236],[76.45271,11.23905],[76.44934,11.20462],[76.51048,11.21163],[76.53385,11.19671],[76.60091,11.20654],[76.62971,11.19413],[76.69784,11.23906],[76.72537,11.22534],[76.72765,11.19388],[76.69301,11.17193],[76.69124,11.14472],[76.73852,11.12108],[76.74788,11.07514],[76.73718,11.04749],[76.69507,11.02252],[76.68644,10.98934],[76.66047,10.96052],[76.64932,10.92395],[76.73272,10.88113],[76.77286,10.88158],[76.81746,10.86195],[76.85983,10.79996],[76.88838,10.79996],[76.8973,10.77096],[76.875,10.70674],[76.85537,10.67507],[76.87277,10.62958],[76.80497,10.62646],[76.80854,10.59434],[76.82995,10.58498],[76.81746,10.43869],[76.8072,10.41505],[76.83932,10.35974],[76.82944,10.30749],[76.9018,10.26001],[76.90974,10.23668],[76.93976,10.23927],[76.98194,10.22077],[77.04075,10.25298],[77.06496,10.29751],[77.11964,10.31782],[77.17683,10.35777],[77.23655,10.35242],[77.21441,10.30577],[77.25054,10.25359],[77.25544,10.22549],[77.28042,10.20721],[77.26769,10.12222],[77.23784,10.12768],[77.20426,10.11207],[77.21976,10.07801],[77.26184,10.03015],[77.25908,9.9945],[77.27231,9.96404],[77.24834,9.95177],[77.21305,9.87549],[77.23646,9.85946],[77.22277,9.82317],[77.24656,9.80841],[77.20553,9.69439],[77.17963,9.65641],[77.16816,9.61495],[77.21264,9.60207],[77.23711,9.58089],[77.27684,9.57498],[77.3042,9.59951],[77.36511,9.54996],[77.3997,9.49683],[77.39331,9.45986],[77.36661,9.46037],[77.33693,9.40901],[77.33713,9.36507],[77.32506,9.33664],[77.28329,9.30039],[77.28844,9.27469],[77.26509,9.18184],[77.26714,9.15394],[77.24693,9.12483],[77.21199,9.101],[77.18667,9.04329],[77.16025,9.03584],[77.14986,9.01008],[77.17354,8.99121],[77.19759,8.95104],[77.19567,8.9236],[77.2559,8.8781],[77.25798,8.83758],[77.2292,8.78679],[77.19607,8.74588],[77.17517,8.73703],[77.20586,8.68645],[77.21552,8.64836],[77.27872,8.56521],[77.26344,8.50713],[77.20618,8.47859],[77.22506,8.44602],[77.18854,8.43476],[77.15375,8.37722],[77.14974,8.32192],[77.12209,8.32281],[77.09077,8.2973],[76.92132,8.09605],[76.6728,8.34299],[76.46487,8.59279],[76.22556,8.95652],[75.91159,10.04616],[75.68288,10.55908],[75.58764,10.89204],[75.55244,11.04304],[75.25797,11.51227],[75.53645,11.69255],[75.53089,11.70357],[75.25113,11.52458],[74.97117,11.94518],[74.71236,12.49398],[74.64061,12.65899]]]}},india_maharashtra:{type:"Feature",id:"india_maharashtra",properties:{name:"Maharashtra"},geometry:{type:"Polygon",coordinates:[[[72.53789,20.1498],[72.80202,20.12516],[72.87472,20.22596],[72.97061,20.21213],[72.97329,20.13096],[73.18604,20.05291],[73.29353,20.15371],[73.31137,20.20723],[73.43,20.20634],[73.41484,20.38162],[73.47594,20.49491],[73.51787,20.67019],[73.62224,20.62514],[73.63428,20.58232],[73.74801,20.56716],[73.84658,20.62336],[73.88538,20.72951],[73.93846,20.76073],[73.94515,20.84012],[73.79279,21.06787],[73.68111,21.15233],[73.82249,21.17195],[73.83231,21.2674],[73.94827,21.29773],[73.96879,21.39228],[74.10883,21.44803],[74.30776,21.48014],[74.2917,21.55864],[73.97926,21.54124],[73.86085,21.49576],[73.82294,21.60057],[73.88583,21.64517],[73.89029,21.71073],[73.83231,21.81064],[74.04684,21.92259],[74.14585,21.95425],[74.28991,21.93597],[74.38848,22.02026],[74.52764,21.90876],[74.50578,21.78254],[74.59053,21.66435],[74.83048,21.61038],[74.86438,21.63402],[75.05795,21.56489],[75.11504,21.45963],[75.21985,21.41101],[75.38443,21.38559],[75.46828,21.39406],[75.83267,21.38336],[75.95934,21.39629],[76.05255,21.35259],[76.09849,21.37399],[76.15915,21.25892],[76.16851,21.08587],[76.3826,21.07963],[76.45262,21.11486],[76.48741,21.19604],[76.61676,21.19871],[76.66091,21.28256],[76.62434,21.33519],[76.73227,21.40878],[76.79159,21.48996],[76.79516,21.59745],[76.90131,21.60101],[76.9972,21.68174],[77.1212,21.72545],[77.20728,21.69423],[77.27998,21.76113],[77.47756,21.77005],[77.57122,21.62688],[77.56721,21.52965],[77.45749,21.55641],[77.41869,21.52073],[77.48692,21.37756],[77.93873,21.38693],[78.16932,21.49843],[78.21526,21.55374],[78.3,21.58496],[78.41329,21.57782],[78.43024,21.50155],[78.50874,21.52831],[78.58501,21.48683],[78.932,21.48728],[78.91327,21.59254],[79.1278,21.62822],[79.22102,21.69646],[79.48862,21.67416],[79.50602,21.59031],[79.57604,21.54348],[79.73259,21.60235],[79.85703,21.53099],[80.06665,21.55686],[80.18842,21.63402],[80.26022,21.62019],[80.36905,21.52296],[80.41142,21.43822],[80.51936,21.3896],[80.63532,21.25],[80.45736,21.17284],[80.42391,21.0096],[80.46539,20.92709],[80.54166,20.93378],[80.54344,20.79195],[80.57823,20.67866],[80.50776,20.65458],[80.51177,20.585],[80.62239,20.60373],[80.58581,20.39544],[80.61659,20.32587],[80.38288,20.24157],[80.4141,20.19028],[80.54032,20.11],[80.54567,19.98734],[80.46048,19.82812],[80.66476,19.69075],[80.65673,19.61225],[80.82755,19.56274],[80.88553,19.50922],[80.84271,19.36605],[80.74905,19.28666],[80.67864,19.33089],[80.60751,19.31353],[80.58732,19.39674],[80.48071,19.3355],[80.39329,19.24591],[80.39154,19.1836],[80.3302,19.13746],[80.26929,18.94468],[80.35176,18.84592],[80.24684,18.70149],[80.10826,18.68928],[79.94712,18.78372],[79.95979,18.85795],[79.93945,19.0406],[79.85699,19.09508],[79.94349,19.16387],[79.92836,19.24777],[79.97469,19.38922],[79.92536,19.49855],[79.87599,19.5041],[79.75713,19.60733],[79.63608,19.57639],[79.60249,19.51309],[79.5317,19.55241],[79.42494,19.53529],[79.22736,19.61468],[79.22023,19.5286],[79.1725,19.46081],[79.08018,19.53261],[79.00213,19.54198],[78.89954,19.66954],[78.84245,19.65839],[78.82963,19.75513],[78.60098,19.81809],[78.48728,19.79375],[78.28109,19.90236],[78.3514,19.78327],[78.32909,19.71548],[78.26933,19.69184],[78.29475,19.60621],[78.29564,19.46794],[78.20778,19.43583],[78.16318,19.3551],[78.16675,19.2436],[78.03473,19.2436],[77.92412,19.3444],[77.84428,19.30426],[77.81484,19.13745],[77.74304,19.06118],[77.75106,18.98357],[77.83714,18.95414],[77.90751,18.8295],[77.83749,18.80764],[77.74829,18.60515],[77.65541,18.5316],[77.59709,18.54762],[77.54937,18.3875],[77.55171,18.29114],[77.46332,18.26219],[77.3672,18.30846],[77.41407,18.39352],[77.31257,18.43674],[77.2452,18.41278],[77.19913,18.27795],[77.14119,18.20815],[77.03495,18.18076],[76.95329,18.18881],[76.92422,18.14531],[76.9513,18.05843],[76.9075,18.00923],[76.92164,17.94103],[76.8094,17.8693],[76.66314,17.68771],[76.56488,17.76523],[76.48652,17.71358],[76.48659,17.66155],[76.41561,17.60431],[76.33086,17.46872],[76.37153,17.4341],[76.38171,17.31172],[76.22917,17.36301],[76.11996,17.37007],[75.93159,17.32197],[75.89432,17.40292],[75.77995,17.37683],[75.63468,17.47651],[75.58469,17.34963],[75.65739,17.27069],[75.62834,17.18928],[75.67389,17.11369],[75.66898,16.97766],[75.51065,16.94733],[75.46783,16.98524],[75.28311,16.95524],[75.26705,16.86247],[75.18186,16.84374],[75.09075,16.95064],[74.99259,16.95146],[74.96287,16.87942],[74.90306,16.86241],[74.91203,16.7883],[74.68877,16.71489],[74.6313,16.57831],[74.56843,16.55445],[74.54427,16.63407],[74.33986,16.54825],[74.26427,16.53936],[74.33806,16.40125],[74.31843,16.32588],[74.50509,16.22265],[74.48045,16.14527],[74.37226,16.07692],[74.46484,16.0421],[74.43203,15.95338],[74.34579,15.84959],[74.36893,15.78648],[74.28923,15.73953],[74.16212,15.75075],[74.11652,15.65308],[74.02811,15.60433],[73.97592,15.62887],[73.94515,15.74126],[73.88226,15.74929],[73.68072,15.72057],[73.32871,15.60794],[72.98859,16.57559],[72.71294,17.97077],[72.60935,19.26366],[72.53789,20.1498]]]}},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]]]}},india_tamilnadu:{type:"Feature",id:"india_tamilnadu",properties:{},geometry:{type:"Polygon",coordinates:[[[76.23882,11.52666],[76.42497,11.62329],[76.48321,11.69182],[76.56305,11.62046],[76.8262,11.60485],[76.90977,11.79343],[77.01458,11.81306],[77.11315,11.77337],[77.29576,11.80871],[77.33679,11.76902],[77.42332,11.77259],[77.49513,11.94251],[77.60217,11.93627],[77.67932,11.97287],[77.77447,12.12033],[77.73432,12.17555],[77.60853,12.20409],[77.51993,12.19264],[77.52722,12.27746],[77.61553,12.36799],[77.63575,12.48605],[77.58743,12.51473],[77.60006,12.6661],[77.74108,12.67162],[77.79267,12.74643],[77.81099,12.8303],[77.93327,12.8876],[77.99036,12.80553],[78.08636,12.80344],[78.23196,12.76495],[78.2273,12.71513],[78.36824,12.61165],[78.54754,12.68569],[78.62559,12.9194],[78.61355,12.97872],[78.70231,13.05633],[78.80801,13.07774],[78.97973,13.0764],[79.15278,13.00727],[79.1889,13.08443],[79.25625,13.13661],[79.34679,13.13482],[79.45292,13.33852],[79.53513,13.33423],[79.58006,13.24544],[79.68442,13.25659],[79.92572,13.33598],[79.96184,13.45149],[80.06933,13.53757],[80.15229,13.4787],[80.25978,13.44748],[80.68273,13.45353],[80.58546,12.88895],[80.57389,12.78634],[80.43092,12.33305],[80.32877,12.14],[80.20563,11.84284],[79.85031,11.95606],[79.74742,12.0054],[79.69629,11.95142],[79.76493,11.85315],[80.17499,11.74816],[80.13891,11.5158],[80.22104,11.03359],[80.22222,10.98402],[79.85413,10.97539],[79.73705,10.98906],[79.70405,10.91904],[79.85166,10.82788],[80.22599,10.82479],[80.03964,10.09642],[79.66744,9.97318],[79.55982,9.92323],[79.37812,9.6665],[79.42037,9.35343],[79.56652,9.25796],[79.57134,9.08722],[79.49634,8.89762],[79.37403,8.97879],[79.06914,9.02225],[78.73928,8.93257],[78.54484,8.84743],[78.46298,8.3509],[78.36123,8.16045],[78.10363,8.04096],[77.66766,7.85864],[76.92132,8.09605],[77.09077,8.2973],[77.14974,8.32192],[77.20618,8.47859],[77.27872,8.56521],[77.21552,8.64836],[77.19607,8.74588],[77.25798,8.83758],[77.14986,9.01008],[77.26714,9.15394],[77.28844,9.27469],[77.33693,9.40901],[77.3997,9.49683],[77.3042,9.59951],[77.27684,9.57498],[77.16816,9.61495],[77.24656,9.80841],[77.21305,9.87549],[77.26184,10.03015],[77.28042,10.20721],[77.17683,10.35777],[77.06496,10.29751],[76.98194,10.22077],[76.82944,10.30749],[76.81746,10.43869],[76.82995,10.58498],[76.8973,10.77096],[76.81746,10.86195],[76.64932,10.92395],[76.73718,11.04749],[76.72765,11.19388],[76.44934,11.20462],[76.52349,11.27236],[76.53826,11.35167],[76.39063,11.42794],[76.25772,11.47343],[76.23882,11.52666]]]}},india_telengana:{type:"Feature",id:"india_telengana",properties:{},geometry:{type:"Polygon",coordinates:[[[77.23521,16.47123],[77.29413,16.47453],[77.37516,16.48768],[77.37501,16.50885],[77.41861,16.51735],[77.42586,16.57007],[77.46147,16.58589],[77.45871,16.61229],[77.47627,16.64839],[77.43775,16.64241],[77.42132,16.66752],[77.46657,16.6772],[77.47337,16.71709],[77.42692,16.72829],[77.44309,16.76259],[77.4748,16.78164],[77.45754,16.82843],[77.46322,16.84476],[77.45223,16.91995],[77.48061,16.97751],[77.478,17.00152],[77.50069,17.01255],[77.49527,17.04601],[77.46328,17.11129],[77.40575,17.12751],[77.3772,17.14285],[77.36157,17.16669],[77.37179,17.19944],[77.39294,17.1981],[77.40662,17.2372],[77.45894,17.28058],[77.43826,17.29144],[77.45747,17.34038],[77.45274,17.37335],[77.50349,17.35735],[77.52471,17.36431],[77.53972,17.40645],[77.53911,17.44295],[77.57779,17.43051],[77.60849,17.44332],[77.61732,17.47261],[77.65946,17.48011],[77.69188,17.47463],[77.6912,17.50865],[77.66304,17.5217],[77.59762,17.53374],[77.59603,17.56309],[77.55361,17.55007],[77.52751,17.57308],[77.49462,17.56675],[77.44541,17.58272],[77.45732,17.63263],[77.45138,17.69052],[77.49398,17.7153],[77.53999,17.72825],[77.56532,17.74838],[77.55654,17.76872],[77.50997,17.78724],[77.51604,17.80424],[77.55572,17.81934],[77.5709,17.86625],[77.6208,17.9031],[77.61974,17.93865],[77.65529,17.97047],[77.64737,17.99934],[77.5862,18.01459],[77.55377,18.03572],[77.54914,18.06475],[77.59821,18.0861],[77.59705,18.15205],[77.57179,18.19195],[77.58611,18.21875],[77.57345,18.24294],[77.60614,18.28059],[77.57018,18.29238],[77.56676,18.31792],[77.51948,18.34914],[77.54937,18.3875],[77.56007,18.43522],[77.59709,18.54762],[77.64035,18.55386],[77.65775,18.5271],[77.71216,18.55431],[77.73669,18.55476],[77.74829,18.60515],[77.72956,18.64262],[77.73268,18.67607],[77.74963,18.6899],[77.78664,18.6841],[77.83749,18.80764],[77.90751,18.8295],[77.90895,18.86137],[77.88264,18.86984],[77.86524,18.91043],[77.82421,18.9131],[77.83714,18.95414],[77.79611,18.95146],[77.80057,18.98447],[77.75106,18.98357],[77.74081,19.03041],[77.74304,19.06118],[77.77693,19.07322],[77.78942,19.10534],[77.83179,19.09195],[77.81484,19.13745],[77.84205,19.18294],[77.82822,19.19008],[77.85097,19.25743],[77.88398,19.25832],[77.88442,19.27928],[77.84562,19.28597],[77.84428,19.30426],[77.89602,19.31987],[77.92412,19.3444],[77.96916,19.31095],[78.00172,19.29846],[78.02938,19.27304],[78.03473,19.2436],[78.1101,19.24851],[78.1333,19.232],[78.16675,19.2436],[78.16675,19.28106],[78.18057,19.33369],[78.16318,19.3551],[78.17121,19.39747],[78.20778,19.43583],[78.23543,19.43182],[78.25684,19.4559],[78.29564,19.46794],[78.2787,19.5393],[78.29475,19.57365],[78.29475,19.60621],[78.27111,19.65661],[78.26933,19.69184],[78.29966,19.69273],[78.32909,19.71548],[78.3514,19.78327],[78.3224,19.84125],[78.2778,19.85151],[78.27921,19.88196],[78.3679,19.8814],[78.38128,19.83858],[78.41205,19.8252],[78.45978,19.81851],[78.47762,19.79531],[78.50973,19.82386],[78.5686,19.8136],[78.58734,19.8194],[78.67966,19.79175],[78.70018,19.769],[78.72203,19.78149],[78.76842,19.7806],[78.79116,19.76008],[78.82774,19.76097],[78.84691,19.69898],[78.84245,19.65839],[78.87457,19.65705],[78.89954,19.66954],[78.9379,19.66553],[78.95262,19.65125],[78.94637,19.61914],[78.97626,19.56384],[79.00213,19.54198],[79.03513,19.54733],[79.08018,19.53261],[79.08821,19.51477],[79.12389,19.50318],[79.1725,19.46081],[79.2064,19.46973],[79.19034,19.49381],[79.22023,19.5286],[79.23361,19.57945],[79.22736,19.61468],[79.35492,19.56339],[79.39729,19.53529],[79.42494,19.53529],[79.45394,19.49961],[79.4972,19.52013],[79.5317,19.55241],[79.55367,19.52413],[79.60249,19.51309],[79.61596,19.55941],[79.63608,19.57639],[79.71198,19.58528],[79.75713,19.60733],[79.81825,19.57293],[79.82378,19.55743],[79.87599,19.5041],[79.92536,19.49855],[79.97171,19.42013],[79.97469,19.38922],[79.94937,19.29163],[79.9293,19.24996],[79.92636,19.20252],[79.94349,19.16387],[79.88262,19.13295],[79.85699,19.09508],[79.8741,19.04152],[79.92544,19.05312],[79.93945,19.0406],[79.9397,18.98616],[79.95302,18.96934],[79.95979,18.85795],[79.91056,18.82565],[79.94712,18.78372],[79.99276,18.76905],[80.03276,18.74654],[80.10826,18.68928],[80.24684,18.70149],[80.27513,18.72272],[80.30656,18.68345],[80.33809,18.59903],[80.379,18.60937],[80.38851,18.5972],[80.45022,18.62656],[80.48858,18.62656],[80.514,18.61318],[80.53184,18.58598],[80.59562,18.54896],[80.63264,18.51863],[80.65093,18.47224],[80.6991,18.43612],[80.74281,18.32194],[80.74459,18.30231],[80.7883,18.24968],[80.73344,18.21891],[80.73478,18.17163],[80.79811,18.16628],[80.81774,18.18724],[80.81729,18.22515],[80.85922,18.22605],[80.84807,18.1975],[80.86189,18.13283],[80.9007,18.13461],[80.95422,18.16717],[80.9725,18.14353],[80.94931,18.12302],[80.94396,18.08109],[80.96225,18.03158],[80.98455,17.92276],[80.99436,17.91428],[81.00417,17.83846],[81.03227,17.78985],[81.07375,17.78628],[81.08891,17.81081],[81.15938,17.85273],[81.19194,17.84694],[81.25394,17.81215],[81.40915,17.80501],[81.47025,17.8233],[81.48096,17.80278],[81.5541,17.81616],[81.56882,17.82776],[81.61119,17.81527],[81.64286,17.83935],[81.66293,17.87682],[81.68835,17.88485],[81.70307,17.86121],[81.75838,17.89332],[81.79272,17.85273],[81.78246,17.83177],[81.72939,17.81928],[81.68478,17.77067],[81.62323,17.76264],[81.5764,17.72607],[81.57105,17.68771],[81.50281,17.59003],[81.52377,17.57264],[81.50147,17.53919],[81.49345,17.44865],[81.44171,17.38175],[81.41584,17.36168],[81.37168,17.35722],[81.32262,17.38933],[81.28917,17.33759],[81.26732,17.3202],[81.19016,17.32733],[81.17053,17.29656],[81.18035,17.25463],[81.16295,17.23278],[81.11835,17.22475],[81.02603,17.18684],[80.99124,17.1797],[80.93058,17.20513],[80.90516,17.20111],[80.91318,17.14581],[80.87037,17.14625],[80.8552,17.11146],[80.86412,17.09585],[80.85877,17.05081],[80.82309,17.03787],[80.72586,17.06463],[80.68393,17.06865],[80.65673,17.08782],[80.56039,17.13822],[80.51936,17.10834],[80.49616,17.10789],[80.48234,17.05036],[80.42034,17.02494],[80.39001,17.07623],[80.36682,17.0566],[80.38778,17.0071],[80.35835,16.97052],[80.44264,16.9451],[80.48769,16.91745],[80.49126,16.94822],[80.53184,16.95001],[80.59027,16.91165],[80.5867,16.87374],[80.56485,16.86883],[80.55593,16.81843],[80.6041,16.78766],[80.56262,16.76268],[80.51088,16.76982],[80.45647,16.78989],[80.45245,16.81531],[80.41856,16.84252],[80.37306,16.8113],[80.35879,16.85501],[80.3191,16.87106],[80.31553,16.91254],[80.28877,16.97677],[80.26201,17.01066],[80.23569,17.00219],[80.19555,17.01825],[80.18217,17.04501],[80.134,16.98524],[80.08405,16.96339],[80.04569,16.96517],[80.03722,16.93663],[80.00957,16.90719],[79.99173,16.86303],[80.0332,16.85233],[80.04168,16.82602],[80.07093,16.81323],[80.054,16.74194],[80.02722,16.71251],[80.00576,16.70857],[79.95306,16.63621],[79.90723,16.63408],[79.88555,16.68642],[79.84286,16.70561],[79.81796,16.69098],[79.79256,16.72485],[79.74673,16.72106],[79.72286,16.68966],[79.68544,16.69755],[79.6621,16.68835],[79.63566,16.6594],[79.60613,16.67239],[79.53884,16.63046],[79.49421,16.63408],[79.44409,16.61796],[79.41773,16.57986],[79.37802,16.58412],[79.31162,16.57554],[79.27926,16.5816],[79.24543,16.57009],[79.24388,16.53515],[79.22091,16.51631],[79.21526,16.4846],[79.23202,16.46035],[79.21112,16.44396],[79.21143,16.35493],[79.23438,16.32518],[79.22111,16.23251],[79.1593,16.20893],[79.12305,16.23187],[79.09802,16.2236],[79.05373,16.23827],[79.01236,16.24173],[78.98352,16.21074],[78.92807,16.19871],[78.9049,16.17711],[78.92481,16.13259],[78.92138,16.10307],[78.88876,16.0879],[78.87606,16.13902],[78.83228,16.13919],[78.8419,16.08707],[78.82164,16.05227],[78.78267,16.02125],[78.73718,16.0097],[78.68277,16.03346],[78.64311,16.08312],[78.59917,16.08361],[78.55814,16.04517],[78.45394,16.07503],[78.40727,16.0756],[78.36075,16.04605],[78.32341,16.033],[78.29785,16.01169],[78.2682,16.02857],[78.25445,16.01627],[78.2507,15.96993],[78.20995,15.9197],[78.17371,15.89569],[78.17153,15.85511],[78.13252,15.8549],[78.10755,15.83401],[78.06997,15.85048],[78.03641,15.90188],[78.00803,15.86506],[77.97903,15.87982],[77.93428,15.88216],[77.89376,15.90154],[77.8616,15.88138],[77.80554,15.87083],[77.72205,15.89199],[77.689,15.87914],[77.6536,15.88393],[77.61152,15.91691],[77.58504,15.91532],[77.51178,15.92828],[77.52058,15.95112],[77.51562,16.00803],[77.49612,16.03679],[77.50848,16.07885],[77.49242,16.12134],[77.48889,16.16443],[77.50036,16.1925],[77.49303,16.25534],[77.59655,16.31743],[77.58991,16.33381],[77.54011,16.35849],[77.52418,16.3753],[77.4865,16.38299],[77.41673,16.36775],[77.37791,16.38517],[77.35761,16.3815],[77.28927,16.408],[77.26056,16.45344],[77.23521,16.47123]]]}},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]]]}},iran:{type:"Feature",properties:{},id:"iran",geometry:{type:"Polygon",coordinates:[[[43.96643,39.42704],[44.36828,39.45104],[44.3518,39.57183],[44.62479,39.89048],[45.02746,39.54218],[45.50433,39.06259],[45.9613,38.92951],[46.50828,38.94537],[47.3236,39.44892],[48.00512,39.77374],[48.4411,39.3641],[48.19977,39.25565],[48.3728,39.10236],[48.30414,38.906],[48.10427,38.85269],[48.67649,38.48336],[49.32106,38.48734],[53.94287,37.48358],[54.43724,37.47487],[54.70691,37.69815],[55.26122,38.10864],[55.91695,38.16284],[56.239,38.26407],[57.28683,38.36073],[57.57896,37.98007],[58.01879,37.91821],[58.41395,37.7018],[58.72191,37.76204],[59.4218,37.59896],[59.63834,37.17964],[60.08422,37.11653],[60.37835,36.70792],[61.23424,36.72619],[61.37598,35.51361],[60.99608,34.29808],[60.63333,34.05914],[60.68847,33.68779],[61.01753,33.53868],[60.68833,33.11604],[60.98034,32.20735],[60.95577,31.5572],[61.7915,31.4486],[61.89696,31.1188],[61.90736,30.81546],[60.99448,29.85451],[61.42455,29.4109],[61.97206,28.63509],[62.8889,28.33884],[62.90715,27.31879],[63.29659,27.35528],[63.40209,27.17648],[63.2895,26.57212],[62.5891,26.47058],[62.29032,26.24108],[61.94822,26.12877],[61.62376,24.73837],[60.55845,24.98624],[58.03141,25.27164],[57.11051,25.5495],[56.54686,26.57238],[55.4988,26.01213],[55.28816,25.6474],[54.37853,25.61961],[53.90126,26.2239],[53.08217,26.52934],[51.26311,27.61327],[50.77328,28.14996],[50.48217,27.81479],[50.17456,27.78564],[49.93835,27.81965],[49.88342,27.975],[49.92187,28.18825],[50.33305,28.67232],[49.4197,29.70202],[48.58632,29.62242],[47.9928,30.44356],[47.98907,30.97004],[47.65869,30.98703],[47.65817,31.39276],[47.76361,31.76875],[47.30962,32.37144],[45.91075,33.02471],[46.06882,33.24741],[45.37024,33.9384],[45.40649,34.48845],[45.61523,34.74162],[45.84765,35.07793],[46.0613,35.21211],[45.91186,35.63945],[46.06018,35.76881],[45.75644,35.74371],[45.3092,35.9317],[45.19226,36.33283],[44.97802,36.46548],[44.95056,36.68605],[44.80224,36.7609],[44.83543,36.92589],[44.74731,37.02887],[44.71435,37.2828],[44.57153,37.38762],[44.51099,37.70537],[44.17537,37.86225],[44.29736,38.30899],[44.10461,39.10449],[43.93976,39.34825],[43.96643,39.42704]]]}},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]]]}},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]]]}},north_korea:{type:"Feature",id:"north_korea",properties:{},geometry:{type:"Polygon",coordinates:[[[125,37.2],[123.5,38.4],[124.38,40.12],[124.87,40.47],[126.05,40.95],[126.6,41.6],[126.9,41.8],[127.25,41.5],[128.2,41.4],[128.3,41.56],[128.04,42.03],[128.95,42.03],[129.35,42.44],[129.69,42.44],[129.88,43],[130.2,42.9],[130.3,42.66],[130.5,42.6],[130.7,42.3],[131,39],[128.33,38.61],[128.28,38.42],[128.08,38.32],[127.14,38.32],[126.99,38.21],[126.95,38.14],[126.88,38.1],[126.82,38],[126.67,37.95],[126.69,37.84],[126.667,37.828],[126.66,37.79],[126.585,37.76],[126.474,37.81],[126.42,37.845],[126.2,37.82],[126.18,37.74],[125,37.2]]]}},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]]]]}},south_korea:{type:"Feature",id:"south_korea",properties:{},geometry:{type:"Polygon",coordinates:[[[125,33],[125,37.2],[126.18,37.74],[126.2,37.82],[126.42,37.845],[126.474,37.81],[126.585,37.76],[126.66,37.79],[126.667,37.828],[126.69,37.84],[126.67,37.95],[126.82,38],[126.88,38.1],[126.95,38.14],[126.99,38.21],[127.14,38.32],[128.08,38.32],[128.28,38.42],[128.33,38.61],[131,39],[131.3,36.6],[127.3,33],[125,33]]]}},sri_lanka:{type:"Feature",id:"sri_lanka",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:"Polygon",coordinates:[[[18.55316,42.39709],[18.487,42.33],[16,42.2],[13,45],[13.48,45.55],[13.6,45.46],[13.67282,45.45244],[13.78445,45.47445],[13.87695,45.43477],[13.98354,45.46061],[13.95607,45.5049],[13.99868,45.52812],[14.07402,45.49231],[14.19361,45.48114],[14.23361,45.51383],[14.33098,45.47073],[14.4841,45.54339],[14.55276,45.65149],[15.16462,45.43061],[15.36301,45.48661],[15.28061,45.60731],[15.34584,45.65341],[15.24587,45.72718],[15.55939,45.85272],[15.68573,45.84315],[15.71043,46.04506],[15.61913,46.08657],[15.60059,46.16509],[15.67131,46.23068],[15.78049,46.21928],[15.79422,46.26439],[16.073,46.34266],[16.04759,46.3891],[16.15145,46.40378],[16.30028,46.38152],[16.24191,46.49508],[16.36894,46.55083],[16.66077,46.45725],[16.72462,46.39715],[16.86058,46.35783],[16.97456,46.22688],[17.17232,46.1551],[17.31102,45.97167],[17.58087,45.93874],[17.66574,45.84483],[17.86118,45.77993],[18.15765,45.79625],[18.43522,45.74655],[18.68019,45.91486],[18.77838,45.88666],[18.82507,45.91724],[18.9164,45.70714],[18.96652,45.66972],[18.89717,45.56551],[18.94817,45.54136],[19.01686,45.56369],[19.10858,45.5144],[19.08125,45.47585],[19.00341,45.48553],[18.99315,45.44969],[19.03735,45.40735],[18.9792,45.37883],[19.09424,45.3367],[19.10972,45.30469],[19.2687,45.24886],[19.42108,45.23622],[19.45198,45.16219],[19.2041,45.17236],[19.14345,45.119],[19.09331,45.13091],[19.08464,45.11852],[19.11231,45.08359],[19.1011,44.98811],[19.16343,44.94855],[19.06865,44.88961],[18.99843,44.89696],[19.01991,44.84386],[18.83764,44.84591],[18.75065,44.90197],[18.73803,44.94119],[18.75375,44.95245],[18.78491,44.94261],[18.77858,44.98426],[18.72157,44.98326],[18.66267,45.04785],[18.46602,45.05359],[18.41889,45.09637],[18.22841,45.09274],[18.2011,45.0684],[18.11746,45.06832],[18.0011,45.14282],[17.93745,45.09903],[17.93891,45.07086],[17.84756,45.03242],[17.66404,45.12204],[17.59713,45.09425],[17.16882,45.13674],[16.92275,45.23503],[16.81812,45.17296],[16.5105,45.20898],[16.46738,45.13326],[16.40374,45.10639],[16.36047,44.99622],[16.29175,44.9865],[16.11145,45.08758],[15.99747,45.21978],[15.81894,45.2072],[15.77283,45.16143],[15.80439,45.1121],[15.75505,45.05587],[15.78598,44.96966],[15.7338,44.9371],[15.78598,44.84029],[15.74818,44.81311],[15.82858,44.72686],[15.90458,44.75089],[16.14789,44.48088],[16.15253,44.38405],[16.39709,44.06983],[17.1476,43.49677],[17.22656,43.49776],[17.282,43.47769],[17.30151,43.4393],[17.26227,43.39108],[17.37488,43.2502],[17.44734,43.1998],[17.43805,43.18365],[17.63424,43.09863],[17.71339,42.97351],[17.53967,42.93531],[17.64267,42.88351],[17.67975,42.92174],[17.7903,42.89961],[17.80815,42.92073],[17.85896,42.89458],[17.90239,42.81647],[18.24898,42.61375],[18.3609,42.61526],[18.44437,42.56076],[18.43575,42.48273],[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]]]}},kosovo:{type:"Feature",id:"kosovo",properties:{},geometry:{type:"Polygon",coordinates:[[[20.68323,41.85101],[20.64878,41.8621],[20.62895,41.87788],[20.59321,41.87344],[20.5834,41.88906],[20.57131,41.92032],[20.61548,41.94279],[20.61932,41.97284],[20.60727,41.98358],[20.58959,42.03994],[20.56682,42.05515],[20.55,42.08081],[20.5618,42.12415],[20.51171,42.21912],[20.4557,42.26696],[20.40232,42.28017],[20.39286,42.29328],[20.35016,42.30573],[20.34327,42.32034],[20.32919,42.32272],[20.30564,42.30975],[20.28975,42.31841],[20.25651,42.31381],[20.23897,42.32339],[20.24172,42.33451],[20.23137,42.34709],[20.24041,42.36756],[20.20299,42.40034],[20.2216,42.42031],[20.18897,42.44976],[20.18995,42.46123],[20.16241,42.50248],[20.09905,42.52756],[20.07781,42.55062],[20.05218,42.55643],[20.0611,42.56636],[20.07983,42.63561],[20.09833,42.65387],[20.02597,42.70293],[20.01357,42.73718],[20.0294,42.76543],[20.05828,42.77918],[20.17177,42.77208],[20.25749,42.77015],[20.26633,42.81006],[20.26709,42.81838],[20.40458,42.85177],[20.48421,42.87209],[20.52629,42.8857],[20.48117,42.92979],[20.48712,42.94371],[20.52036,42.97599],[20.538,42.97944],[20.54736,42.96696],[20.56759,43.00047],[20.59714,43.01791],[20.61815,43.00738],[20.63582,43.01263],[20.65529,43.03791],[20.66666,43.05941],[20.65555,43.06668],[20.65535,43.07614],[20.69024,43.09046],[20.68474,43.11734],[20.6571,43.13426],[20.60822,43.17079],[20.59313,43.19966],[20.59288,43.20807],[20.60326,43.21586],[20.61577,43.20947],[20.6759,43.21404],[20.71781,43.23861],[20.72976,43.25396],[20.78861,43.2509],[20.79902,43.26973],[20.82402,43.27416],[20.88056,43.23237],[20.89633,43.2064],[20.89185,43.19741],[20.86038,43.18418],[20.88322,43.17221],[20.968,43.12786],[20.97317,43.13725],[21.00171,43.14304],[21.02916,43.13467],[21.05505,43.11374],[21.0768,43.12108],[21.0795,43.1332],[21.09221,43.14057],[21.11813,43.11808],[21.14314,43.11815],[21.15722,43.09497],[21.14943,43.08237],[21.15915,43.04152],[21.17346,43.02927],[21.17228,43.01229],[21.18865,43.01181],[21.19528,43.02655],[21.20838,43.03051],[21.24098,43.01253],[21.25156,42.98139],[21.24127,42.95446],[21.27793,42.90132],[21.30679,42.91192],[21.33168,42.90934],[21.34717,42.90549],[21.36699,42.87815],[21.44,42.87777],[21.44185,42.85103],[21.43,42.84464],[21.42818,42.80712],[21.41748,42.77388],[21.39541,42.75691],[21.39835,42.75158],[21.45096,42.75723],[21.46671,42.74511],[21.48212,42.7524],[21.53015,42.73143],[21.56111,42.74322],[21.59623,42.731],[21.59439,42.7097],[21.67045,42.68104],[21.68037,42.6972],[21.73393,42.71782],[21.7767,42.72243],[21.77888,42.69807],[21.80449,42.65599],[21.77972,42.64209],[21.77173,42.62838],[21.77008,42.60166],[21.75125,42.58434],[21.75095,42.55505],[21.72961,42.54235],[21.70728,42.54294],[21.70222,42.53272],[21.71414,42.51308],[21.69423,42.49888],[21.67446,42.49033],[21.67458,42.48071],[21.62857,42.45056],[21.65142,42.40951],[21.62852,42.37199],[21.57112,42.35813],[21.5391,42.36425],[21.53133,42.33801],[21.56671,42.3189],[21.59596,42.27006],[21.58272,42.25167],[21.52186,42.23975],[21.50594,42.2651],[21.44573,42.27489],[21.43843,42.25552],[21.44638,42.23142],[21.43208,42.22775],[21.39412,42.24212],[21.3493,42.20076],[21.33667,42.1989],[21.33915,42.18753],[21.30895,42.13871],[21.32219,42.10706],[21.30296,42.10363],[21.29279,42.10824],[21.25722,42.08817],[21.23557,42.08617],[21.21595,42.09461],[21.20791,42.12657],[21.16719,42.1714],[21.16274,42.19266],[21.11303,42.20093],[21.05269,42.16308],[21.02143,42.14681],[20.92263,42.12229],[20.89259,42.09216],[20.83556,42.08285],[20.79199,42.07669],[20.76879,42.04106],[20.77208,41.95756],[20.77892,41.91873],[20.74544,41.8779],[20.68323,41.85101]]]}},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]]]}},hrva:{type:"Feature",id:"hrva",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.85486,36.53392],[-76.85486,37.35488],[-75.8194,37.35488],[-75.8194,36.53392],[-76.85486,36.53392]]]}},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]]]}}};
25806
25807   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-forum":{id:"osm-india-forum",featureId:"india_full",type:"forum",countryCodes:["in"],name:"OpenStreetMap India forum",description:"OpenStreetMap India web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=65",contacts:[{name:"OpenStreetMap India",email:"openstreetmapindia@gmail.com"}]},"osm-india-github":{id:"osm-india-github",featureId:"india_full",type:"github",name:"OpenStreetMap India GitHub",description:"Code with us: {url}",url:"https://github.com/osm-in",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"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-telegram":{id:"osm-india-telegram",featureId:"india_full",type:"telegram",name:"OpenStreetMap India Telegram",description:"Join our family: {url}",url:"https://t.me/OSMIndia",contacts:[{name:"Naveen Francis",email:"naveenpf@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-website":{id:"osm-india-website",featureId:"india_full",type:"osm",name:"OpenStreetMap India",countryCodes:["in"],description:"Mappers and OpenStreetMap users in India",url:"https://openstreetmap.in/",contacts:[{name:" OpenStreetMap India",email:"openstreetmapindia@gmail.com"}]},"osm-india-wiki":{id:"osm-india-wiki",featureId:"india_full",type:"wiki",name:"OpenStreetMap Wikiproject India",description:"Everything you need to know about mapping in India: {url}",url:"https://wiki.openstreetmap.org/wiki/WikiProject_India",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"osm-india-youtube":{id:"osm-india-youtube",featureId:"india_full",type:"youtube",name:"OpenStreetMap India Youtube",description:"Subscribe to our channel: {url}",url:"https://www.youtube.com/channel/UCu5sKaPU04x0RJkgGkoFORw",contacts:[{name:"Naveen Francis",email:"naveenpf@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-Puducherry-Mailing-List":{id:"OSM-Puducherry-Mailing-List",featureId:"india_puducherry",type:"mailinglist",name:"Free Software Hardware Movement - Mailing List",description:"FSHM Puducherry mailing list to discuss mapping in Puducherry and other things.",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap.",url:"https://www.freelists.org/archive/puduvailug/",signupUrl:"https://www.freelists.org/list/puduvailug",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-iran-aparat":{id:"osm-iran-aparat",featureId:"iran",type:"aparat",countryCodes:["ir"],languageCodes:["fa"],name:"OpenStreetMap Iran Aparat",description:"Subscribe to our channel at {url}",extendedDescription:"A good resource of videos about anything related to OpenStreetMap. Mainly in Persian.",url:"https://www.aparat.com/osm_iran",contacts:[{name:"Iman",email:"iriman@chmail.ir"}]},"osm-iran-forum":{id:"osm-iran-forum",featureId:"iran",type:"forum",countryCodes:["ir"],languageCodes:["fa"],name:"OpenStreetMap Iran web forum",description:"OpenStreetMap Iran web forum",extendedDescription:"A web forum for OpenStreetMap users in Iran. Feel free to ask questions and discuss with others!",url:"https://forum.openstreetmap.org/viewforum.php?id=103",contacts:[{name:"Iman",email:"iriman@chmail.ir"}]},"osm-iran-telegram":{id:"osm-iran-telegram",featureId:"iran",type:"telegram",countryCodes:["ir"],languageCodes:["fa"],name:"OpenStreetMap Iran Telegram",description:"You're welcome to join our Telegram channel at {url}. We also have a supergroup of many OSMers interested in Iran. Find its link in bio of channel.",url:"https://t.me/openstreetmapir",contacts:[{name:"Iman",email:"iriman@chmail.ir"}]},"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-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-Asia-mailinglist":{id:"OSM-Asia-mailinglist",featureId:"asia_full",type:"mailinglist",name:"OpenStreetMap Asia Mailinglist",description:"Talk-asia is the official Mailinglist for Asian Community",url:"https://lists.openstreetmap.org/listinfo/talk-asia",contacts:[{name:"Erwin Olario",email:"govvin@gmail.com"}]},"osm-asia-telegram":{id:"osm-asia-telegram",featureId:"asia_full",type:"telegram",name:"OpenStreetMap Asia Telegram",description:"Join our family: {url}",url:"https://t.me/OpenStreetMapAsia",contacts:[{name:"Erwin Olario",email:"govvin@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-south-korea-telegram":{id:"OSM-south-korea-telegram",featureId:"south_korea",type:"telegram",countryCodes:["kr"],languageCodes:["ko","en"],name:"OSM South Korea Telegram",description:"Unofficial Channnel for OpenStreetMap contributors, communities, and users in South 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-sri-lanka-facebook":{id:"OSM-sri-lanka-facebook",featureId:"sri_lanka",type:"facebook",countryCodes:["lk"],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-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://webchat.oftc.net/?channels=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://webchat.oftc.net/?channels=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://webchat.oftc.net/?channels=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://webchat.oftc.net/?channels=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://webchat.oftc.net/?channels=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"}]},"kosovo-telegram":{id:"kosovo-telegram",type:"telegram",featureId:"kosovo",countryCodes:["xk"],languageCodes:["sq","sr","en"],name:"OpenStreetMap Kosovo on Telegram",description:"Semi-official all-Kosovo Telegram public group. We welcome all mappers from anywhere in any language.",url:"https://t.me/osmkosovo",contacts:[{name:"Guillaume Rischard",email:"guillaumenospam@openstreetmapnospam.lu"}]},"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"},"no-telegram":{id:"no-telegram",type:"telegram",featureId:"norway",countryCodes:["no"],languageCodes:["no"],name:"@OSM_no on Telegram",description:"OpenStreetMap Norway Telegram chat",url:"https://t.me/OSM_no",contacts:[{name:"Syver Stensholt",email:"sssandum@gmail.com"}]},"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://webchat.oftc.net/?channels=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://webchat.oftc.net/?channels=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"}]},"MaptimeHRVA-twitter":{id:"MaptimeHRVA-twitter",featureId:"hrva",type:"twitter",name:"MaptimeHRVA Twitter",countryCodes:["us"],languageCodes:["en"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/maptimehrva",contacts:[{name:"Jonah Adkins",email:"jonahadkins@gmail.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://webchat.oftc.net/?channels=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",featureId:"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-Discord":{id:"OSM-Discord",type:"discord",languageCodes:["en"],name:"OpenStreetMap Discord",description:"Get in touch with other mappers via Discord",url:"https://discord.gg/SRZUYUz",contacts:[{name:"Austin Harrison",email:"jaustinharrison@gmail.com"}]},"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-IRC":{id:"OSM-IRC",type:"irc",languageCodes:["en"],name:"OpenStreetMap IRC",description:"Join #osm on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},"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/"}]}};
25808
25809   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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"arapiraca_al",name:"Arapiraca AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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/v2/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:[1,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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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:"City_of_Melbourne_May_2018",name:"City of Melbourne",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/openstreetmapau.gdbhzo3g/{zoom}/{x}/{y}.jpg?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcGF1IiwiYSI6ImNqbWl3bXZ6aDA0MTkzd21xdnV1d2k0azEifQ.HYkMOqH_E2fYd1b0oXRe6w",endDate:"2018-05-01T00:00:00.000Z",startDate:"2018-05-01T00:00:00.000Z",zoomExtent:[10,22],polygon:[[[144.9146,-37.79929],[144.9139,-37.79888],[144.91276,-37.79858],[144.91138,-37.79876],[144.90975,-37.79976],[144.90604,-37.80641],[144.90428,-37.81261],[144.9042,-37.81421],[144.90561,-37.82089],[144.90426,-37.82245],[144.89902,-37.82728],[144.89686,-37.83007],[144.89598,-37.83355],[144.89602,-37.83873],[144.89703,-37.84192],[144.90113,-37.84692],[144.9052,-37.85019],[144.90684,-37.85056],[144.90802,-37.8502],[144.9084,-37.84948],[144.90701,-37.84771],[144.90763,-37.84693],[144.90448,-37.84165],[144.90529,-37.84139],[144.90806,-37.8458],[144.91181,-37.8502],[144.91274,-37.85039],[144.91548,-37.84892],[144.91553,-37.84814],[144.91396,-37.84594],[144.91619,-37.84451],[144.91396,-37.84131],[144.91634,-37.83985],[144.91651,-37.83841],[144.91508,-37.83441],[144.91829,-37.83307],[144.91947,-37.83258],[144.92102,-37.83087],[144.92186,-37.83002],[144.92297,-37.8295],[144.92937,-37.82816],[144.93529,-37.82702],[144.94112,-37.82692],[144.94181,-37.82679],[144.94585,-37.8275],[144.94707,-37.82794],[144.94784,-37.82779],[144.95786,-37.82953],[144.95921,-37.82941],[144.9613,-37.82902],[144.96254,-37.82972],[144.96477,-37.83184],[144.96565,-37.83229],[144.96621,-37.83231],[144.97033,-37.83121],[144.97052,-37.83228],[144.97106,-37.83307],[144.97346,-37.83507],[144.97428,-37.83595],[144.97943,-37.85002],[144.97968,-37.85081],[144.98061,-37.85117],[144.98425,-37.85151],[144.98483,-37.85139],[144.98537,-37.85085],[144.98923,-37.83109],[144.98891,-37.83038],[144.99226,-37.81041],[144.99243,-37.80983],[144.99187,-37.80895],[144.97449,-37.80714],[144.97683,-37.79327],[144.97674,-37.7928],[144.97642,-37.79232],[144.97589,-37.79219],[144.96977,-37.79146],[144.97076,-37.78566],[144.97041,-37.785],[144.9699,-37.78477],[144.96488,-37.7842],[144.96511,-37.78252],[144.96507,-37.78198],[144.96421,-37.78142],[144.96398,-37.78082],[144.96389,-37.77964],[144.96355,-37.7785],[144.96267,-37.77779],[144.96136,-37.77724],[144.93919,-37.77456],[144.93836,-37.77458],[144.93801,-37.77485],[144.93728,-37.77601],[144.93658,-37.77692],[144.93613,-37.77728],[144.93598,-37.77791],[144.93778,-37.78142],[144.93827,-37.78421],[144.93911,-37.78654],[144.93885,-37.78672],[144.93881,-37.7873],[144.93773,-37.78801],[144.93216,-37.7874],[144.93123,-37.78783],[144.93076,-37.78786],[144.93003,-37.78735],[144.92181,-37.78642],[144.91488,-37.77938],[144.91428,-37.77865],[144.9137,-37.77853],[144.91293,-37.77855],[144.90819,-37.78135],[144.90722,-37.78206],[144.90572,-37.7845],[144.90529,-37.78637],[144.90428,-37.78657],[144.90375,-37.78718],[144.90319,-37.78827],[144.90201,-37.78883],[144.90143,-37.78964],[144.90188,-37.79103],[144.90257,-37.79198],[144.90415,-37.79288],[144.90645,-37.79383],[144.90814,-37.79456],[144.91046,-37.79519],[144.9127,-37.79605],[144.91429,-37.79695],[144.91525,-37.79783],[144.91539,-37.79815],[144.91531,-37.79848],[144.91518,-37.79872],[144.9148,-37.79914],[144.9146,-37.79929]]],terms_url:"https://data.melbourne.vic.gov.au/Property-Planning/2018-Aerial-Imagery-True-Ortho-/qa5h-sfgh",terms_text:"City of Melbourne",best:true,icon:"https://www.melbourne.vic.gov.au/_catalogs/masterpage/android-icon.png"},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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:[6,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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"eufar-balaton",name:"EUFAR Balaton orthophotos",type:"tms",template:"http://e.tile.openstreetmap.hu/balaton/0/{zoom}/{x}/{y}.jpg",endDate:"2010-08-31T00:00:00.000Z",startDate:"2010-08-01T00:00:00.000Z",zoomExtent:[12,19],polygon:[[[18.17918,46.98502],[18.17773,47.01816],[18.08176,47.05643],[18.10281,47.06311],[18.08152,47.09344],[18.06436,47.09049],[18.03537,47.07983],[18.03344,47.08262],[17.9582,47.05567],[17.99436,47.00449],[17.86441,46.95517],[17.80274,47.0103],[17.67184,46.97207],[17.23875,46.77079],[17.22244,46.6796],[17.47175,46.70306],[18.16735,46.94133],[18.17918,46.98502]]],terms_url:"http://www.bli.okologia.mta.hu/",terms_text:"EUFAR Balaton ortofotó 2010",best:true,description:"1940 geo-tagged photography from Balaton Limnological Institute."},{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.din.developpement-durable.gouv.fr/wxs?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.din.developpement-durable.gouv.fr/wxs?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.din.developpement-durable.gouv.fr/wxs?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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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:"https://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.38,45.5666],[13.63822,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 ©2019 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:"https://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.38,45.5666],[13.63822,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 ©2019 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:"helsingborg-orto",name:"Helsingborg Orthophoto",type:"tms",template:"http://mapproxy.openstreetmap.se/tiles/1.0.0/hborg2016_EPSG3857/{zoom}/{x}/{y}.jpeg",zoomExtent:[5,20],polygon:[[[12.74345,55.94997],[12.93777,55.90804],[13.00369,55.96842],[12.79083,56.25022],[12.56698,56.1356],[12.74345,55.94997]]],terms_url:"https://helsingborg.opendatasoft.com/",terms_text:"© Helsingborg municipality",best:true,description:"Orthophotos from the municipality of Helsingborg 2016, public domain",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Helsingborg_vapen.svg/198px-Helsingborg_vapen.svg.png"},{id:"hri-orto",name:"Helsinki region 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://hri.fi/data/en_GB/dataset/paakaupunkiseudun-ortokuva-2017",terms_text:"© Espoon, Helsingin ja Vantaan kaupungit, Kirkkonummen ja Nurmijärven kunnat sekä HSL ja HSY",best:true,description:"Ortophotos from the municipalities of Espoo, Helsinki, Vantaa, Kirkkonummi and Nurmijärvi + HSL and HSY",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/fi/hri_logo.png"},{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:"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.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",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.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",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_airphoto",name:"Japan GSI airphoto Imagery",type:"tms",template:"http://cyberjapandata.gsi.go.jp/xyz/airphoto/{zoom}/{x}/{y}.png",zoomExtent:[14,18],polygon:[[[140.88867,45.67548],[140.71289,45.41388],[141.04248,43.80282],[139.96582,43.35714],[138.99902,42.01665],[139.04297,41.26129],[137.5708,38.58253],[132.69287,36.86204],[130.84717,34.93999],[129.74854,34.994],[129.02344,34.56086],[128.36426,33.21112],[127.90283,31.87756],[128.4082,29.89781],[125.8374,26.78485],[123.33252,25.0657],[122.58545,24.42715],[123.53027,23.44309],[125.88135,24.10665],[129.96826,26.31311],[132.1875,30.20211],[134.42871,32.43561],[136.82373,33.28462],[137.85645,34.21634],[138.64746,33.24788],[138.58154,32.00808],[139.6582,28.67131],[141.65771,29.66896],[142.0752,32.06396],[141.21826,33.37641],[141.56982,35.44277],[141.43799,36.52729],[142.82227,39.16414],[143.04199,40.89691],[145.92041,42.40723],[146.18408,43.03678],[145.74463,43.54855],[145.32715,43.67582],[145.30518,43.91372],[145.61279,44.2452],[145.41504,44.62175],[144.38232,44.52784],[142.31689,45.53714],[141.3501,45.70618],[140.88867,45.67548]]],terms_url:"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html",terms_text:"GSI Japan",description:"Japan GSI airphoto Imagery. Not fully orthorectified, but a bit newer and/or differently covered than GSI ortho Imagery."},{id:"finds.jp_KBN_2500",name:"Japan GSI KIBAN 2500",type:"tms",template:"http://www.finds.jp/ws/tmc/1.0.0/KBN2500FN-900913-L/{zoom}/{x}/{y}.png",zoomExtent:[15,20],polygon:[[[140.88867,45.67548],[140.71289,45.41388],[141.04248,43.80282],[139.96582,43.35714],[138.99902,42.01665],[139.04297,41.26129],[137.5708,38.58253],[132.69287,36.86204],[130.84717,34.93999],[129.74854,34.994],[129.02344,34.56086],[128.36426,33.21112],[127.90283,31.87756],[128.4082,29.89781],[125.8374,26.78485],[123.33252,25.0657],[122.58545,24.42715],[123.53027,23.44309],[125.88135,24.10665],[129.96826,26.31311],[132.1875,30.20211],[134.42871,32.43561],[136.82373,33.28462],[137.85645,34.21634],[138.64746,33.24788],[138.58154,32.00808],[139.6582,28.67131],[141.65771,29.66896],[142.0752,32.06396],[141.21826,33.37641],[141.56982,35.44277],[141.43799,36.52729],[142.82227,39.16414],[143.04199,40.89691],[145.92041,42.40723],[146.18408,43.03678],[145.74463,43.54855],[145.32715,43.67582],[145.30518,43.91372],[145.61279,44.2452],[145.41504,44.62175],[144.38232,44.52784],[142.31689,45.53714],[141.3501,45.70618],[140.88867,45.67548]]],terms_url:"http://www.finds.jp/siteinfo/c_tou.html.ja",terms_text:"GSI KIBAN 2500",description:"GSI Kiban 2500 via finds.jp. Good for tracing, but a bit older."},{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",description:"Japan GSI ortho Imagery. Usually better than bing, but a bit older."},{id:"gsi.go.jp_seamlessphoto",name:"Japan GSI seamlessphoto Imagery",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/seamlessphoto/{zoom}/{x}/{y}.jpg",zoomExtent:[14,18],polygon:[[[140.88867,45.67548],[140.71289,45.41388],[141.04248,43.80282],[139.96582,43.35714],[138.99902,42.01665],[139.04297,41.26129],[137.5708,38.58253],[132.69287,36.86204],[130.84717,34.93999],[129.74854,34.994],[129.02344,34.56086],[128.36426,33.21112],[127.90283,31.87756],[128.4082,29.89781],[125.8374,26.78485],[123.33252,25.0657],[122.58545,24.42715],[123.53027,23.44309],[125.88135,24.10665],[129.96826,26.31311],[132.1875,30.20211],[134.42871,32.43561],[136.82373,33.28462],[137.85645,34.21634],[138.64746,33.24788],[138.58154,32.00808],[139.6582,28.67131],[141.65771,29.66896],[142.0752,32.06396],[141.21826,33.37641],[141.56982,35.44277],[141.43799,36.52729],[142.82227,39.16414],[143.04199,40.89691],[145.92041,42.40723],[146.18408,43.03678],[145.74463,43.54855],[145.32715,43.67582],[145.30518,43.91372],[145.61279,44.2452],[145.41504,44.62175],[144.38232,44.52784],[142.31689,45.53714],[141.3501,45.70618],[140.88867,45.67548]]],terms_url:"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html",terms_text:"GSI Japan seamless photo",description:"Japan GSI seamlessphoto Imagery. The collection of latest imageries of GSI ortho, airphoto, post disaster and others."},{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",description:"Japan GSI Standard Map. Widely covered."},{id:"kalmar-orto-2014",name:"Kalmar North Orthophoto 2014",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2014/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.28473,56.70827],[16.38856,56.70798],[16.40843,56.7615],[16.46269,56.75672],[16.47753,56.76023],[16.48815,56.77023],[16.48754,56.79231],[16.48254,56.79547],[16.47667,56.8223],[16.4687,56.82614],[16.48584,56.86271],[16.48809,56.87369],[16.45694,56.87786],[16.46288,56.88769],[16.42696,56.88757],[16.39809,56.89604],[16.36791,56.8952],[16.36717,56.85985],[16.36431,56.84636],[16.36001,56.83657],[16.34423,56.82532],[16.32675,56.79284],[16.26114,56.74422],[16.28473,56.70827]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for the north coast of the municipality of Kalmar 2014",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{id:"kalmar-orto-2016",name:"Kalmar South Orthophoto 2016",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2016/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.156,56.45834],[16.11389,56.46083],[16.09246,56.46633],[16.0724,56.4662],[16.07126,56.51153],[16.08516,56.56847],[16.14417,56.63933],[16.21168,56.68491],[16.28412,56.71655],[16.25135,56.74358],[16.25045,56.75062],[16.29558,56.7512],[16.33516,56.72511],[16.38922,56.71885],[16.41137,56.67602],[16.4053,56.66294],[16.33101,56.625],[16.28048,56.613],[16.21561,56.51967],[16.156,56.45834]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for the south coast of the municipality of Kalmar 2016",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{id:"kalmar-orto-2018",name:"Kalmar Urban Orthophoto 2018",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2018/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&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:[9,22],polygon:[[[16.3416,56.81756],[16.32773,56.7973],[16.36692,56.78706],[16.37105,56.79153],[16.36978,56.80511],[16.35645,56.8133],[16.3416,56.81756]],[[16.39207,56.79339],[16.4608,56.78944],[16.48817,56.79067],[16.4833,56.76986],[16.46612,56.76711],[16.45409,56.76774],[16.43173,56.77309],[16.43178,56.77663],[16.40554,56.77214],[16.39325,56.77349],[16.39207,56.79339]],[[16.29836,56.79102],[16.28796,56.7883],[16.27727,56.78367],[16.27623,56.77952],[16.2862,56.7761],[16.3108,56.77696],[16.3118,56.78086],[16.30364,56.78883],[16.29836,56.79102]],[[16.20686,56.63637],[16.22098,56.62389],[16.2453,56.62467],[16.26751,56.62951],[16.28724,56.63831],[16.37871,56.65462],[16.38806,56.6897],[16.38664,56.72867],[16.31586,56.72879],[16.29956,56.7219],[16.29331,56.70021],[16.26799,56.66889],[16.23945,56.66991],[16.2266,56.6624],[16.21411,56.64972],[16.20686,56.63637]],[[16.15172,56.67843],[16.15712,56.69334],[16.15268,56.70297],[16.13274,56.71254],[16.10987,56.71964],[16.08638,56.7112],[16.07969,56.70056],[16.08149,56.69566],[16.09534,56.69599],[16.12877,56.67766],[16.15172,56.67843]],[[15.97369,56.62759],[16.00164,56.63215],[16.04126,56.62999],[16.05658,56.62489],[16.06201,56.61794],[16.09186,56.60378],[16.10527,56.5926],[16.09581,56.58161],[16.03481,56.60405],[16.0305,56.61252],[16.0088,56.60223],[15.98755,56.59742],[15.98449,56.57141],[15.94887,56.57264],[15.91878,56.55184],[15.90892,56.55393],[15.89921,56.56867],[15.9188,56.57287],[15.94612,56.57491],[15.96371,56.59004],[15.9496,56.59724],[15.94308,56.60903],[15.95726,56.61598],[15.97589,56.62005],[15.97369,56.62759]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for urban areas of the municipality of Kalmar 2018",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{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"},{id:"Aargau-AGIS-2017",name:"Kanton Aargau 25cm (AGIS 2017)",type:"tms",template:"https://mapproxy.osm.ch/tiles/AGIS2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-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 OF2017",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://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.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://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.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://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lantmateriet-topowebb",name:"Lantmäteriet Topographic Map",type:"tms",template:"https://api.lantmateriet.se/open/topowebb-ccby/v1/wmts/token/9b342b7d9f12d4ddb92277be9869d860/1.0.0/topowebb/default/3857/{zoom}/{y}/{x}.png",zoomExtent:[3,15],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:"Topographic map of Sweden 1:50 000",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.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:"linkoping-orto",name:"Linköping Orthophoto",type:"wms",template:"http://kartan.linkoping.se/wms?servicename=wms_ortofoto&FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Kommun_2010_25cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[13,20],polygon:[[[15.36884,58.6305],[15.41279,58.65623],[15.46635,58.6339],[15.54291,58.64408],[15.54119,58.60672],[15.58376,58.6414],[15.7592,58.55267],[15.76675,58.52006],[15.91438,58.51755],[16.08089,58.37148],[15.82718,58.30588],[15.84915,58.21449],[15.65861,58.15513],[15.56763,58.19134],[15.55939,58.14661],[15.50171,58.07679],[15.37777,58.05881],[15.28713,58.1031],[15.27203,58.13483],[15.35889,58.16455],[15.32387,58.38012],[15.24971,58.40027],[15.3582,58.47288],[15.36884,58.6305]]],terms_url:"https://www.linkoping.se/open/",terms_text:"© Linköping municipality",best:true,description:"Orthophotos from the municipality of Linköping 2010, open data",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Linköping_vapen.svg/198px-Linköping_vapen.svg.png"},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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:"https://owsproxy.lgl-bw.de/owsproxy/ows/WMS_Maps4BW?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=webatlasde&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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"MassGIS-L3-Parcels",name:"MassGIS L3 Parcels",type:"tms",template:"https://tiles.arcgis.com/tiles/hGdibHYSPO59RG1h/arcgis/rest/services/MassGIS_Level3_Parcels/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[15,20],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]]],overlay:true},{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://kart.miljodirektoratet.no/arcgis/services/vern/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=naturvern_klasser_omrade&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://kart.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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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://gis.npd.no/ogc/factmaps/2_0?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=fclFixed,pplAll,fldByStatus&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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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;'>&larr;</span> <span style='color: #96f;'>&darr;</span> <span style='color: #6e0;'>&uarr;</span> <span style='color: #f63;'>&rarr;</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]],[[17.79852,46.81745],[17.79178,46.81585],[17.79601,46.80664],[17.7948,46.80598],[17.79693,46.80056],[17.80109,46.79993],[17.80736,46.80225],[17.79852,46.81745]],[[17.7788,46.81461],[17.78446,46.80714],[17.79083,46.80925],[17.7853,46.81683],[17.7788,46.81461]]],terms_text:"openstreetmap.hu"},{id:"OpenTopoMap",name:"OpenTopoMap",type:"tms",template:"https://{switch:a,b,c}.tile.opentopomap.org/{zoom}/{x}/{y}.png",zoomExtent:[3,17],terms_url:"https://tile.opentopomap.org/about#verwendung",terms_text:"Kartendaten: © OpenStreetMap-Mitwirkende, SRTM | Kartendarstellung: © OpenTopoMap (CC-BY-SA)",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenTopoMap.png"},{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:"OSIP_1ft",name:"OSIP 1ft Imagery Most Current Available",type:"wms",template:"https://geo.oit.ohio.gov/arcgis/services/OSIP/osip_best_avail_1ft/ImageServer/WMSServer?FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2014-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[1,20],polygon:[[[-83.1356,41.75081],[-83.08101,41.7511],[-83.0796,41.62936],[-82.95011,41.54404],[-82.89032,41.54404],[-82.89032,41.69462],[-82.8494,41.7463],[-82.76758,41.73925],[-82.75184,41.63584],[-82.64799,41.62408],[-82.68575,41.50634],[-82.49063,41.40492],[-82.0217,41.53462],[-81.72901,41.52048],[-81.39541,41.7369],[-81.10587,41.84484],[-80.50161,41.99939],[-80.51105,40.62127],[-80.6275,40.59021],[-80.58344,40.49933],[-80.58973,40.2812],[-80.85095,39.625],[-81.19399,39.37974],[-81.38912,39.31159],[-81.45521,39.38704],[-81.515,39.35054],[-81.54333,39.26288],[-81.72586,39.19461],[-81.73216,38.9258],[-81.9021,38.85477],[-81.95875,38.89397],[-81.9084,38.93315],[-82.02799,38.99922],[-82.11611,38.92336],[-82.12555,38.8278],[-82.19794,38.78856],[-82.16647,38.72475],[-82.16017,38.58712],[-82.26718,38.57236],[-82.29865,38.43198],[-82.57875,38.39745],[-82.73925,38.53545],[-82.8494,38.56006],[-82.91235,38.73212],[-83.00676,38.71002],[-83.14524,38.59942],[-83.30575,38.58466],[-83.39387,38.64368],[-83.46625,38.64614],[-83.54178,38.69283],[-83.65193,38.61172],[-83.74635,38.63385],[-83.9635,38.76403],[-84.08624,38.75421],[-84.22157,38.7812],[-84.34117,38.99922],[-84.49223,39.07255],[-84.64015,39.05545],[-84.74086,39.11164],[-84.84471,39.08477],[-84.82898,41.70637],[-83.44737,41.76038],[-83.13438,41.64959],[-83.1356,41.75081]]],terms_url:"https://ogrip.oit.ohio.gov/ProjectsInitiatives/StatewideImagery.aspx",terms_text:"Ohio Statewide Imagery Program",description:"Most recent available 1-foot orthoimagery from the Ohio Statewide Imagery Program."},{id:"OSIP_6in",name:"OSIP 6in Imagery Most Current Available",type:"wms",template:"https://geo.oit.ohio.gov/arcgis/rest/services/OSIP/OSIP_6in_best_avail/ImageServer/exportImage?f=image&bbox={bbox}&imageSR=3857&bboxSR=4326&SR={proj}&size={width}%2C{height}",projection:"EPSG:4326",endDate:"2013-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[1,22],polygon:[[[-84.8172,39.566],[-84.47765,39.56679],[-84.00558,39.56441],[-84.01108,39.25379],[-83.99391,39.25273],[-84.05605,38.77041],[-83.95821,38.78567],[-83.86791,38.75274],[-83.83461,38.7123],[-83.79101,38.69623],[-83.76904,38.65093],[-83.66398,38.62331],[-83.63926,38.63725],[-83.62141,38.67801],[-83.52219,38.70025],[-83.46451,38.6705],[-83.37112,38.65602],[-83.32615,38.63189],[-83.31928,38.60265],[-83.29319,38.59353],[-83.26435,38.61499],[-83.241,38.62545],[-83.20599,38.61311],[-83.14796,38.61848],[-83.12222,38.64342],[-83.10505,38.67184],[-83.05527,38.6906],[-83.02299,38.7257],[-82.97733,38.72195],[-82.89459,38.75382],[-82.87365,38.73721],[-82.88189,38.68765],[-82.84927,38.59111],[-82.78748,38.55595],[-82.72533,38.55595],[-82.69238,38.53608],[-82.65495,38.48988],[-82.60998,38.46757],[-82.59899,38.41836],[-82.55333,38.39926],[-82.40364,38.43584],[-82.37514,38.43154],[-82.32468,38.4431],[-82.30614,38.48343],[-82.29927,38.5205],[-82.28416,38.58414],[-82.35901,38.58682],[-82.35249,38.67747],[-82.47059,38.68417],[-82.46475,38.7415],[-82.48466,38.74391],[-82.48158,38.77336],[-82.58045,38.78192],[-82.57393,38.84532],[-82.75795,38.85709],[-82.75074,38.94606],[-82.80739,38.9506],[-83.02265,38.95994],[-83.2053,38.96208],[-83.21011,38.99037],[-83.24032,39.01785],[-83.26778,39.02052],[-83.31242,39.05438],[-83.38486,39.05785],[-83.61111,39.02052],[-83.70586,39.02398],[-83.8686,39.02345],[-83.86414,39.24449],[-83.83598,39.24316],[-83.83804,39.22082],[-83.80646,39.22161],[-83.78277,39.26044],[-83.59051,39.37757],[-83.37044,39.37545],[-83.26435,39.51675],[-83.25096,39.69609],[-83.65093,39.71907],[-83.64578,39.77688],[-83.73642,39.78269],[-83.73951,39.79034],[-83.82568,39.79983],[-83.825,39.82409],[-83.93898,39.83095],[-83.93761,39.84492],[-84.05125,39.85283],[-84.00867,40.31147],[-84.00181,40.31121],[-83.9994,40.47986],[-83.98979,40.48038],[-83.99151,40.53285],[-83.88439,40.53442],[-83.8813,40.52972],[-83.52184,40.50753],[-83.54176,40.33686],[-83.63857,40.33739],[-83.63617,40.30179],[-83.56647,40.30179],[-83.54656,40.27612],[-83.55343,40.22817],[-83.49609,40.22371],[-83.50674,40.10985],[-83.16788,40.10565],[-83.17028,40.24521],[-83.2465,40.24678],[-83.2465,40.5091],[-83.41267,40.5078],[-83.41782,40.68741],[-83.43773,40.68923],[-83.43842,40.70433],[-83.49335,40.70355],[-83.493,40.81901],[-83.51395,40.82005],[-83.51257,40.90339],[-83.47584,40.90313],[-83.47515,40.94697],[-83.45592,40.94749],[-83.45592,40.99001],[-83.41747,40.99052],[-83.41782,41.16754],[-83.87787,41.17064],[-83.88062,41.41132],[-83.85143,41.41235],[-83.74432,41.4646],[-83.70827,41.49341],[-83.7038,41.52143],[-83.67805,41.54405],[-83.6063,41.56922],[-83.57094,41.61236],[-83.41782,41.61673],[-83.42297,41.25329],[-83.23139,41.25045],[-82.84241,41.25303],[-82.83245,40.99493],[-82.42973,40.99078],[-82.4342,41.06279],[-82.33463,41.06408],[-82.33944,41.28632],[-82.83897,41.29225],[-82.84515,41.43217],[-82.9509,41.4332],[-82.95158,41.48286],[-82.87262,41.48826],[-82.84447,41.49469],[-82.83417,41.45945],[-82.79984,41.4682],[-82.81494,41.49649],[-82.7528,41.50086],[-82.7401,41.48441],[-82.70199,41.49521],[-82.70817,41.55098],[-82.78164,41.54816],[-82.83142,41.59465],[-82.86507,41.57847],[-82.85854,41.5551],[-82.88807,41.52631],[-82.93098,41.51835],[-82.98626,41.53505],[-83.04016,41.5682],[-83.06694,41.60235],[-83.10574,41.6175],[-83.14247,41.61955],[-83.20564,41.63828],[-83.33954,41.70957],[-83.35327,41.69189],[-83.4264,41.69548],[-83.41679,41.70291],[-83.41816,41.7375],[-83.88405,41.72341],[-83.87993,41.62032],[-83.88783,41.62006],[-83.88577,41.48955],[-84.34547,41.48852],[-84.34513,41.42548],[-84.23183,41.42522],[-84.23355,41.16366],[-83.97366,41.16444],[-83.97434,41.17995],[-83.90259,41.17865],[-83.90327,41.16418],[-83.88371,41.16444],[-83.88336,40.92337],[-83.99975,40.92233],[-83.99769,40.90754],[-84.11167,40.90651],[-84.11167,40.8629],[-84.34444,40.86186],[-84.33758,40.90521],[-84.39491,40.90547],[-84.39663,40.98871],[-84.33861,40.98897],[-84.33964,41.21043],[-84.45362,41.21146],[-84.45499,41.25458],[-84.80621,41.2551],[-84.80724,40.72488],[-84.45877,40.7254],[-84.46083,40.35649],[-84.43851,40.35073],[-84.43474,40.17494],[-84.44504,40.15841],[-84.43336,40.15841],[-84.42959,39.92185],[-84.81651,39.91974],[-84.8172,39.57685],[-84.82647,39.56997],[-84.8172,39.566]],[[-82.83211,41.73033],[-82.80945,41.72828],[-82.77374,41.7006],[-82.78198,41.66368],[-82.84309,41.61544],[-82.86713,41.68266],[-82.83211,41.73033]],[[-81.09077,40.89742],[-81.09146,40.9913],[-81.00494,40.99026],[-81.007,41.1373],[-80.51537,41.13574],[-80.51468,40.89794],[-81.09077,40.89742]]],terms_url:"https://ogrip.oit.ohio.gov/ProjectsInitiatives/StatewideImagery.aspx",terms_text:"Ohio Statewide Imagery Program",description:"Most recent available 6-inch orthoimagery from the Ohio Statewide Imagery Program."},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"palmeira_dos_indios",name:"Palmeira dos Indios AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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:"https://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.38,45.5666],[13.63822,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 ©2019 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:"https://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.38,45.5666],[13.63822,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 ©2019 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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Sao_miguel_dos_campos",name:"São Miguel dos Campos AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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:"stockholm-orto",name:"Stockholm Orthophoto",type:"wms",template:"http://openmap.stockholm.se/bios/wms/app/baggis/web/WMS_STHLM_ORTOFOTO_2015?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=p_1002820&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,21],polygon:[[[17.8755,59.2625],[17.94411,59.27307],[18.09551,59.22603],[18.19582,59.22786],[18.20297,59.24886],[18.12538,59.30779],[18.1786,59.32566],[18.09876,59.3721],[18.04264,59.37816],[18.00796,59.34334],[17.93655,59.37641],[17.97483,59.40246],[17.90882,59.4417],[17.8854,59.43792],[17.88918,59.41382],[17.84077,59.38568],[17.81708,59.40054],[17.77725,59.39984],[17.75622,59.3916],[17.79899,59.36204],[17.94993,59.31121],[17.85622,59.28412],[17.8755,59.2625]]],terms_url:"http://dataportalen.stockholm.se/dataportalen/",terms_text:"© Stockholm municipality, CC0",best:true,description:"Orthophotos from the municipality of Stockholm 2015, CC0 license",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Stockholm_vapen_bra.svg/196px-Stockholm_vapen_bra.svg.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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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:"US-TIGER-Roads-2018",name:"TIGER Roads 2018",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmapus/cjo1wbulo3ub82ro1c9onlzmh/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcHVzIiwiYSI6ImNpcnF4Ym43dDBoOXZmYW04bWhlNWdrY2EifQ.4SFexuTUuKkZeerO3dgtmw",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-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:"Toulouse-Orthophotoplan-2017",name:"Toulouse - Orthophotoplan 2017",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2017&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",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",best:true},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbISOrtho2018",name:"UrbIS-Ortho 2018",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:Ortho2018&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-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-Imagery",name:"USGS Imagery",type:"tms",template:"https://ags-proxy.openstreetmap.us/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fbasemap.nationalmap.gov%2Farcgis%2Frest%2Fservices%2FUSGSImageryOnly%2FMapServer",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]]],description:"Public domain aerial imagery, mostly NAIP",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:"vicosa_al",name:"Viçosa AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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 Footprints",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FVA_Base_layers%2FVA_Building_Footprints%2FMapServer&transparent=true&layers=show%3A20",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",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FMostRecentImagery%2FMostRecentImagery_WGS%2FMapServer&transparent=true&layers=show%3A0",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 Property Lines",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=http%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FVA_Base_layers%2FVA_Parcels%2FMapServer&transparent=true",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"}];
25810
25811   var presets = {aerialway:{fields:["aerialway"],geometry:["point","vertex","line"],tags:{aerialway:"*"},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"},attraction:{icon:"maki-star",fields:["name","attraction","operator","opening_hours"],moreFields:["opening_hours","fee","payment_multi","address","website","phone","email","fax"],geometry:["point","vertex","line","area"],tags:{attraction:"*"},searchable:false,name:"Attraction"},circular:{geometry:["vertex","line"],fields:["name"],tags:{junction:"circular"},name:"Traffic Circle",searchable:false},embankment:{geometry:["line"],tags:{embankment:"yes"},name:"Embankment",matchScore:0.2,searchable:false},highway:{fields:["name","highway"],geometry:["point","vertex","line","area"],tags:{highway:"*"},searchable:false,name:"Highway"},landuse:{fields:["name","landuse"],geometry:["area"],tags:{landuse:"*"},matchScore:0.9,searchable:false,name:"Land Use"},leisure:{icon:"maki-pitch",fields:["name","leisure"],geometry:["point","vertex","area"],tags:{leisure:"*"},searchable:false,name:"Leisure"},man_made:{icon:"temaki-storage_tank",fields:["name","man_made"],moreFields:["material"],geometry:["point","vertex","line","area"],tags:{man_made:"*"},searchable:false,name:"Man Made"},natural:{icon:"maki-natural",fields:["name","natural"],geometry:["point","vertex","area"],tags:{natural:"*"},searchable:false,name:"Natural"},place:{fields:["name","place"],geometry:["point","vertex","area"],tags:{place:"*"},searchable:false,name:"Place"},power:{geometry:["point","vertex","line","area"],tags:{power:"*"},fields:["power"],moreFields:["material"],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},seamark:{icon:"maki-harbor",fields:["seamark/type"],geometry:["point","vertex","line","area"],tags:{"seamark:type":"*"},searchable:false,name:"Seamark"},tourism:{icon:"maki-attraction",fields:["name","tourism"],geometry:["point","vertex","area"],tags:{tourism:"*"},searchable:false,name:"Tourism"},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":{icon:"temaki-storage_tank",fields:["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":{icon:"temaki-chairlift",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":{icon:"fas-plane-departure",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"],moreFields:["wheelchair","smoking"],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/recycling":{icon:"maki-recycling",fields:["recycling_type","recycling_accepts","collection_times"],geometry:["point","area"],terms:["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],tags:{amenity:"recycling"},name:"Recycling",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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["website","phone","email","fax","wheelchair"],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"],moreFields:["website","phone","email","fax","wheelchair"],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","website"],moreFields:["fee","payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["name","brand","lit","opening_hours","wheelchair","covered"],geometry:["point","vertex"],terms:["money","cash","machine"],tags:{amenity:"atm"},name:"ATM"},"amenity/bank":{icon:"maki-bank",fields:["name","operator","address","building_area","atm","drive_through"],moreFields:["opening_hours","currency_multi","website","phone","email","fax","wheelchair"],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","address","building_area","outdoor_seating","brewery"],moreFields:["smoking","opening_hours","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["dive","beer","bier","booze"],tags:{amenity:"bar"},name:"Bar"},"amenity/bbq":{icon:"maki-bbq",fields:["covered","fuel","access_simple"],moreFields:["lit"],geometry:["point"],terms:["bbq","grill"],tags:{amenity:"bbq"},name:"Barbecue/Grill"},"amenity/bench":{icon:"temaki-bench",fields:["backrest","material","seats","colour"],moreFields:["access_simple","inscription","lit"],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","fee"],moreFields:["payment_multi","covered"],geometry:["point","vertex","area"],terms:["bike"],tags:{amenity:"bicycle_parking"},name:"Bicycle Parking"},"amenity/bicycle_rental":{icon:"maki-bicycle",fields:["capacity","network","operator","fee","payment_multi"],moreFields:["opening_hours","address","website","phone","email","fax","wheelchair","covered"],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"],moreFields:["payment_multi","covered"],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","outdoor_seating","brewery"],moreFields:["{amenity/bar}"],geometry:["point","area"],tags:{amenity:"biergarten"},terms:["beer","bier","booze"],name:"Biergarten"},"amenity/boat_rental":{icon:"temaki-boating",fields:["name","operator","fee","payment_multi"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"boat_rental"},name:"Boat Rental"},"amenity/bureau_de_change":{icon:"maki-bank",fields:["name","operator","payment_multi","currency_multi","address","building_area"],moreFields:["opening_hours","website","phone","email","fax","wheelchair"],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","outdoor_seating"],moreFields:["diet_multi","takeaway","delivery","capacity","opening_hours","smoking","payment_multi","internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["bistro","coffee","tea"],tags:{amenity:"cafe"},name:"Cafe"},"amenity/car_pooling":{icon:"maki-car",fields:["name","operator","capacity","address","opening_hours","lit"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_pooling"},name:"Car Pooling"},"amenity/car_rental":{icon:"maki-car-rental",fields:["name","operator","address","opening_hours","payment_multi"],moreFields:["brand","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_rental"},name:"Car Rental"},"amenity/car_sharing":{icon:"maki-car",fields:["name","operator","capacity","address","payment_multi","supervised"],moreFields:["lit","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_sharing"},name:"Car Sharing"},"amenity/car_wash":{icon:"temaki-car_wash",fields:["address","building_area","opening_hours","payment_multi"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_wash"},name:"Car Wash"},"amenity/casino":{icon:"maki-casino",fields:["name","operator","address","building_area","opening_hours","smoking"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["gambling","roulette","craps","poker","blackjack"],tags:{amenity:"casino"},name:"Casino"},"amenity/charging_station":{icon:"fas-charging-station",fields:["name","operator","capacity","fee","payment_multi"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["website","phone","email","fax","wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["lit"],geometry:["point","vertex"],tags:{amenity:"clock"},name:"Clock"},"amenity/clock/sundial":{icon:"temaki-clock",fields:["name","support","visibility","inscription"],moreFields:[],geometry:["point","vertex"],terms:["gnomon","shadow"],tags:{amenity:"clock",display:"sundial"},reference:{key:"display",value:"sundial"},name:"Sundial"},"amenity/college":{icon:"maki-college",fields:["name","operator","address","website","internet_access"],moreFields:["religion","denomination","internet_access/fee","internet_access/ssid","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["university","undergraduate school"],tags:{amenity:"college"},name:"College Grounds"},"amenity/community_centre":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["event","hall"],tags:{amenity:"community_centre"},name:"Community Center"},"amenity/compressed_air":{icon:"maki-car",fields:["operator","fee","payment_multi","lit"],geometry:["point","area"],tags:{amenity:"compressed_air"},name:"Compressed Air"},"amenity/courthouse":{icon:"temaki-courthouse",fields:["name","operator","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"courthouse"},name:"Courthouse"},"amenity/crematorium":{icon:"maki-cemetery",fields:["name","website","phone","opening_hours","wheelchair"],moreFields:["address","website","phone","email","fax","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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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/dive_centre":{icon:"maki-swimming",fields:["name","operator","address","building_area","opening_hours","scuba_diving"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["diving","scuba"],tags:{amenity:"dive_centre"},name:"Dive Center"},"amenity/doctors":{icon:"maki-doctor",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["martial arts","dojang"],tags:{amenity:"dojo"},name:"Dojo / Martial Arts Academy"},"amenity/drinking_water":{icon:"maki-drinking-water",fields:["operator","access_simple","fee","wheelchair"],moreFields:["lit","covered"],geometry:["point"],tags:{amenity:"drinking_water"},terms:["potable water source","water fountain","drinking fountain","bubbler","water tap"],name:"Drinking Water"},"amenity/driving_school":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"driving_school"},name:"Driving School"},"amenity/embassy":{icon:"maki-embassy",fields:["name","country","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"embassy"},name:"Embassy"},"amenity/fast_food":{icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","drive_through"],moreFields:["opening_hours","diet_multi","takeaway","delivery","smoking","capacity","outdoor_seating","internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"fast_food"},terms:["restaurant","takeaway"],name:"Fast Food"},"amenity/fast_food/burger":{icon:"maki-fast-food",geometry:["point","area"],terms:["breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"burger"},reference:{key:"cuisine",value:"burger"},name:"Burger Fast Food"},"amenity/fast_food/chicken":{icon:"fas-drumstick-bite",geometry:["point","area"],terms:["breakfast","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"chicken"},reference:{key:"cuisine",value:"chicken"},name:"Chicken Fast Food"},"amenity/fast_food/fish_and_chips":{icon:"fas-fish",geometry:["point","area"],terms:["breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table","french fries"],tags:{amenity:"fast_food",cuisine:"fish_and_chips"},reference:{key:"cuisine",value:"fish_and_chips"},name:"Fish & Chips Fast Food"},"amenity/fast_food/kebab":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"kebab"},reference:{key:"cuisine",value:"kebab"},name:"Kebab Fast Food"},"amenity/fast_food/mexican":{icon:"fas-pepper-hot",geometry:["point","area"],terms:["breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","tacos","burritos","enchiladas","fajitas","nachos","tortillas","salsa","tamales","quesadillas"],tags:{amenity:"fast_food",cuisine:"mexican"},reference:{key:"cuisine",value:"mexican"},name:"Mexican Fast Food"},"amenity/fast_food/pizza":{icon:"maki-restaurant-pizza",geometry:["point","area"],terms:["dine","dining","dinner","drive-in","eat","lunch","table","deep dish","thin crust","slice"],tags:{amenity:"fast_food",cuisine:"pizza"},reference:{key:"cuisine",value:"pizza"},name:"Pizza Fast Food"},"amenity/fast_food/sandwich":{icon:"maki-restaurant",geometry:["point","area"],terms:["breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"sandwich"},reference:{key:"cuisine",value:"sandwich"},name:"Sandwich Fast Food"},"amenity/fire_station":{icon:"maki-fire-station",fields:["name","operator","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],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"],moreFields:["smoking","outdoor_seating","capacity","internet_access","internet_access/fee","internet_access/ssid","diet_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["fast food","restaurant","food"],tags:{amenity:"food_court"},name:"Food Court"},"amenity/fountain":{icon:"temaki-fountain",fields:["name","operator","lit"],geometry:["point","area"],tags:{amenity:"fountain"},name:"Fountain"},"amenity/fuel":{icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi"],moreFields:["opening_hours","payment_multi","building","website","phone","email","fax","wheelchair"],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","address"],moreFields:["website","phone","email","fax"],geometry:["point","area"],tags:{amenity:"grave_yard"},name:"Graveyard"},"amenity/grit_bin":{icon:"fas-box",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"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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","outdoor_seating"],moreFields:["takeaway","delivery","drive_through","internet_access","internet_access/fee","internet_access/ssid","diet_multi","payment_multi","website","phone","email","fax","wheelchair"],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","internet_access","internet_access/fee","internet_access/ssid"],moreFields:["opening_hours","smoking","outdoor_seating","payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["opening_hours","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["kindergarden","pre-school"],tags:{amenity:"kindergarten"},name:"Preschool/Kindergarten Grounds"},"amenity/language_school":{icon:"maki-school",fields:["name","operator","address","building_area","opening_hours","language_multi"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["esl"],tags:{amenity:"language_school"},name:"Language School"},"amenity/library":{icon:"maki-library",fields:["name","operator","building_area","address","ref/isil","internet_access"],moreFields:["access_simple","opening_hours","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair","payment_multi"],geometry:["point","area"],terms:["book"],tags:{amenity:"library"},name:"Library"},"amenity/love_hotel":{icon:"maki-heart",fields:["name","operator","address","building_area","rooms","internet_access"],moreFields:["smoking","payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"love_hotel"},name:"Love Hotel"},"amenity/marketplace":{icon:"maki-shop",fields:["name","operator","address","building","opening_hours"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"marketplace"},name:"Marketplace"},"amenity/monastery":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],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/money_transfer":{icon:"maki-bank",fields:["name","brand","address","building_area","payment_multi","currency_multi"],moreFields:["opening_hours","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["money order","check","bill","currency","finance","wire transfer","cable","person to person","cash to cash","exchange"],tags:{amenity:"money_transfer"},name:"Money Transfer Station"},"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","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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-car",fields:["operator","parking","capacity","access_simple","fee","surface"],moreFields:["name","supervised","park_ride","maxstay","payment_multi","address","website","phone","email","fax","wheelchair","covered"],geometry:["point","vertex","area"],tags:{amenity:"parking"},terms:["automobile parking","car lot","car parking","rv parking","truck parking","vehicle parking"],name:"Parking Lot"},"amenity/parking/multi-storey":{icon:"maki-car",fields:["{amenity/parking}","building","levels","height"],geometry:["area"],tags:{amenity:"parking",parking:"multi-storey"},addTags:{building:"parking",amenity:"parking",parking:"multi-storey"},removeTags:{building:"parking",amenity:"parking",parking:"multi-storey"},reference:{key:"parking",value:"multi-storey"},terms:["car","indoor parking","multistorey car park","parkade","parking building","parking deck","parking garage","parking ramp","parking structure"],name:"Multilevel Parking Garage"},"amenity/payment_centre":{icon:"maki-bank",fields:["name","brand","address","building_area","opening_hours","payment_multi"],moreFields:["currency_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["check","tax pay","bill pay","currency","finance","cash","money"],tags:{amenity:"payment_centre"},name:"Payment Center"},"amenity/payment_terminal":{icon:"maki-bank",fields:["name","brand","address","opening_hours","payment_multi"],moreFields:["currency_multi","wheelchair"],geometry:["point"],terms:["interactive kiosk","ekiosk","atm","bill pay","tax pay","phone pay","finance","cash","money transfer","card"],tags:{amenity:"payment_terminal"},name:"Payment Terminal"},"amenity/pharmacy":{icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","dispensing"],moreFields:["opening_hours","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"pharmacy"},addTags:{amenity:"pharmacy",healthcare:"pharmacy"},removeTags:{amenity:"pharmacy",healthcare:"pharmacy"},reference:{key:"amenity",value:"pharmacy"},terms:["apothecary","drug store","drugstore","med*","prescription"],name:"Pharmacy Counter"},"amenity/photo_booth":{icon:"maki-attraction",fields:["name","operator","payment_multi","wheelchair"],geometry:["point","area"],terms:["photobooth","photo","booth","kiosk","camera"],tags:{amenity:"photo_booth"},name:"Photo Booth"},"amenity/place_of_worship":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area","service_times"],moreFields:["opening_hours","internet_access","internet_access/ssid","website","phone","email","fax","wheelchair"],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-religious-buddhist",fields:["name","religion","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","religion","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:"Christian Church"},"amenity/place_of_worship/hindu":{icon:"temaki-hinduism",fields:["name","religion","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","religion","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:"Jewish Synagogue"},"amenity/place_of_worship/muslim":{icon:"maki-religious-muslim",fields:["name","religion","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:"Muslim Mosque"},"amenity/place_of_worship/shinto":{icon:"temaki-shinto",fields:["name","religion","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","religion","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","religion","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-globe",fields:["name","operator","address","building_area","opening_hours"],moreFields:["fee","payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["badge","constable","constabulary","cop","detective","fed","law","enforcement","officer","patrol"],tags:{amenity:"police"},name:"Police"},"amenity/post_box":{icon:"temaki-post_box",fields:["operator","collection_times","drive_through","ref"],moreFields:["wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["letter","mail"],tags:{amenity:"post_office"},name:"Post Office"},"amenity/prison":{icon:"maki-prison",fields:["name","operator","address"],moreFields:["website","phone","email","fax","wheelchair"],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","brewery"],moreFields:["outdoor_seating","diet_multi","payment_multi","internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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","fee"],moreFields:["opening_hours","payment_multi","website","phone","email","fax","wheelchair"],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","lit"],moreFields:["wheelchair"],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"],moreFields:["website","phone","email","fax","wheelchair"],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"],moreFields:["fee","payment_multi","website","phone","email","fax","wheelchair"],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_container":{icon:"maki-recycling",fields:["recycling_accepts","collection_times"],geometry:["point","area"],terms:["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],tags:{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","outdoor_seating"],moreFields:["takeaway","delivery","capacity","diet_multi","smoking","internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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/restaurant/american":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","coffee","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"american"},reference:{key:"cuisine",value:"american"},name:"American Restaurant"},"amenity/restaurant/asian":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"asian"},reference:{key:"cuisine",value:"asian"},name:"Asian Restaurant"},"amenity/restaurant/chinese":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"chinese"},reference:{key:"cuisine",value:"chinese"},name:"Chinese Restaurant"},"amenity/restaurant/french":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"french"},reference:{key:"cuisine",value:"french"},name:"French Restaurant"},"amenity/restaurant/german":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"german"},reference:{key:"cuisine",value:"german"},name:"German Restaurant"},"amenity/restaurant/greek":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","gyros","pitas","olives"],tags:{amenity:"restaurant",cuisine:"greek"},reference:{key:"cuisine",value:"greek"},name:"Greek Restaurant"},"amenity/restaurant/indian":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","curry"],tags:{amenity:"restaurant",cuisine:"indian"},reference:{key:"cuisine",value:"indian"},name:"Indian Restaurant"},"amenity/restaurant/italian":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","pasta","pizza"],tags:{amenity:"restaurant",cuisine:"italian"},reference:{key:"cuisine",value:"italian"},name:"Italian Restaurant"},"amenity/restaurant/japanese":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"japanese"},reference:{key:"cuisine",value:"japanese"},name:"Japanese Restaurant"},"amenity/restaurant/mexican":{icon:"fas-pepper-hot",geometry:["point","area"],terms:["bar","breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","tacos","burritos","enchiladas","fajitas","nachos","tortillas","salsa","tamales","quesadillas"],tags:{amenity:"restaurant",cuisine:"mexican"},reference:{key:"cuisine",value:"mexican"},name:"Mexican Restaurant"},"amenity/restaurant/noodle":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","ramen noodles","soup","soba noodles","cellophane noodles","rice noodles"],tags:{amenity:"restaurant",cuisine:"noodle"},reference:{key:"cuisine",value:"noodle"},name:"Noodle Restaurant"},"amenity/restaurant/pizza":{icon:"maki-restaurant-pizza",geometry:["point","area"],terms:["bar","dine","dining","dinner","drive-in","eat","lunch","table","deep dish","thin crust","slice"],tags:{amenity:"restaurant",cuisine:"pizza"},reference:{key:"cuisine",value:"pizza"},name:"Pizza Restaurant"},"amenity/restaurant/seafood":{icon:"maki-restaurant-seafood",geometry:["point","area"],terms:["bar","breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table","fish","shellfish","molluscs","crustaceans","clams","oysters","lobsters","crab","shrimp","squid","octopus"],tags:{amenity:"restaurant",cuisine:"seafood"},reference:{key:"cuisine",value:"seafood"},name:"Seafood Restaurant"},"amenity/restaurant/steakhouse":{icon:"maki-slaughterhouse",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","steak house","chop house","beef"],tags:{amenity:"restaurant",cuisine:"steak_house"},reference:{key:"cuisine",value:"steak_house"},name:"Steakhouse"},"amenity/restaurant/sushi":{icon:"fas-fish",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"sushi"},reference:{key:"cuisine",value:"sushi"},name:"Sushi Restaurant"},"amenity/restaurant/thai":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"thai"},reference:{key:"cuisine",value:"thai"},name:"Thai Restaurant"},"amenity/restaurant/turkish":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"turkish"},reference:{key:"cuisine",value:"turkish"},name:"Turkish Restaurant"},"amenity/restaurant/vietnamese":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"vietnamese"},reference:{key:"cuisine",value:"vietnamese"},name:"Vietnamese Restaurant"},"amenity/sanitary_dump_station":{icon:"temaki-storage_tank",fields:["operator","access_simple","fee","water_point"],moreFields:["payment_multi"],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","website"],moreFields:["internet_access","internet_access/ssid","phone","email","fax","wheelchair"],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"],moreFields:["lit","wheelchair"],geometry:["point","vertex","area"],terms:["lean-to","gazebo","picnic"],tags:{amenity:"shelter"},name:"Shelter"},"amenity/shelter/gazebo":{icon:"maki-shelter",fields:["name","building_area","bench","lit"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"gazebo"},name:"Gazebo"},"amenity/shelter/lean_to":{icon:"maki-shelter",fields:["name","operator","building_area"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"lean_to"},name:"Lean-To"},"amenity/shelter/picnic_shelter":{icon:"maki-shelter",fields:["name","shelter_type","building_area","lit","bin"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"picnic_shelter"},reference:{key:"shelter_type",value:"picnic_shelter"},terms:["pavilion"],name:"Picnic Shelter"},"amenity/shelter/public_transport":{icon:"maki-shelter",fields:["name","shelter_type","building_area","bench","lit"],geometry:["point","area"],terms:["bus stop","metro stop","waiting"],tags:{amenity:"shelter",shelter_type:"public_transport"},reference:{key:"shelter_type",value:"public_transport"},name:"Transit Shelter"},"amenity/shower":{icon:"temaki-shower",fields:["opening_hours","fee","supervised","building_area","access_simple","wheelchair"],moreFields:["operator","gender","payment_multi"],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"],moreFields:["lit","wheelchair","covered"],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"],moreFields:["opening_hours","wheelchair","internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax"],geometry:["point","area"],terms:[],tags:{amenity:"social_facility"},name:"Social Facility"},"amenity/social_facility/food_bank":{icon:"temaki-social_facility",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:["{amenity/social_facility}","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",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:["{amenity/social_facility}","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"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["recording","radio","television"],tags:{amenity:"studio"},name:"Studio"},"amenity/taxi":{icon:"fas-taxi",fields:["name","operator","capacity"],moreFields:["address","opening_hours","wheelchair"],geometry:["point","vertex","area"],terms:["cab"],tags:{amenity:"taxi"},name:"Taxi Stand"},"amenity/telephone":{icon:"maki-telephone",fields:["operator","phone","fee","payment_multi","booth"],moreFields:["covered","indoor","lit","wheelchair"],geometry:["point","vertex"],tags:{amenity:"telephone"},terms:["phone"],name:"Telephone"},"amenity/theatre":{icon:"maki-theatre",fields:["name","operator","address","building_area"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["theatre","performance","play","musical"],tags:{amenity:"theatre"},name:"Theater"},"amenity/theatre/type/amphi":{icon:"maki-theatre",fields:["name","operator","address","lit"],geometry:["point","area"],terms:["open air","outdoor","greek","ampi"],tags:{amenity:"theatre","theatre:type":"amphi"},name:"Amphitheatre"},"amenity/toilets":{icon:"maki-toilet",fields:["toilets/disposal","building_area","access_simple","gender","diaper","wheelchair"],moreFields:["fee","opening_hours","operator","payment_multi"],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"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["village","city","government","courthouse","municipal"],tags:{amenity:"townhall"},name:"Town Hall"},"amenity/university":{icon:"maki-college",fields:["{amenity/college}"],moreFields:["{amenity/college}"],geometry:["point","area"],terms:["college","graduate school","PhD program","master's degree program"],tags:{amenity:"university"},name:"University Grounds"},"amenity/vehicle_inspection":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["car inspection"],tags:{amenity:"vehicle_inspection"},name:"Vehicle Inspection"},"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",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",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",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",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",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",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:["{amenity/vending_machine}"],geometry:["point"],terms:["excrement bags","poop","waste","dog","animal"],tags:{amenity:"vending_machine",vending:"excrement_bags"},reference:{key:"vending",value:"excrement_bags"},name:"Excrement Bag Dispenser"},"amenity/vending_machine/feminine_hygiene":{icon:"temaki-vending_machine",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",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",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",matchScore:0.5},"amenity/vending_machine/ice_cream":{icon:"temaki-vending_machine",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:["mail","parcel","pickup"],tags:{amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},name:"Parcel Pickup/Dropoff Locker"},"amenity/vending_machine/parcel_pickup":{icon:"temaki-vending_machine",fields:["vending","operator"],geometry:["point"],terms:["amazon","locker","mail","parcel","pickup"],tags:{amenity:"vending_machine",vending:"parcel_pickup"},reference:{key:"vending",value:"parcel_pickup"},name:"Parcel Pickup Locker"},"amenity/vending_machine/parking_tickets":{icon:"temaki-vending_machine",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",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",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",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:"temaki-veterinary_care",fields:["name","operator","address","building_area","opening_hours"],moreFields:["fee","payment_multi","website","phone","email","fax","wheelchair"],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:["operator","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","fee","payment_multi"],moreFields:["website","phone","email","fax","wheelchair"],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",fields:["operator","fee","payment_multi"],geometry:["area","vertex","point"],tags:{amenity:"water_point"},name:"RV Drinking Water"},"amenity/watering_place":{icon:"maki-drinking-water",fields:["operator","fee","payment_multi"],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",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:["{attraction}","height"],geometry:["point"],terms:["ferris wheel","theme park","amusement ride"],tags:{attraction:"big_wheel"},name:"Big Wheel"},"attraction/bumper_car":{icon:"maki-car",geometry:["point","area"],terms:["theme park","dodgem cars","autoscooter"],tags:{attraction:"bumper_car"},name:"Bumper Car"},"attraction/bungee_jumping":{icon:"maki-pitch",fields:["{attraction}","height"],geometry:["point","area"],terms:["theme park","bungy jumping","jumping platform"],tags:{attraction:"bungee_jumping"},name:"Bungee Jumping"},"attraction/carousel":{icon:"temaki-amusement_park",fields:["{attraction}","building_area"],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:["{attraction}","building_area"],geometry:["point","line","area"],terms:["theme park","ghost train"],tags:{attraction:"dark_ride"},name:"Dark Ride"},"attraction/drop_tower":{icon:"temaki-tower",fields:["{attraction}","height"],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",geometry:["point","area"],terms:["theme park","amusement ride","labyrinth"],tags:{attraction:"maze"},name:"Maze"},"attraction/pirate_ship":{icon:"maki-danger",geometry:["point"],terms:["theme park","carnival ride","amusement ride"],tags:{attraction:"pirate_ship"},name:"Pirate Ship"},"attraction/river_rafting":{icon:"maki-ferry",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",geometry:["point","area"],terms:["theme park","amusement ride"],tags:{attraction:"roller_coaster"},name:"Roller Coaster"},"attraction/summer_toboggan":{geometry:["line"],terms:["alpine slide","mountain coaster"],tags:{attraction:"summer_toboggan"},name:"Summer Toboggan"},"attraction/train":{icon:"maki-rail",fields:["{attraction}","fee"],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:["{attraction}","height"],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","material"],geometry:["point","vertex"],tags:{barrier:"block"},name:"Block"},"barrier/bollard":{icon:"maki-roadblock",fields:["access","material"],geometry:["point","vertex","line"],tags:{barrier:"bollard"},name:"Bollard"},"barrier/border_control":{icon:"maki-roadblock",fields:["access","building_area"],moreFields:["address","website","phone","email","fax"],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:"temaki-wall",fields:["height","material"],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","material"],geometry:["line"],tags:{barrier:"fence"},name:"Fence",matchScore:0.25},"barrier/fence/railing":{icon:"temaki-railing",geometry:["line"],tags:{barrier:"fence",fence_type:"railing"},terms:["railing","handrail","guard rail"],name:"Railing",matchScore:0.5},"barrier/gate":{icon:"maki-barrier",fields:["access"],geometry:["vertex","line"],tags:{barrier:"gate"},name:"Gate"},"barrier/guard_rail":{icon:"temaki-guard_rail",fields:["material"],geometry:["line"],tags:{barrier:"guard_rail"},name:"Guard Rail",terms:["guardrail","traffic barrier","crash barrier","median barrier","roadside barrier","Armco barrier"],matchScore:0.75},"barrier/hedge":{fields:["height"],geometry:["line","area"],tags:{barrier:"hedge"},name:"Hedge",matchScore:0.25},"barrier/kerb":{fields:["kerb","tactile_paving"],moreFields:["material"],geometry:["vertex","line"],tags:{barrier:"kerb"},name:"Curb"},"barrier/kerb/flush":{icon:"maki-wheelchair",geometry:["vertex","line"],tags:{barrier:"kerb",kerb:"flush"},reference:{key:"kerb",value:"flush"},terms:["even curb","level curb","tactile curb"],name:"Flush Curb"},"barrier/kerb/lowered":{icon:"maki-wheelchair",geometry:["vertex","line"],tags:{barrier:"kerb",kerb:"lowered"},reference:{key:"kerb",value:"lowered"},terms:["curb cut","curb ramp","kerb ramp","dropped kerb","pram ramp"],name:"Lowered Curb"},"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":{icon:"temaki-wall",fields:["height","material"],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","payment_multi","currency_multi"],moreFields:["address","website","phone","email","fax"],geometry:["vertex","area"],tags:{barrier:"toll_booth"},name:"Toll Booth"},"barrier/wall":{icon:"temaki-wall",fields:["wall","height","material"],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"]},"bridge/support":{icon:"fas-archway",fields:["bridge/support"],moreFields:["material","seamark/type"],geometry:["point","vertex","area"],tags:{"bridge:support":"*"},name:"Bridge Support"},"bridge/support/pier":{icon:"fas-archway",fields:["bridge/support"],moreFields:["material","seamark/type"],geometry:["point","vertex","area"],tags:{"bridge:support":"pier"},name:"Bridge Pier"},building:{icon:"maki-home",fields:["name","building","levels","height","address"],moreFields:["architect","building/material","layer","roof/colour","smoking","wheelchair"],geometry:["point","area"],tags:{building:"*"},matchScore:0.6,terms:[],name:"Building"},"building/bunker":{geometry:["area"],tags:{building:"bunker"},matchScore:0.5,name:"Bunker",searchable:false},"building/entrance":{icon:"maki-entrance-alt1",fields:[],moreFields:[],geometry:["vertex"],tags:{building:"entrance"},name:"Entrance/Exit",searchable:false},"building/train_station":{icon:"maki-building",geometry:["point","vertex","area"],tags:{building:"train_station"},matchScore:0.5,name:"Train Station Building",searchable:false},"building/apartments":{icon:"maki-building",geometry:["area"],tags:{building:"apartments"},matchScore:0.5,name:"Apartment Building"},"building/barn":{icon:"maki-farm",geometry:["area"],tags:{building:"barn"},matchScore:0.5,name:"Barn"},"building/boathouse":{icon:"maki-harbor",geometry:["area"],tags:{building:"boathouse"},matchScore:0.5,terms:[],name:"Boathouse"},"building/bungalow":{icon:"maki-home",geometry:["area"],tags:{building:"bungalow"},terms:["home","detached"],matchScore:0.5,name:"Bungalow"},"building/cabin":{icon:"maki-home",geometry:["area"],tags:{building:"cabin"},matchScore:0.5,name:"Cabin"},"building/carport":{icon:"fas-warehouse",fields:["height","capacity"],geometry:["area"],tags:{building:"carport"},matchScore:0.5,terms:["covered parking space","garage","car","porch"],name:"Carport"},"building/cathedral":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"cathedral"},matchScore:0.5,name:"Cathedral Building"},"building/chapel":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"chapel"},matchScore:0.5,name:"Chapel Building"},"building/church":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"church"},matchScore:0.5,name:"Church Building"},"building/civic":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"civic"},matchScore:0.5,name:"Civic Building"},"building/college":{icon:"maki-building",geometry:["area"],terms:["university"],tags:{building:"college"},matchScore:0.5,name:"College Building"},"building/commercial":{icon:"maki-suitcase",fields:["{building}","smoking"],geometry:["area"],tags:{building:"commercial"},matchScore:0.5,name:"Commercial Building"},"building/construction":{icon:"maki-building",geometry:["area"],tags:{building:"construction"},matchScore:0.5,name:"Building Under Construction"},"building/detached":{icon:"maki-home",geometry:["area"],tags:{building:"detached"},terms:["home","single","family","residence","dwelling"],matchScore:0.5,name:"Detached House"},"building/dormitory":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"dormitory"},matchScore:0.5,name:"Dormitory"},"building/farm_auxiliary":{icon:"maki-farm",geometry:["area"],tags:{building:"farm_auxiliary"},matchScore:0.5,name:"Farm Building"},"building/farm":{icon:"maki-farm",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-centre",geometry:["area"],tags:{building:"greenhouse"},matchScore:0.5,name:"Greenhouse"},"building/hospital":{icon:"maki-building",geometry:["area"],tags:{building:"hospital"},matchScore:0.5,name:"Hospital Building"},"building/hotel":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"hotel"},matchScore:0.5,name:"Hotel Building"},"building/house":{icon:"maki-home",geometry:["area"],tags:{building:"house"},terms:["home","family","residence","dwelling"],matchScore:0.5,name:"House"},"building/hut":{icon:"maki-home",fields:["name"],geometry:["area"],tags:{building:"hut"},matchScore:0.5,name:"Hut"},"building/industrial":{icon:"maki-industry",geometry:["area"],tags:{building:"industrial"},matchScore:0.5,name:"Industrial Building"},"building/kindergarten":{icon:"maki-building",geometry:["area"],terms:["kindergarden","pre-school"],tags:{building:"kindergarten"},matchScore:0.5,name:"Preschool/Kindergarten Building"},"building/mosque":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"mosque"},matchScore:0.5,name:"Mosque Building"},"building/pavilion":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],terms:["sports"],tags:{building:"pavilion"},matchScore:0.5,name:"Pavilion Building"},"building/public":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"public"},matchScore:0.5,name:"Public Building"},"building/residential":{icon:"maki-residential-community",geometry:["area"],tags:{building:"residential"},matchScore:0.5,name:"Residential Building"},"building/retail":{icon:"maki-commercial",fields:["{building}","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",geometry:["area"],tags:{building:"ruins"},matchScore:0.5,name:"Building Ruins"},"building/school":{icon:"maki-building",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",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",geometry:["area"],tags:{building:"service"},matchScore:0.5,name:"Service Building"},"building/shed":{icon:"maki-home",geometry:["area"],tags:{building:"shed"},matchScore:0.5,name:"Shed"},"building/stable":{icon:"maki-horse-riding",geometry:["area"],tags:{building:"stable"},matchScore:0.5,name:"Stable"},"building/stadium":{icon:"maki-stadium",fields:["{building}","smoking"],geometry:["area"],tags:{building:"stadium"},matchScore:0.5,name:"Stadium Building"},"building/static_caravan":{icon:"maki-home",geometry:["area"],tags:{building:"static_caravan"},matchScore:0.5,name:"Static Mobile Home"},"building/temple":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"temple"},matchScore:0.5,name:"Temple Building"},"building/terrace":{icon:"maki-building",geometry:["area"],tags:{building:"terrace"},terms:["home","terrace","brownstone","family","residence","dwelling"],matchScore:0.5,name:"Row Houses"},"building/transportation":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"transportation"},matchScore:0.5,name:"Transportation Building"},"building/university":{icon:"maki-building",geometry:["area"],terms:["college"],tags:{building:"university"},matchScore:0.5,name:"University Building"},"building/warehouse":{icon:"maki-warehouse",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:"fas-handshake",fields:["name","club","operator","address","building_area","opening_hours"],moreFields:["access_simple","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{club:"*"},terms:["social"],name:"Club"},"club/sport":{icon:"maki-pitch",fields:["name","sport","{club}"],geometry:["point","area"],tags:{club:"sport"},terms:["athletics club","sporting club","sports association","sports society"],name:"Sports Club"},craft:{icon:"temaki-tools",fields:["name","craft","operator","address","building_area","opening_hours"],moreFields:["product","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{craft:"*"},terms:[],name:"Craft"},"craft/jeweler":{icon:"maki-marker-stroked",geometry:["point","area"],tags:{craft:"jeweler"},reference:{key:"shop",value:"jewelry"},name:"Jeweler",searchable:false},"craft/locksmith":{icon:"maki-marker-stroked",geometry:["point","area"],tags:{craft:"locksmith"},reference:{key:"shop",value:"locksmith"},name:"Locksmith",searchable:false},"craft/optician":{icon:"maki-marker-stroked",geometry:["point","area"],tags:{craft:"optician"},reference:{key:"shop",value:"optician"},name:"Optician",searchable:false},"craft/tailor":{icon:"maki-clothing-store",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",geometry:["point","area"],tags:{craft:"basket_maker"},name:"Basket Maker"},"craft/beekeeper":{icon:"maki-farm",geometry:["point","area"],tags:{craft:"beekeeper"},name:"Beekeeper"},"craft/blacksmith":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"blacksmith"},name:"Blacksmith"},"craft/boatbuilder":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"boatbuilder"},matchScore:0.4,name:"Boat Builder"},"craft/bookbinder":{icon:"maki-library",geometry:["point","area"],terms:["book repair"],tags:{craft:"bookbinder"},name:"Bookbinder"},"craft/brewery":{icon:"temaki-storage_tank",fields:["{craft}","product"],geometry:["point","area"],terms:["alcohol","beer","beverage","bier","booze","cider"],tags:{craft:"brewery"},name:"Brewery"},"craft/carpenter":{icon:"temaki-tools",geometry:["point","area"],terms:["woodworker"],tags:{craft:"carpenter"},name:"Carpenter"},"craft/carpet_layer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"carpet_layer"},name:"Carpet Layer"},"craft/caterer":{icon:"maki-restaurant",fields:["name","cuisine","{craft}"],geometry:["point","area"],tags:{craft:"caterer"},name:"Caterer"},"craft/chimney_sweeper":{icon:"temaki-chimney",geometry:["point","area"],tags:{craft:"chimney_sweeper"},name:"Chimney Sweeper"},"craft/clockmaker":{icon:"temaki-clock",geometry:["point","area"],tags:{craft:"clockmaker"},name:"Clockmaker"},"craft/confectionery":{icon:"maki-confectionery",geometry:["point","area"],terms:["sweet","candy"],tags:{craft:"confectionery"},name:"Candy Maker"},"craft/distillery":{icon:"temaki-storage_tank",fields:["{craft}","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",geometry:["point","area"],terms:["seamstress"],tags:{craft:"dressmaker"},name:"Dressmaker"},"craft/electrician":{icon:"temaki-power",geometry:["point","area"],terms:["power","wire"],tags:{craft:"electrician"},name:"Electrician"},"craft/electronics_repair":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"electronics_repair"},name:"Electronics Repair Shop"},"craft/gardener":{icon:"maki-garden-centre",geometry:["point","area"],terms:["landscaper","grounds keeper"],tags:{craft:"gardener"},name:"Gardener"},"craft/glaziery":{icon:"temaki-window",geometry:["point","area"],terms:["glass","stained-glass","window"],tags:{craft:"glaziery"},name:"Glaziery"},"craft/handicraft":{icon:"maki-art-gallery",geometry:["point","area"],tags:{craft:"handicraft"},name:"Handicraft"},"craft/hvac":{icon:"temaki-tools",geometry:["point","area"],terms:["heat*","vent*","air conditioning"],tags:{craft:"hvac"},name:"HVAC"},"craft/insulator":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"insulation"},name:"Insulator"},"craft/key_cutter":{icon:"fas-key",geometry:["point","area"],tags:{craft:"key_cutter"},name:"Key Cutter"},"craft/metal_construction":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"metal_construction"},name:"Metal Construction"},"craft/painter":{icon:"fas-paint-roller",geometry:["point","area"],tags:{craft:"painter"},name:"Painter"},"craft/photographer":{icon:"maki-attraction",geometry:["point","area"],tags:{craft:"photographer"},name:"Photographer"},"craft/photographic_laboratory":{icon:"maki-attraction",geometry:["point","area"],terms:["film"],tags:{craft:"photographic_laboratory"},name:"Photographic Laboratory"},"craft/plasterer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"plasterer"},name:"Plasterer"},"craft/plumber":{icon:"temaki-plumber",geometry:["point","area"],terms:["pipe"],tags:{craft:"plumber"},name:"Plumber"},"craft/pottery":{icon:"maki-art-gallery",geometry:["point","area"],terms:["ceramic"],tags:{craft:"pottery"},name:"Pottery"},"craft/rigger":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"rigger"},name:"Rigger"},"craft/roofer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"roofer"},name:"Roofer"},"craft/saddler":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"saddler"},name:"Saddler"},"craft/sailmaker":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"sailmaker"},name:"Sailmaker"},"craft/sawmill":{icon:"maki-logging",geometry:["point","area"],terms:["lumber"],tags:{craft:"sawmill"},name:"Sawmill"},"craft/scaffolder":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"scaffolder"},name:"Scaffolder"},"craft/sculptor":{icon:"maki-art-gallery",geometry:["point","area"],tags:{craft:"sculptor"},name:"Sculptor"},"craft/shoemaker":{icon:"maki-shoe",geometry:["point","area"],terms:["cobbler"],tags:{craft:"shoemaker"},name:"Shoemaker"},"craft/stonemason":{icon:"temaki-tools",geometry:["point","area"],terms:["masonry"],tags:{craft:"stonemason"},name:"Stonemason"},"craft/tiler":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"tiler"},name:"Tiler"},"craft/tinsmith":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"tinsmith"},name:"Tinsmith"},"craft/upholsterer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"upholsterer"},name:"Upholsterer"},"craft/watchmaker":{icon:"maki-watch",geometry:["point","area"],tags:{craft:"watchmaker"},name:"Watchmaker"},"craft/window_construction":{icon:"temaki-window",geometry:["point","area"],terms:["glass"],tags:{craft:"window_construction"},name:"Window Construction"},"craft/winery":{icon:"maki-alcohol-shop",geometry:["point","area"],tags:{craft:"winery"},name:"Winery"},"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"],moreFields:["website","phone","email","fax","wheelchair"],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:["ref","fire_hydrant/type","colour","water_source","couplings"],moreFields:["fire_hydrant/pressure","fire_hydrant/diameter","water_volume","survey/date"],geometry:["point","vertex"],terms:["fire plug","fire water well","hydrant"],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"},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/cartpath_service":{icon:"maki-golf",fields:["{golf/path}","maxspeed"],geometry:["line"],tags:{highway:"service",golf:"cartpath",golf_cart:"designated"},reference:{key:"golf",value:"cartpath"},name:"Golf Cartpath / Service Road"},"golf/cartpath":{icon:"maki-golf",fields:["{golf/path}"],geometry:["line"],tags:{golf:"cartpath",golf_cart:"designated"},reference:{key:"golf",value:"cartpath"},name:"Golf Cartpath"},"golf/driving_range":{icon:"maki-golf",fields:["name","capacity"],geometry:["area"],tags:{golf:"driving_range",landuse:"grass"},reference:{key:"golf",value:"driving_range"},name:"Driving Range"},"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":{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/path":{icon:"maki-golf",fields:["name","surface","width","structure","incline"],geometry:["line"],tags:{golf:"path",foot:"designated"},reference:{key:"golf",value:"path"},name:"Golf Walking Path"},"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":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"water_hazard",natural:"water"},reference:{key:"golf",value:"water_hazard"},name:"Water Hazard"},healthcare:{icon:"maki-hospital",fields:["name","healthcare","operator","healthcare/speciality","address","building_area"],moreFields:["opening_hours","payment_multi","brand","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{healthcare:"*"},terms:["clinic","doctor","disease","health","institution","sick","surgery","wellness"],name:"Healthcare Facility"},"healthcare/alternative":{icon:"maki-hospital",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",geometry:["point","area"],terms:["back","pain","spine"],tags:{healthcare:"alternative","healthcare:speciality":"chiropractic"},name:"Chiropractor"},"healthcare/audiologist":{icon:"maki-hospital",geometry:["point","area"],terms:["ear","hearing","sound"],tags:{healthcare:"audiologist"},name:"Audiologist"},"healthcare/birthing_center":{icon:"maki-hospital",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:["{healthcare}","blood_components"],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",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",geometry:["point","area"],terms:["baby","childbirth","delivery","labour","labor","pregnancy"],tags:{healthcare:"midwife"},name:"Midwife"},"healthcare/occupational_therapist":{icon:"maki-hospital",geometry:["point","area"],terms:["therapist","therapy"],tags:{healthcare:"occupational_therapist"},name:"Occupational Therapist"},"healthcare/optometrist":{icon:"maki-hospital",geometry:["point","area"],terms:["eye","glasses","lasik","lenses","vision"],tags:{healthcare:"optometrist"},name:"Optometrist"},"healthcare/physiotherapist":{icon:"temaki-physiotherapist",geometry:["point","area"],terms:["physical","therapist","therapy"],tags:{healthcare:"physiotherapist"},name:"Physiotherapist"},"healthcare/podiatrist":{icon:"maki-hospital",geometry:["point","area"],terms:["foot","feet","nails"],tags:{healthcare:"podiatrist"},name:"Podiatrist"},"healthcare/psychotherapist":{icon:"maki-hospital",geometry:["point","area"],terms:["anxiety","counselor","depression","mental health","mind","suicide","therapist","therapy"],tags:{healthcare:"psychotherapist"},name:"Psychotherapist"},"healthcare/rehabilitation":{icon:"maki-hospital",geometry:["point","area"],terms:["rehab","therapist","therapy"],tags:{healthcare:"rehabilitation"},name:"Rehabilitation Facility"},"healthcare/speech_therapist":{icon:"maki-hospital",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","incline","horse_scale"],moreFields:["wheelchair","lit","smoothness","covered","dog"],icon:"maki-horse-riding",geometry:["line"],tags:{highway:"bridleway"},terms:["bridleway","equestrian","horse","trail"],name:"Bridle Path"},"highway/bus_guideway":{icon:"maki-bus",fields:["name","operator","oneway","structure","covered"],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/construction":{icon:"maki-barrier",fields:["name","opening_date","check_date","note","oneway","structure","access"],geometry:["line"],tags:{highway:"construction",access:"no"},terms:["closed","closure","construction"],name:"Road Closed"},"highway/corridor":{icon:"temaki-pedestrian",fields:["name","width","level","access_simple","wheelchair"],moreFields:["maxheight"],geometry:["line"],tags:{highway:"corridor"},terms:["gallery","hall","hallway","indoor","passage","passageway"],name:"Indoor Corridor"},"highway/crossing/zebra-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","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)",searchable:false},"highway/crossing/zebra":{icon:"temaki-pedestrian",fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"zebra"},reference:{key:"highway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk",searchable:false},"highway/crossing/marked-raised":{icon:"temaki-pedestrian",fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"marked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)"},"highway/crossing/marked":{icon:"temaki-pedestrian",fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"marked"},reference:{key:"highway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk"},"highway/crossing/unmarked-raised":{fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],addTags:{highway:"crossing",crossing:"unmarked",traffic_calming:"table"},removeTags:{highway:"crossing",crossing:"unmarked",traffic_calming:"table"},tags:{highway:"crossing",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["flat top","hump","speed","slow"],name:"Unmarked Crossing (Raised)"},"highway/crossing/unmarked":{fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],addTags:{highway:"crossing",crossing:"unmarked"},removeTags:{highway:"crossing",crossing:"unmarked"},tags:{highway:"crossing"},reference:{key:"highway",value:"crossing"},terms:[],name:"Unmarked Crossing"},"highway/cycleway":{icon:"maki-bicycle",fields:["name","oneway","surface","width","structure","access","incline"],moreFields:["wheelchair","lit","smoothness","maxspeed","covered","dog"],geometry:["line"],tags:{highway:"cycleway"},terms:["bike"],name:"Cycle Path"},"highway/elevator":{icon:"temaki-elevator",fields:["access_simple","opening_hours","maxweight","ref","wheelchair"],moreFields:["maxheight"],geometry:["vertex"],tags:{highway:"elevator"},terms:["lift"],name:"Elevator"},"highway/footway":{icon:"temaki-pedestrian",fields:["name","surface","width","structure","access","incline"],moreFields:["wheelchair","lit","smoothness","covered","dog"],geometry:["line"],terms:["hike","hiking","trackway","trail","walk"],tags:{highway:"footway"},name:"Foot Path"},"highway/footway/zebra-raised":{icon:"temaki-pedestrian",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","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)",searchable:false},"highway/footway/zebra":{icon:"temaki-pedestrian",fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"zebra"},reference:{key:"footway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk",searchable:false},"highway/footway/conveying":{icon:"temaki-pedestrian",fields:["name","conveying","access_simple","lit","width","wheelchair"],geometry:["line"],terms:["moving sidewalk","autwalk","skywalk","travolator","travelator","travellator","conveyor"],tags:{highway:"footway",conveying:"*"},name:"Moving Walkway"},"highway/footway/marked-raised":{icon:"temaki-pedestrian",fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"marked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)"},"highway/footway/marked":{icon:"temaki-pedestrian",fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"marked"},reference:{key:"footway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk"},"highway/footway/sidewalk":{icon:"temaki-pedestrian",geometry:["line"],tags:{highway:"footway",footway:"sidewalk"},reference:{key:"footway",value:"sidewalk"},terms:["pavement","sidepath"],name:"Sidewalk"},"highway/footway/unmarked-raised":{fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],addTags:{highway:"footway",footway:"crossing",crossing:"unmarked",traffic_calming:"table"},removeTags:{highway:"footway",footway:"crossing",crossing:"unmarked",traffic_calming:"table"},tags:{highway:"footway",footway:"crossing",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["flat top","hump","speed","slow"],name:"Unmarked Crossing (Raised)"},"highway/footway/unmarked":{fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],addTags:{highway:"footway",footway:"crossing",crossing:"unmarked"},removeTags:{highway:"footway",footway:"crossing",crossing:"unmarked"},tags:{highway:"footway",footway:"crossing"},reference:{key:"footway",value:"crossing"},terms:[],name:"Unmarked Crossing"},"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","access"],moreFields:["cycleway","maxheight","covered","junction_line","lit","smoothness","oneway/bicycle"],geometry:["line"],tags:{highway:"living_street"},name:"Living Street"},"highway/milestone":{icon:"temaki-milestone",geometry:["point","vertex"],fields:["distance","direction_vertex"],tags:{highway:"milestone"},terms:["milestone","marker"],name:"Highway Milestone"},"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:["destination_oneway","destination/ref_oneway","junction/ref_oneway","oneway","maxspeed","lanes","surface","structure","access"],moreFields:["covered","destination/symbol_oneway","junction_line","lit","maxheight","maxspeed/advisory","name","ref_road_number","smoothness","toll"],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","access"],moreFields:["toll","maxheight","covered","lit","smoothness","minspeed","junction_line"],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-other-line",fields:["name","surface","width","structure","access","incline"],moreFields:["wheelchair","lit","smoothness","trail_visibility","sac_scale","mtb/scale","mtb/scale/uphill","mtb/scale/imba","horse_scale","covered","ref","dog"],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:"temaki-pedestrian",fields:["name","surface","lit","width","oneway","structure","access"],moreFields:["covered","smoothness"],geometry:["line"],tags:{highway:"pedestrian"},terms:["center","centre","plaza","quad","square","walkway"],name:"Pedestrian Street"},"highway/primary_link":{icon:"iD-highway-primary-link",fields:["destination_oneway","destination/ref_oneway","oneway","maxspeed","lanes","surface","structure","access"],moreFields:["covered","cycleway","destination/symbol_oneway","junction/ref_oneway","junction_line","lit","maxheight","maxspeed/advisory","name","oneway/bicycle","ref_road_number","smoothness","toll"],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","ref_road_number","access"],moreFields:["covered","cycleway","junction_line","lit","maxheight","maxspeed/advisory","oneway/bicycle","smoothness","toll"],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","access"],moreFields:["covered","cycleway","junction_line","lit","oneway/bicycle","maxheight","maxspeed/advisory","smoothness"],geometry:["line"],tags:{highway:"residential"},terms:["road","street"],name:"Residential Road"},"highway/rest_area":{icon:"maki-car",fields:["name","operator","opening_hours"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["point","vertex","area"],tags:{highway:"rest_area"},terms:["rest stop"],name:"Rest Area"},"highway/road":{icon:"iD-other-line",fields:["{highway/residential}"],moreFields:["{highway/residential}"],geometry:["line"],tags:{highway:"road"},terms:["road","street"],name:"Unknown Road"},"highway/secondary_link":{icon:"iD-highway-secondary-link",fields:["{highway/primary_link}"],moreFields:["{highway/primary_link}"],geometry:["line"],tags:{highway:"secondary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Secondary Link"},"highway/secondary":{icon:"iD-highway-secondary",fields:["{highway/primary}"],moreFields:["{highway/primary}"],geometry:["line"],tags:{highway:"secondary"},terms:["road","street"],name:"Secondary Road"},"highway/service":{icon:"iD-highway-service",fields:["name","service","oneway","maxspeed","surface","structure","access"],moreFields:["covered","lanes","lit","maxheight","maxspeed/advisory","oneway/bicycle"],geometry:["line"],tags:{highway:"service"},terms:["road","street"],name:"Service Road"},"highway/service/alley":{icon:"iD-highway-service",geometry:["line"],tags:{highway:"service",service:"alley"},reference:{key:"service",value:"alley"},name:"Alley"},"highway/service/drive-through":{icon:"iD-highway-service",fields:["{highway/service}","covered"],geometry:["line"],tags:{highway:"service",service:"drive-through"},reference:{key:"service",value:"drive-through"},name:"Drive-Through"},"highway/service/driveway":{icon:"iD-highway-service",geometry:["line"],tags:{highway:"service",service:"driveway"},reference:{key:"service",value:"driveway"},name:"Driveway"},"highway/service/emergency_access":{icon:"iD-highway-service",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",geometry:["line"],tags:{highway:"service",service:"parking_aisle"},reference:{key:"service",value:"parking_aisle"},name:"Parking Aisle"},"highway/services":{icon:"maki-car",fields:["{highway/rest_area}"],moreFields:["{highway/rest_area}"],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","maxspeed"],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/steps/conveying":{icon:"maki-entrance",fields:["name","incline_steps","conveying","access_simple","lit","width","handrail","step_count"],geometry:["line"],terms:["moving staircase","moving stairway","people mover"],tags:{highway:"steps",conveying:"*"},name:"Escalator"},"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:["{highway/primary_link}"],moreFields:["{highway/primary_link}"],geometry:["line"],tags:{highway:"tertiary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Tertiary Link"},"highway/tertiary":{icon:"iD-highway-tertiary",fields:["{highway/primary}"],moreFields:["{highway/primary}"],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"],moreFields:["mtb/scale","mtb/scale/uphill","mtb/scale/imba","horse_scale","covered"],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:["{highway/motorway_link}"],moreFields:["{highway/motorway_link}"],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","access"],moreFields:["toll","maxheight","covered","lit","smoothness","minspeed","junction_line"],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:["{highway/residential}"],moreFields:["{highway/residential}"],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","access_simple"],geometry:["point","vertex","area"],tags:{historic:"archaeological_site"},name:"Archaeological Site"},"historic/boundary_stone":{icon:"temaki-milestone",fields:["name","inscription"],moreFields:["material"],geometry:["point","vertex"],tags:{historic:"boundary_stone"},name:"Boundary Stone"},"historic/castle":{icon:"maki-castle",fields:["name","castle_type","building_area","historic/civilization","access_simple"],geometry:["point","area"],tags:{historic:"castle"},name:"Castle"},"historic/memorial":{icon:"maki-monument",fields:["name","memorial","inscription"],moreFields:["material","website"],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","access_simple"],moreFields:["material"],geometry:["point","vertex","area"],tags:{historic:"monument"},name:"Monument"},"historic/ruins":{icon:"temaki-ruins",fields:["name","historic/civilization","inscription","access_simple"],geometry:["point","vertex","area"],tags:{historic:"ruins"},name:"Ruins"},"historic/tomb":{icon:"maki-cemetery",fields:["name","tomb","building_area","inscription","access_simple"],geometry:["point","area"],tags:{historic:"tomb"},name:"Tomb"},"historic/wayside_cross":{icon:"maki-religious-christian",fields:["name","inscription"],moreFields:["material"],geometry:["point","vertex","area"],tags:{historic:"wayside_cross"},name:"Wayside Cross"},"historic/wayside_shrine":{icon:"maki-landmark",fields:["name","religion","denomination","inscription","access_simple"],geometry:["point","vertex","area"],tags:{historic:"wayside_shrine"},name:"Wayside Shrine"},"historic/wreck":{icon:"temaki-ruins",fields:["name","access_simple","seamark/wreck/category","historic/wreck/date_sunk","historic/wreck/visible_at_low_tide","historic/wreck/visible_at_high_tide"],moreFields:["seamark/type"],geometry:["point","area"],tags:{historic:"wreck"},addTags:{historic:"wreck","seamark:type":"wreck"},removeTags:{historic:"wreck","seamark:type":"wreck"},terms:["hull","mast","maritime","remains","ship","boat"],name:"Shipwreck"},"internet_access/wlan":{icon:"fas-wifi",geometry:["point","area"],fields:["internet_access/fee","internet_access/ssid"],terms:["wi-fi","wifi","hotspot"],tags:{internet_access:"wlan"},matchScore:0.25,name:"Wi-Fi Hotspot"},junction:{icon:"temaki-junction",fields:["name"],geometry:["vertex","area"],tags:{junction:"yes"},name:"Junction"},"landuse/basin":{icon:"maki-water",fields:["name","basin","intermittent_yes"],geometry:["area"],tags:{landuse:"basin"},name:"Basin",searchable:false},"landuse/farm":{icon:"maki-farm",fields:["name","operator","crop"],geometry:["point","area"],tags:{landuse:"farm"},name:"Farmland",searchable:false},"landuse/pond":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{landuse:"pond"},name:"Pond",searchable:false},"landuse/reservoir":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{landuse:"reservoir"},name:"Reservoir",searchable:false},"landuse/allotments":{icon:"maki-garden-centre",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"allotments"},terms:["allotment","garden"],name:"Community Garden"},"landuse/aquaculture":{icon:"maki-aquarium",fields:["name","operator","produce"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"aquaculture"},terms:["fish farm","crustacean","algae","aquafarming","shrimp farm","oyster farm","mariculture","algaculture"],name:"Aquaculture"},"landuse/brownfield":{geometry:["area"],fields:["name"],tags:{landuse:"brownfield"},terms:[],matchScore:0.9,name:"Brownfield"},"landuse/cemetery":{icon:"maki-cemetery",fields:["name","religion","denomination"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"cemetery"},terms:[],name:"Cemetery"},"landuse/churchyard":{icon:"maki-religious-christian",fields:["name","religion","denomination"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"churchyard"},terms:[],name:"Churchyard"},"landuse/commercial":{icon:"maki-suitcase",fields:["name"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"commercial"},terms:[],matchScore:0.9,name:"Commercial Area"},"landuse/construction":{icon:"temaki-tools",fields:["name","construction","operator"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"construction"},terms:[],name:"Construction"},"landuse/farmland":{icon:"maki-farm",fields:["name","operator","crop","produce"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"farmland"},terms:["crop","grow","plant"],name:"Farmland"},"landuse/farmyard":{icon:"maki-farm",fields:["name","operator","crop"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"farmyard"},terms:["crop","grow","plant"],name:"Farmyard"},"landuse/forest":{icon:"maki-park-alt1",fields:["name","leaf_type","leaf_cycle","produce"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"forest"},terms:["cut","forest","forestry","lumber","silviculture","tree"],name:"Managed Forest"},"landuse/garages":{icon:"fas-warehouse",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],geometry:["area"],terms:["boat"],tags:{landuse:"harbour"},name:"Harbor"},"landuse/industrial":{icon:"maki-industry",fields:["name","industrial"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"orchard"},terms:["fruit"],name:"Orchard"},"landuse/plant_nursery":{icon:"maki-garden",fields:["name","operator","plant"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"plant_nursery"},terms:["flower","garden","grow","vivero"],name:"Plant Nursery"},"landuse/quarry":{geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"recreation_ground"},terms:["playing fields"],name:"Recreation Ground"},"landuse/religious":{icon:"maki-place-of-worship",geometry:["area"],fields:["name","religion","denomination"],moreFields:["address","website","phone","email","fax"],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/residential/apartments":{icon:"maki-building",fields:["name","operator","address"],geometry:["point","area"],tags:{residential:"apartments"},addTags:{landuse:"residential",residential:"apartments"},removeTags:{landuse:"residential",residential:"apartments"},reference:{key:"residential",value:"apartments"},terms:["flat","residence","tenement"],name:"Apartment Complex"},"landuse/retail":{icon:"maki-commercial",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"retail"},matchScore:0.9,name:"Retail Area"},"landuse/vineyard":{fields:["name","operator","grape_variety"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"vineyard"},addTags:{landuse:"vineyard",crop:"grape"},removeTags:{landuse:"vineyard",crop:"grape",grape_variety:"*"},terms:["grape","wine"],name:"Vineyard"},"leisure/adult_gaming_centre":{icon:"temaki-casino",fields:["{amenity/casino}"],moreFields:["{amenity/casino}"],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"],moreFields:["opening_hours","payment_multi","smoking","website","phone","email","fax"],geometry:["point","area"],terms:["pay-to-play games","video games","driving simulators","pinball machines"],tags:{leisure:"amusement_arcade"},name:"Amusement Arcade"},"leisure/bandstand":{icon:"maki-music",fields:["name","building_area","operator"],moreFields:["website"],geometry:["point","area"],tags:{leisure:"bandstand"},name:"Bandstand"},"leisure/beach_resort":{icon:"maki-beach",fields:["name","address","fee"],moreFields:["opening_hours","payment_multi","smoking","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"beach_resort"},name:"Beach Resort"},"leisure/bird_hide":{icon:"temaki-binoculars",fields:["name","building_area","address","opening_hours"],moreFields:["website"],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"],moreFields:["opening_hours","payment_multi","smoking","website","phone","email","fax"],geometry:["point","area"],terms:["bowling center"],tags:{leisure:"bowling_alley"},name:"Bowling Alley"},"leisure/common":{icon:"temaki-pedestrian",fields:["name"],moreFields:["website"],geometry:["point","area"],terms:["open space"],tags:{leisure:"common"},name:"Common"},"leisure/dance":{icon:"maki-music",fields:["name","operator","address","building_area","dance/style"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],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","building_area","dance/style"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],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",fields:["name"],moreFields:["website","phone","email","fax"],geometry:["point","area"],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/fishing":{icon:"fas-fish",fields:["name","access_simple"],geometry:["point","area"],tags:{leisure:"fishing"},terms:["angler"],name:"Fishing Spot"},"leisure/fitness_centre":{icon:"fas-dumbbell",fields:["name","sport","address","building_area"],moreFields:["opening_hours","fee","payment_multi","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"fitness_centre"},terms:["health","gym","leisure","studio"],name:"Gym / Fitness Center"},"leisure/fitness_centre/yoga":{icon:"maki-pitch",geometry:["point","area"],terms:["studio","asanas","modern yoga","meditation"],tags:{leisure:"fitness_centre",sport:"yoga"},reference:{key:"sport",value:"yoga"},name:"Yoga Studio"},"leisure/fitness_station":{icon:"maki-pitch",fields:["fitness_station","ref"],moreFields:["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",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",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",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",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",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",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",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",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",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",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",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","operator","access_simple"],moreFields:["fee","payment_multi","website","phone","email","fax"],geometry:["point","vertex","area"],tags:{leisure:"garden"},name:"Garden"},"leisure/golf_course":{icon:"maki-golf",fields:["name","operator","address","opening_hours"],moreFields:["payment_multi","website","phone","email","fax"],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"],moreFields:["payment_multi","internet_access","internet_access/fee","internet_access/ssid","smoking","phone","email","fax"],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"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["equestrian","stable"],tags:{leisure:"horse_riding"},name:"Horseback Riding Facility"},"leisure/ice_rink":{icon:"fas-skating",fields:["name","seasonal","sport_ice","operator","address","building"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["hockey","skating","curling"],tags:{leisure:"ice_rink"},name:"Ice Rink"},"leisure/marina":{icon:"maki-harbor",fields:["name","operator","capacity","fee","sanitary_dump_station","power_supply"],moreFields:["address","payment_multi","internet_access","internet_access/fee","internet_access/ssid","seamark/type","website","phone","email","fax"],geometry:["point","vertex","area"],terms:["boat"],tags:{leisure:"marina"},name:"Marina"},"leisure/miniature_golf":{icon:"maki-golf",fields:["name","operator","address","opening_hours"],moreFields:["fee","payment_multi","website","phone","email","fax"],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","operator","address","opening_hours"],moreFields:["dog","website","phone","email","fax"],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",fields:["name","operator","address","opening_hours"],moreFields:["dog","smoking","website","phone","email","fax"],geometry:["point","area"],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",fields:["material","lit","bench"],geometry:["point"],tags:{leisure:"picnic_table"},terms:["bench"],name:"Picnic Table"},"leisure/picnic_table/chess":{icon:"fas-chess-knight",geometry:["point"],tags:{leisure:"picnic_table",sport:"chess"},reference:{key:"sport",value:"chess"},terms:["bench","chess board","checkerboard","checkers","chequerboard","game table"],name:"Chess Table"},"leisure/pitch":{icon:"maki-pitch",fields:["name","sport","surface","lit"],moreFields:["access_simple","fee"],geometry:["point","area"],tags:{leisure:"pitch"},terms:["field"],name:"Sport Pitch"},"leisure/pitch/american_football":{icon:"maki-american-football",geometry:["point","area"],tags:{leisure:"pitch",sport:"american_football"},reference:{key:"sport",value:"american_football"},terms:["football","gridiron"],name:"American Football Field"},"leisure/pitch/australian_football":{icon:"maki-american-football",geometry:["point","area"],tags:{leisure:"pitch",sport:"australian_football"},reference:{key:"sport",value:"australian_football"},terms:["Aussie","AFL","football"],name:"Australian Football Field"},"leisure/pitch/badminton":{icon:"maki-tennis",fields:["{leisure/pitch}","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",geometry:["point","area"],tags:{leisure:"pitch",sport:"baseball"},reference:{key:"sport",value:"baseball"},terms:[],name:"Baseball Field"},"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-volleyball",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","{leisure/pitch}"],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",geometry:["point","area"],tags:{leisure:"pitch",sport:"bowls"},reference:{key:"sport",value:"bowls"},terms:[],name:"Bowling Green"},"leisure/pitch/cricket":{icon:"maki-cricket",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:["{leisure/pitch}","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/netball":{icon:"maki-volleyball",geometry:["point","area"],tags:{leisure:"pitch",sport:"netball"},reference:{key:"sport",value:"netball"},terms:[],name:"Netball Court"},"leisure/pitch/rugby_league":{icon:"maki-american-football",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-american-football",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-skateboard",geometry:["point","area"],tags:{leisure:"pitch",sport:"skateboard"},reference:{key:"sport",value:"skateboard"},terms:[],name:"Skate Park"},"leisure/pitch/soccer":{icon:"maki-soccer",geometry:["point","area"],tags:{leisure:"pitch",sport:"soccer"},reference:{key:"sport",value:"soccer"},terms:["football"],name:"Soccer Field"},"leisure/pitch/softball":{icon:"maki-baseball",geometry:["point","area"],tags:{leisure:"pitch",sport:"softball"},reference:{key:"sport",value:"softball"},terms:["softball","diamond"],name:"Softball 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:["{leisure/pitch}","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"tennis"},reference:{key:"sport",value:"tennis"},terms:[],name:"Tennis Court"},"leisure/pitch/volleyball":{icon:"maki-volleyball",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"],moreFields:["payment_multi","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"resort"},name:"Resort"},"leisure/sauna":{icon:"fas-thermometer-three-quarters",fields:["name","operator","address","opening_hours","access_simple","fee"],moreFields:["payment_multi","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"sauna"},name:"Sauna"},"leisure/slipway":{icon:"maki-slipway",fields:["name","access_simple","fee"],moreFields:["seamark/type"],geometry:["point","vertex","line"],terms:["boat launch","boat ramp","boat landing"],tags:{leisure:"slipway"},name:"Slipway"},"leisure/sports_centre":{icon:"maki-pitch",fields:["name","sport","building","address","fee"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"sports_centre"},terms:[],name:"Sports Center / Complex"},"leisure/sports_centre/climbing":{icon:"temaki-abseiling",geometry:["point","area"],terms:["abseiling","artificial climbing wall","belaying","bouldering","rock climbing facility","indoor rock wall","rappeling","rock gym","ropes"],tags:{leisure:"sports_centre",sport:"climbing"},reference:{key:"sport",value:"climbing"},name:"Climbing Gym"},"leisure/sports_centre/swimming":{icon:"maki-swimming",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"],moreFields:["website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"stadium"},name:"Stadium"},"leisure/swimming_pool":{icon:"maki-swimming",fields:["name","access_simple","lit","location_pool","length","swimming_pool"],moreFields:["operator","address"],geometry:["point","area"],terms:["dive","water","aquatics"],tags:{leisure:"swimming_pool"},name:"Swimming Pool"},"leisure/track":{icon:"iD-other-line",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/track/horse_racing":{icon:"maki-horse-riding",fields:["surface","sport_racing_nonmotor","lit","width","lanes"],geometry:["point","line","area"],tags:{leisure:"track",sport:"horse_racing"},terms:["race*","horse","track"],name:"Racetrack (Horse Racing)"},"leisure/track/running":{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/water_park":{icon:"maki-swimming",fields:["name","operator","address"],moreFields:["payment_multi","brand","website","phone","email","fax"],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/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":{icon:"maki-bridge",fields:["name","bridge","layer","maxweight"],moreFields:["material","seamark/type"],geometry:["area"],tags:{man_made:"bridge"},addTags:{man_made:"bridge",layer:"1"},removeTags:{man_made:"bridge",layer:"*"},reference:{key:"man_made",value:"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",fields:["material"],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/embankment":{geometry:["line"],tags:{man_made:"embankment"},name:"Embankment"},"man_made/flagpole":{icon:"maki-embassy",fields:["operator","flag/type","country","lit","height"],moreFields:["material"],geometry:["point","vertex"],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":{fields:["material"],geometry:["line","area"],tags:{man_made:"groyne"},name:"Groyne"},"man_made/lighthouse":{icon:"maki-lighthouse",fields:["name","operator","building_area","height"],moreFields:["address","website","phone","email","fax","seamark/type"],geometry:["point","area"],tags:{man_made:"lighthouse"},name:"Lighthouse"},"man_made/mast":{icon:"maki-communications-tower",fields:["tower/type","tower/construction","height"],moreFields:["material","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/mast/communication":{icon:"maki-communications-tower",fields:["{man_made/mast}","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","tower:type":"communication"},reference:{key:"tower:type",value:"communication"},name:"Communication Mast"},"man_made/mast/communication/mobile_phone":{icon:"maki-communications-tower",geometry:["point"],terms:["antenna","cell mast","cell phone mast","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","transmission mast","transmission tower"],tags:{man_made:"mast","tower:type":"communication","communication:mobile_phone":"yes"},reference:{key:"communication:mobile_phone",value:"yes"},name:"Mobile Phone Mast"},"man_made/mast/communication/radio":{icon:"maki-communications-tower",geometry:["point"],terms:["antenna","broadcast tower","communication mast","communication tower","guyed tower","radio mast","radio tower","transmission mast","transmission tower"],tags:{man_made:"mast","tower:type":"communication","communication:radio":"yes"},reference:{key:"communication:radio",value:"yes"},name:"Radio Broadcast Mast"},"man_made/mast/communication/television":{icon:"maki-communications-tower",geometry:["point"],terms:["antenna","broadcast tower","communication mast","communication tower","guyed tower","television mast","television tower","transmission mast","transmission tower","tv mast","tv tower"],tags:{man_made:"mast","tower:type":"communication","communication:television":"yes"},reference:{key:"communication:television",value:"yes"},name:"Television Broadcast Mast"},"man_made/monitoring_station":{icon:"temaki-antenna",geometry:["point","vertex","area"],fields:["monitoring_multi","operator"],terms:["weather","earthquake","seismology","air","gps"],tags:{man_made:"monitoring_station"},name:"Monitoring Station"},"man_made/observatory":{fields:["name","operator","address","access_simple","building_area"],moreFields:["website","phone","email","fax"],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:"temaki-pedestrian",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"],terms:["oil","natural gas","water","sewer","sewage"],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":{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/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/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","building_area"],moreFields:["architect"],geometry:["point","area"],tags:{man_made:"tower"},name:"Tower"},"man_made/tower/bell_tower":{icon:"fas-bell",moreFields:["{man_made/tower}","opening_hours"],geometry:["point","area"],terms:["belfry","bell gable","campanile","church tower","klockstapel"],tags:{man_made:"tower","tower:type":"bell_tower"},reference:{key:"tower:type",value:"bell_tower"},name:"Bell Tower"},"man_made/tower/communication":{icon:"temaki-tower",fields:["{man_made/tower}","communication_multi"],geometry:["point","area"],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:"tower","tower:type":"communication"},reference:{key:"tower:type",value:"communication"},name:"Communication Tower"},"man_made/tower/minaret":{icon:"temaki-tower",geometry:["point","area"],terms:["Islam","mosque","Muezzin","Muslim"],tags:{man_made:"tower","tower:type":"minaret"},reference:{key:"tower:type",value:"minaret"},name:"Minaret"},"man_made/tower/observation":{icon:"temaki-tower",moreFields:["{man_made/tower}","opening_hours"],geometry:["point","area"],terms:["lookout tower","fire tower"],tags:{man_made:"tower","tower:type":"observation"},reference:{key:"tower:type",value:"observation"},name:"Observation Tower"},"man_made/wastewater_plant":{icon:"maki-water",fields:["name","operator","address"],moreFields:["website","phone","email","fax"],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-watermill",fields:["building_area"],geometry:["point","area"],terms:["water","wheel","mill"],tags:{man_made:"watermill"},name:"Watermill"},"man_made/windmill":{icon:"maki-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"],moreFields:["website","phone","email","fax"],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/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:["name","water","intermittent"],moreFields:["salt","tidal"],geometry:["area"],tags:{natural:"water"},name:"Water"},"natural/water/basin":{icon:"maki-water",fields:["name","basin","intermittent_yes"],geometry:["area"],tags:{natural:"water",water:"basin"},reference:{key:"water",value:"basin"},terms:["detention","drain","overflow","rain","retention"],name:"Basin"},"natural/water/canal":{icon:"maki-water",fields:["{natural/water}","salt"],geometry:["area"],tags:{natural:"water",water:"canal"},reference:{key:"water",value:"canal"},name:"Canal"},"natural/water/lake":{icon:"maki-water",fields:["{natural/water}","salt","tidal"],geometry:["area"],tags:{natural:"water",water:"lake"},reference:{key:"water",value:"lake"},terms:["lakelet","loch","mere"],name:"Lake"},"natural/water/pond":{icon:"maki-water",fields:["{natural/water}","salt"],geometry:["area"],tags:{natural:"water",water:"pond"},reference:{key:"water",value:"pond"},terms:["lakelet","millpond","tarn","pool","mere"],name:"Pond"},"natural/water/reservoir":{icon:"maki-water",geometry:["area"],tags:{natural:"water",water:"reservoir"},reference:{key:"water",value:"reservoir"},name:"Reservoir"},"natural/water/river":{icon:"maki-water",fields:["{natural/water}","tidal"],geometry:["area"],tags:{natural:"water",water:"river"},reference:{key:"water",value:"river"},terms:["beck","branch","brook","course","creek","estuary","rill","riverbank","rivulet","run","runnel","stream","tributary","watercourse"],name:"River"},"natural/water/stream":{icon:"maki-water",fields:["{natural/water}"],geometry:["area"],tags:{natural:"water",water:"stream"},reference:{key:"water",value:"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"],name:"Stream"},"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"],moreFields:["operator","smoking","website","phone","email","fax","wheelchair"],geometry:["point","vertex","area"],tags:{office:"*"},terms:[],name:"Office"},"office/administrative":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"administrative"},terms:[],searchable:false,name:"Administrative Office"},"office/physician":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"physician"},searchable:false,name:"Physician"},"office/travel_agent":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"travel_agent"},reference:{key:"shop",value:"travel_agency"},terms:[],name:"Travel Agency",searchable:false},"office/accountant":{icon:"temaki-accounting",geometry:["point","area"],tags:{office:"accountant"},terms:[],name:"Accountant Office"},"office/adoption_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"adoption_agency"},terms:[],name:"Adoption Agency"},"office/advertising_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"advertising_agency"},terms:["ad","ad agency","advert agency","advertising","marketing"],name:"Advertising Agency"},"office/architect":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"architect"},terms:[],name:"Architect Office"},"office/association":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"association"},terms:["association","non-profit","nonprofit","organization","society"],name:"Nonprofit Organization Office"},"office/charity":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"charity"},terms:["charitable organization"],name:"Charity Office"},"office/company":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"company"},terms:[],name:"Corporate Office"},"office/coworking":{icon:"maki-suitcase",fields:["{office}","internet_access"],moreFields:["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",geometry:["point","area"],tags:{office:"educational_institution"},terms:[],name:"Educational Institution"},"office/employment_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"employment_agency"},terms:["job"],name:"Employment Agency"},"office/energy_supplier":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"energy_supplier"},terms:["electricity","energy company","energy utility","gas utility"],name:"Energy Supplier Office"},"office/estate_agent":{icon:"temaki-real_estate_agency",geometry:["point","area"],tags:{office:"estate_agent"},terms:["real estate"],name:"Real Estate Office"},"office/financial":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"financial"},terms:[],name:"Financial Office"},"office/forestry":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"forestry"},terms:["forest","ranger"],name:"Forestry Office"},"office/foundation":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"foundation"},terms:[],name:"Foundation Office"},"office/government":{icon:"maki-town-hall",fields:["name","government","{office}"],geometry:["point","area"],tags:{office:"government"},terms:[],name:"Government Office"},"office/government/register_office":{icon:"maki-town-hall",fields:["{office}","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:["{office}","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",geometry:["point","area"],tags:{office:"guide"},terms:["dive guide","mountain guide","tour guide"],name:"Tour Guide Office"},"office/insurance":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"insurance"},terms:[],name:"Insurance Office"},"office/it":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"it"},terms:["computer","information","software","technology"],name:"Information Technology Office"},"office/lawyer":{icon:"fas-balance-scale",geometry:["point","area"],tags:{office:"lawyer"},terms:[],name:"Law Office"},"office/lawyer/notary":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"lawyer",lawyer:"notary"},reference:{key:"office",value:"notary"},searchable:false,name:"Notary Office"},"office/moving_company":{icon:"fas-people-carry",geometry:["point","area"],tags:{office:"moving_company"},terms:["relocation"],name:"Moving Company Office"},"office/newspaper":{icon:"maki-library",geometry:["point","area"],tags:{office:"newspaper"},terms:[],name:"Newspaper Office"},"office/ngo":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"ngo"},terms:["ngo","non government","non-government","organization","organisation"],name:"NGO Office"},"office/notary":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"notary"},terms:["clerk","deeds","estate","signature","wills"],name:"Notary Office"},"office/political_party":{icon:"maki-town-hall",geometry:["point","area"],tags:{office:"political_party"},terms:[],name:"Political Party"},"office/private_investigator":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"private_investigator"},terms:["PI","private eye","private detective"],name:"Private Investigator Office"},"office/quango":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"quango"},terms:["ngo","non government","non-government","organization","organisation","quasi autonomous","quasi-autonomous"],name:"Quasi-NGO Office"},"office/religion":{icon:"maki-suitcase",fields:["{office}","religion","denomination"],geometry:["point","area"],tags:{office:"religion"},terms:[],name:"Religious Office"},"office/research":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"research"},terms:[],name:"Research Office"},"office/surveyor":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"surveyor"},terms:[],name:"Surveyor Office"},"office/tax_advisor":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"tax_advisor"},terms:["tax","tax consultant"],name:"Tax Advisor Office"},"office/telecommunication":{icon:"maki-telephone",geometry:["point","area"],tags:{office:"telecommunication"},terms:["communication","internet","phone","voice"],name:"Telecom Office"},"office/therapist":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"therapist"},terms:["therapy"],name:"Therapist Office"},"office/water_utility":{icon:"maki-suitcase",fields:["{office}","operator"],geometry:["point","area"],tags:{office:"water_utility"},terms:["water board","utility"],name:"Water Utility Office"},"piste/downhill":{icon:"fas-skiing",fields:["name","piste/type","piste/difficulty_downhill","piste/grooming_downhill","oneway","lit"],geometry:["line","area"],terms:["ski","alpine","snowboard","downhill","piste"],tags:{"piste:type":"downhill"},name:"Downhill Piste/Ski Run"},"piste/downhill/halfpipe":{icon:"fas-snowboarding",fields:["name","piste/type","piste/difficulty_downhill","piste/grooming_downhill","oneway","lit"],geometry:["line","area"],terms:["ski","alpine","halfpipe","half pipe","snowboard","downhill","piste"],tags:{"piste:type":"downhill",man_made:"piste:halfpipe"},name:"Halfpipe"},"piste/hike":{icon:"temaki-snow_shoeing",fields:["name","piste/type","piste/difficulty","piste/grooming_hike","oneway","lit"],geometry:["line","area"],terms:["hike","winter hiking","snowshoe","snowshoeing","piste","ski"],tags:{"piste:type":"hike"},name:"Snowshoeing or Winter Hiking Trail"},"piste/ice_skate":{icon:"fas-skating",fields:["name","piste/type","sport_ice","oneway","lit"],geometry:["line","area"],terms:["ice","skating","ski","piste"],tags:{"piste:type":"ice_skate"},name:"Ice Skating Piste"},"piste/nordic":{icon:"fas-skiing-nordic",fields:["name","piste/type","piste/difficulty_nordic","piste/grooming_nordic","oneway","lit"],geometry:["line","area"],terms:["ski","nordic","crosscountry","skating","piste"],tags:{"piste:type":"nordic"},name:"Nordic or Crosscountry Piste/Ski Trail"},"piste/piste":{icon:"fas-skiing",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","nordic","crosscountry","downhill","alpine","snowboard","skitour","ski touring","sled","luge","sleigh","sledge","ski-joring","husky","horse","winter hiking","snowshoe","snowshoeing","ice","skating"],tags:{"piste:type":"*"},name:"Winter Sport Trails"},"piste/skitour":{icon:"fas-skiing-nordic",fields:["name","piste/type","piste/difficulty_skitour","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","skitour","crosscountry","ski touring","piste"],tags:{"piste:type":"skitour"},name:"Ski Touring Trail"},"piste/sled":{icon:"temaki-sledding",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","sled","luge","sleigh","sledge","piste"],tags:{"piste:type":"sled"},name:"Sled Piste"},"piste/sleigh":{icon:"fas-sleigh",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","piste","sled","luge","sleigh","sledge","ski-joring","husky","horse"],tags:{"piste:type":"sleigh"},name:"Sleigh Piste"},"place/farm":{icon:"maki-farm",geometry:["point","area"],fields:["name"],tags:{place:"farm"},name:"Farm",searchable:false},"place/city_block":{icon:"maki-triangle-stroked",fields:["name"],moreFields:["website"],geometry:["point","area"],tags:{place:"city_block"},name:"City Block"},"place/city":{icon:"maki-city",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"city"},name:"City"},"place/hamlet":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],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"],moreFields:["website"],fields:["name"],tags:{place:"locality"},name:"Locality"},"place/neighbourhood":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],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"],moreFields:["website"],geometry:["point","area"],tags:{place:"quarter"},terms:["boro","borough","quarter"],name:"Sub-Borough / Quarter"},"place/square":{geometry:["point","area"],fields:["name"],moreFields:["website"],tags:{place:"square"},name:"Square"},"place/suburb":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"suburb"},terms:["boro","borough","quarter"],name:"Borough / Suburb"},"place/town":{icon:"maki-town",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"town"},name:"Town"},"place/village":{icon:"maki-village",fields:["name","population"],moreFields:["website"],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/cable/underground":{fields:["name","operator","voltage","ref","layer"],geometry:["line"],tags:{power:"cable",location:"underground"},name:"Underground Power Cable"},"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/method/photovoltaic":{icon:"fas-solar-panel",fields:["operator","generator/output/electricity","ref"],geometry:["point","vertex","area"],terms:["photovoltaic module","PV module","sunlight"],tags:{power:"generator","generator:source":"solar","generator:method":"photovoltaic","generator:type":"solar_photovoltaic_panel"},addTags:{power:"generator","generator:source":"solar","generator:method":"photovoltaic","generator:type":"solar_photovoltaic_panel","generator:output:electricity":"yes"},removeTags:{power:"generator","generator:source":"solar","generator:method":"photovoltaic","generator:type":"solar_photovoltaic_panel","generator:output:electricity":"yes"},reference:{key:"generator:method",value:"photovoltaic"},name:"Solar Panel"},"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","material"],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:["design","ref","material"],geometry:["point","vertex"],terms:["power"],tags:{power:"tower"},name:"High-Voltage Tower"},"power/transformer":{icon:"temaki-power",fields:["ref","operator","transformer","location","rating","devices","phases"],moreFields:["frequency","voltage/primary","voltage/secondary","voltage/tertiary","windings","windings/configuration"],geometry:["point","vertex","area"],tags:{power:"transformer"},name:"Transformer"},"public_transport/platform_aerialway":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["point","line","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:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["point","line","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:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["point","line","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-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["point","line","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-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["point","line","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-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["point","line","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:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["point","line","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-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["point","line","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-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["point","line","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:"temaki-pedestrian",fields:["name","ref_platform","network","operator","departures_board","surface"],moreFields:["lit","bench","shelter","wheelchair"],geometry:["point","line","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:["{public_transport/station}","aerialway/access","aerialway/summer/access"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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"],moreFields:["internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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:"iD-relation",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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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"],moreFields:["covered"],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"],moreFields:["covered"],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:"temaki-light_rail",fields:["name","structure","gauge","electrified","service_rail","usage_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],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","direction_vertex"],tags:{railway:"milestone"},terms:["milestone","marker"],name:"Railway Milestone"},"railway/miniature":{icon:"iD-railway-rail",fields:["name","structure","gauge","electrified","service_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"miniature"},terms:["rideable miniature railway","narrow gauge railway","minimum gauge railway"],name:"Miniature Railway"},"railway/monorail":{icon:"temaki-monorail",fields:["name","structure","electrified","service_rail","usage_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"monorail"},terms:[],name:"Monorail"},"railway/narrow_gauge":{icon:"iD-railway-rail",fields:["name","structure","gauge","electrified","service_rail","usage_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],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","service_rail","usage_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],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:"temaki-subway",fields:["name","structure","gauge","electrified","service_rail","usage_rail"],moreFields:["maxspeed","voltage_electrified","frequency_electrified"],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:"temaki-tram",fields:["name","structure","gauge","electrified","service_rail","usage_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],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:"maki-ferry",geometry:["line"],fields:["name","operator","duration","access","to","from"],tags:{route:"ferry"},name:"Ferry Route"},"seamark/beacon_isolated_danger":{fields:["ref","operator","seamark/beacon_isolated_danger/shape","seamark/type"],geometry:["point","vertex"],terms:["beacon isolated danger","isolated danger beacon","iala"],tags:{"seamark:type":"beacon_isolated_danger"},name:"Danger Beacon"},"seamark/beacon_lateral":{fields:["ref","operator","seamark/beacon_lateral/colour","seamark/beacon_lateral/category","seamark/beacon_lateral/shape","seamark/beacon_lateral/system","seamark/type"],geometry:["point","vertex"],terms:["lateral beacon","beacon lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"beacon_lateral"},name:"Channel Beacon"},"seamark/buoy_lateral":{fields:["ref","operator","seamark/buoy_lateral/colour","seamark/buoy_lateral/category","seamark/buoy_lateral/shape","seamark/buoy_lateral/system","seamark/type"],geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral"},name:"Channel Buoy"},"seamark/buoy_lateral/green":{geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral","seamark:buoy_lateral:colour":"green"},name:"Green Buoy"},"seamark/buoy_lateral/red":{geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral","seamark:buoy_lateral:colour":"red"},name:"Red Buoy"},"seamark/mooring":{fields:["ref","operator","seamark/mooring/category","seamark/type"],geometry:["point"],terms:["dolphin","pile","bollard","buoy","post"],tags:{"seamark:type":"mooring"},name:"Mooring"},shop:{icon:"maki-shop",fields:["name","shop","operator","address","building_area","opening_hours","payment_multi"],moreFields:["brand","currency_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{shop:"*"},terms:[],name:"Shop"},"shop/fishmonger":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"fishmonger"},reference:{key:"shop",value:"seafood"},name:"Fishmonger",searchable:false},"shop/furnace":{icon:"maki-shop",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:["{shop}","agrarian"],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:["{shop}","drive_through"],geometry:["point","area"],terms:["alcohol","beer","booze","wine"],tags:{shop:"alcohol"},name:"Liquor Store"},"shop/anime":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"anime"},terms:["manga","japan","cosplay","figurine","dakimakura"],name:"Anime Shop"},"shop/antiques":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"antiques"},name:"Antiques Shop"},"shop/appliance":{icon:"maki-shop",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",geometry:["point","area"],terms:["art*","exhibit*","gallery"],tags:{shop:"art"},name:"Art Store"},"shop/baby_goods":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"baby_goods"},name:"Baby Goods Store"},"shop/bag":{icon:"maki-shop",geometry:["point","area"],terms:["handbag","purse"],tags:{shop:"bag"},name:"Bag/Luggage Store"},"shop/bakery":{icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery"},terms:["bread","cakes","rolls"],name:"Bakery"},"shop/bathroom_furnishing":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"bathroom_furnishing"},name:"Bathroom Furnishing Store"},"shop/beauty":{icon:"maki-shop",fields:["{shop}","beauty"],geometry:["point","area"],terms:["spa","salon","tanning"],tags:{shop:"beauty"},name:"Beauty Shop"},"shop/beauty/nails":{icon:"maki-shop",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",geometry:["point","area"],tags:{shop:"beauty",beauty:"tanning"},reference:{key:"leisure",value:"tanning_salon"},name:"Tanning Salon"},"shop/bed":{icon:"maki-lodging",geometry:["point","area"],tags:{shop:"bed"},name:"Bedding/Mattress Store"},"shop/beverages":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages"},terms:["drinks"],name:"Beverage Store"},"shop/bicycle":{icon:"maki-bicycle",fields:["{shop}","service/bicycle"],geometry:["point","area"],terms:["bike","repair","tricycle","unicycle"],tags:{shop:"bicycle"},name:"Bicycle Shop"},"shop/bookmaker":{icon:"maki-shop",geometry:["point","area"],terms:["betting","bookie"],tags:{shop:"bookmaker"},name:"Bookmaker"},"shop/books":{icon:"maki-shop",fields:["{shop}","internet_access"],moreFields:["{shop}","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books"},name:"Book Store"},"shop/boutique":{icon:"maki-shop",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"boutique"},name:"Boutique"},"shop/butcher":{icon:"fas-bacon",geometry:["point","area"],terms:["chicken","beef","lamb","meat","pork"],tags:{shop:"butcher"},name:"Butcher"},"shop/candles":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"candles"},terms:["wax"],name:"Candle Shop"},"shop/car_parts":{icon:"maki-car",geometry:["point","area"],terms:["automobile","automotive"],tags:{shop:"car_parts"},name:"Car Parts Store"},"shop/car_repair":{icon:"maki-car-repair",fields:["{shop}","service/vehicle"],geometry:["point","area"],terms:["automobile","automotive","garage","service"],tags:{shop:"car_repair"},name:"Car Repair Shop"},"shop/car":{icon:"maki-car",fields:["name","brand","{shop}","second_hand","service/vehicle"],geometry:["point","area"],terms:["automobile","automotive"],tags:{shop:"car"},name:"Car Dealership"},"shop/caravan":{icon:"temaki-rv_park",fields:["name","brand","{shop}","second_hand","service/vehicle"],geometry:["point","area"],tags:{shop:"caravan"},terms:["auto","camper","recreational vehicle"],name:"RV Dealership"},"shop/carpet":{icon:"maki-shop",geometry:["point","area"],terms:["rug"],tags:{shop:"carpet"},name:"Carpet Store"},"shop/catalogue":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"catalogue"},name:"Catalog Shop"},"shop/charity":{icon:"maki-shop",fields:["{shop}","second_hand"],geometry:["point","area"],terms:["thrift","op shop","nonprofit"],tags:{shop:"charity"},name:"Charity Store"},"shop/cheese":{icon:"fas-cheese",geometry:["point","area"],tags:{shop:"cheese"},name:"Cheese Store"},"shop/chemist":{icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist"},terms:["apothecary","beauty","drug store","drugstore","gift","hair","med*","pharmacy","prescription","tooth"],name:"Drugstore"},"shop/chocolate":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"chocolate"},terms:["cocoa"],name:"Chocolate Store"},"shop/clothes":{icon:"maki-clothing-store",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"clothes"},name:"Clothing Store"},"shop/coffee":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"coffee"},name:"Coffee Store"},"shop/computer":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"computer"},terms:["desktop","laptop","hardware","operating system","software"],name:"Computer Store"},"shop/confectionery":{icon:"maki-confectionery",geometry:["point","area"],terms:["sweet"],tags:{shop:"confectionery"},name:"Candy Store"},"shop/convenience":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience"},name:"Convenience Store"},"shop/copyshop":{icon:"fas-print",geometry:["point","area"],tags:{shop:"copyshop"},terms:["print","scan"],name:"Copy Store"},"shop/cosmetics":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics"},terms:["make-up","makeup"],name:"Cosmetics Store"},"shop/country_store":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"country_store"},name:"Country Store"},"shop/craft":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"craft"},terms:["art*","paint*","frame"],name:"Arts and Crafts Store"},"shop/curtain":{icon:"maki-shop",geometry:["point","area"],terms:["drape*","window"],tags:{shop:"curtain"},name:"Curtain Store"},"shop/dairy":{icon:"fas-cheese",geometry:["point","area"],terms:["milk","egg","cheese"],tags:{shop:"dairy"},name:"Dairy Store"},"shop/deli":{icon:"maki-restaurant",geometry:["point","area"],terms:["lunch","meat","sandwich"],tags:{shop:"deli"},name:"Deli"},"shop/department_store":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store"},name:"Department Store"},"shop/doityourself":{icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself"},name:"DIY Store"},"shop/dry_cleaning":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"dry_cleaning"},name:"Dry Cleaner"},"shop/e-cigarette":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"e-cigarette"},terms:["electronic","vape","vaping","vapor"],name:"E-Cigarette Shop"},"shop/electronics":{icon:"maki-shop",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",geometry:["point","area"],terms:["sex","porn"],tags:{shop:"erotic"},name:"Erotic Store"},"shop/fabric":{icon:"maki-shop",geometry:["point","area"],terms:["sew"],tags:{shop:"fabric"},name:"Fabric Store"},"shop/farm":{icon:"maki-shop",geometry:["point","area"],terms:["farm shop","farm stand"],tags:{shop:"farm"},name:"Produce Stand"},"shop/fashion":{icon:"maki-shop",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"fashion"},name:"Fashion Store"},"shop/fireplace":{icon:"maki-shop",geometry:["point","area"],terms:["fireplace","stove","masonry heater"],tags:{shop:"fireplace"},name:"Fireplace Store"},"shop/fishing":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"fishing"},terms:["bait","fishing line","flies","fly","lure","reel","rod","tackle"],name:"Fishing Shop"},"shop/florist":{icon:"maki-florist",geometry:["point","area"],terms:["flower"],tags:{shop:"florist"},name:"Florist"},"shop/frame":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"frame"},terms:["art*","paint*","photo*","frame"],name:"Framing Shop"},"shop/frozen_food":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"frozen_food"},name:"Frozen Food"},"shop/fuel":{icon:"maki-shop",fields:["{shop}","fuel_multi"],geometry:["point","area"],tags:{shop:"fuel"},name:"Fuel Shop",matchScore:0.5},"shop/funeral_directors":{icon:"maki-cemetery",fields:["{shop}","religion","denomination"],geometry:["point","area"],terms:["undertaker","memorial home"],tags:{shop:"funeral_directors"},name:"Funeral Home"},"shop/furniture":{icon:"fas-couch",geometry:["point","area"],terms:["chair","sofa","table"],tags:{shop:"furniture"},name:"Furniture Store"},"shop/garden_centre":{icon:"maki-garden-centre",geometry:["point","area"],terms:["landscape","mulch","shrub","tree"],tags:{shop:"garden_centre"},name:"Garden Center"},"shop/gas":{icon:"maki-shop",geometry:["point","area"],terms:["cng","lpg","natural gas","propane","refill","tank"],tags:{shop:"gas"},name:"Bottled Gas Shop"},"shop/gift":{icon:"maki-gift",geometry:["point","area"],terms:["souvenir"],tags:{shop:"gift"},name:"Gift Shop"},"shop/greengrocer":{icon:"maki-shop",geometry:["point","area"],terms:["fruit","produce","vegetable"],tags:{shop:"greengrocer"},name:"Greengrocer"},"shop/hairdresser_supply":{icon:"maki-shop",geometry:["point","area"],terms:["barber","shampoo","conditioner"],tags:{shop:"hairdresser_supply"},name:"Hairdresser Supply Store"},"shop/hairdresser":{icon:"temaki-beauty_salon",geometry:["point","area"],terms:["barber"],tags:{shop:"hairdresser"},name:"Hairdresser"},"shop/hardware":{icon:"temaki-tools",geometry:["point","area"],tags:{shop:"hardware"},name:"Hardware Store"},"shop/health_food":{icon:"maki-shop",geometry:["point","area"],terms:["wholefood","vitamins","vegetarian","vegan"],tags:{shop:"health_food"},name:"Health Food Shop"},"shop/hearing_aids":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"hearing_aids"},name:"Hearing Aids Store"},"shop/herbalist":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"herbalist"},name:"Herbalist"},"shop/hifi":{icon:"maki-shop",geometry:["point","area"],terms:["audio","hi-fi","high fidelity","stereo","video"],tags:{shop:"hifi"},name:"Hifi Store"},"shop/houseware":{icon:"fas-blender",geometry:["point","area"],terms:["home","household"],tags:{shop:"houseware"},name:"Houseware Store"},"shop/hunting":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"hunting"},terms:["arrows","bows","bullets","crossbows","rifles","traps"],name:"Hunting Shop"},"shop/interior_decoration":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"interior_decoration"},name:"Interior Decoration Store"},"shop/jewelry":{icon:"maki-jewelry-store",geometry:["point","area"],terms:["bracelet","diamond","earrings","gem","necklace","pins","ring"],tags:{shop:"jewelry"},name:"Jeweler"},"shop/kiosk":{icon:"maki-shop",fields:["{shop}","levels"],geometry:["point","area"],tags:{shop:"kiosk"},name:"Kiosk"},"shop/kitchen":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"kitchen"},terms:["cabinets","countertops","sinks"],name:"Kitchen Design Store"},"shop/laundry":{icon:"maki-laundry",geometry:["point","area"],tags:{shop:"laundry"},name:"Laundry"},"shop/leather":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"leather"},name:"Leather Store"},"shop/locksmith":{icon:"fas-key",geometry:["point","area"],terms:["key","lockpick"],tags:{shop:"locksmith"},name:"Locksmith"},"shop/lottery":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"lottery"},name:"Lottery Shop"},"shop/mall":{icon:"maki-shop",geometry:["point","area"],terms:["shopping"],tags:{shop:"mall"},name:"Mall"},"shop/massage":{icon:"temaki-spa",geometry:["point","area"],tags:{shop:"massage"},name:"Massage Shop"},"shop/medical_supply":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"medical_supply"},name:"Medical Supply Store"},"shop/mobile_phone":{icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone"},name:"Mobile Phone Store"},"shop/money_lender":{icon:"maki-bank",fields:["{shop}","currency_multi"],geometry:["point","area"],tags:{shop:"money_lender"},name:"Money Lender"},"shop/motorcycle_repair":{icon:"fas-motorcycle",fields:["{shop}","service/vehicle"],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","brand","{shop}"],geometry:["point","area"],terms:["bike"],tags:{shop:"motorcycle"},name:"Motorcycle Dealership"},"shop/music":{icon:"maki-music",geometry:["point","area"],terms:["tape casettes","CDs","compact discs","vinyl records"],tags:{shop:"music"},name:"Music Store"},"shop/musical_instrument":{icon:"maki-music",geometry:["point","area"],terms:["guitar"],tags:{shop:"musical_instrument"},name:"Musical Instrument Store"},"shop/newsagent":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"newsagent"},name:"Newspaper/Magazine Shop"},"shop/nutrition_supplements":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"nutrition_supplements"},name:"Nutrition Supplements Store"},"shop/optician":{icon:"maki-optician",geometry:["point","area"],terms:["eye","glasses"],tags:{shop:"optician"},name:"Optician"},"shop/organic":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"supermarket",organic:"only"},name:"Organic Goods Store"},"shop/outdoor":{icon:"temaki-compass",geometry:["point","area"],terms:["camping","climbing","hiking","outfitter","outdoor equipment","outdoor supplies"],tags:{shop:"outdoor"},name:"Outdoors Store"},"shop/paint":{icon:"fas-paint-roller",geometry:["point","area"],tags:{shop:"paint"},name:"Paint Store"},"shop/party":{icon:"maki-shop",geometry:["point","area"],terms:["balloons","costumes","decorations","invitations"],tags:{shop:"party"},name:"Party Supply Store"},"shop/pastry":{icon:"maki-bakery",geometry:["point","area"],tags:{shop:"pastry"},terms:["patisserie","cake shop","cakery"],name:"Pastry Shop"},"shop/pawnbroker":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"pawnbroker"},name:"Pawn Shop"},"shop/perfumery":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"perfumery"},name:"Perfume Store"},"shop/pet_grooming":{icon:"maki-dog-park",geometry:["point","area"],terms:["cat","dog"],tags:{shop:"pet_grooming"},name:"Pet Grooming Store"},"shop/pet":{icon:"maki-dog-park",geometry:["point","area"],terms:["animal","cat","dog","fish","kitten","puppy","reptile"],tags:{shop:"pet"},name:"Pet Store"},"shop/photo":{icon:"maki-attraction",geometry:["point","area"],terms:["camera","film"],tags:{shop:"photo"},name:"Photography Store"},"shop/pyrotechnics":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"pyrotechnics"},name:"Fireworks Store"},"shop/radiotechnics":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"radiotechnics"},terms:["antenna","transistor"],name:"Radio/Electronic Component Store"},"shop/religion":{icon:"maki-shop",fields:["{shop}","religion","denomination"],geometry:["point","area"],tags:{shop:"religion"},name:"Religious Store"},"shop/scuba_diving":{icon:"maki-swimming",fields:["{shop}","scuba_diving"],geometry:["point","area"],terms:["diving","scuba"],tags:{shop:"scuba_diving"},name:"Scuba Diving Shop"},"shop/seafood":{icon:"maki-shop",geometry:["point","area"],terms:["fishmonger"],tags:{shop:"seafood"},name:"Seafood Shop"},"shop/second_hand":{icon:"maki-shop",fields:["{shop}","second_hand"],geometry:["point","area"],terms:["secondhand","second hand","resale","thrift","used"],tags:{shop:"second_hand"},name:"Consignment/Thrift Store"},"shop/sewing":{icon:"maki-shop",geometry:["point","area"],terms:["haberdashery"],tags:{shop:"sewing"},name:"Sewing Supply Shop"},"shop/shoes":{icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes"},terms:["boots","cleats","clogs","heels","loafers","oxfords","sneakers"],name:"Shoe Store"},"shop/sports":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports"},terms:["athletics"],name:"Sporting Goods Store"},"shop/stationery":{icon:"maki-shop",geometry:["point","area"],terms:["card","paper"],tags:{shop:"stationery"},name:"Stationery Store"},"shop/storage_rental":{icon:"fas-warehouse",geometry:["point","area"],tags:{shop:"storage_rental"},terms:["garages"],name:"Storage Rental"},"shop/supermarket":{icon:"maki-grocery",moreFields:["diet_multi","{shop}"],geometry:["point","area"],terms:["grocery","store","shop"],tags:{shop:"supermarket"},name:"Supermarket"},"shop/tailor":{icon:"maki-clothing-store",geometry:["point","area"],terms:["clothes","suit"],tags:{shop:"tailor"},name:"Tailor"},"shop/tattoo":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tattoo"},terms:["ink"],name:"Tattoo Parlor"},"shop/tea":{icon:"maki-teahouse",geometry:["point","area"],tags:{shop:"tea"},name:"Tea Store"},"shop/ticket":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"ticket"},terms:["box office"],name:"Ticket Seller"},"shop/tiles":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tiles"},name:"Tile Shop"},"shop/tobacco":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tobacco"},terms:["cigarettes","cigars"],name:"Tobacco Shop"},"shop/toys":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys"},terms:["games"],name:"Toy Store"},"shop/trade":{icon:"maki-shop",fields:["name","trade","{shop}"],geometry:["point","area"],tags:{shop:"trade"},name:"Trade Shop"},"shop/travel_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency"},name:"Travel Agency"},"shop/tyres":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres"},name:"Tire Store"},"shop/vacuum_cleaner":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"vacuum_cleaner"},name:"Vacuum Cleaner Store"},"shop/variety_store":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store"},name:"Variety Store"},"shop/video_games":{icon:"maki-gaming",geometry:["point","area"],tags:{shop:"video_games"},name:"Video Game Store"},"shop/video":{icon:"temaki-movie_rental",geometry:["point","area"],terms:["DVD","VHS","video casette"],tags:{shop:"video"},name:"Video Store"},"shop/watches":{icon:"maki-watch",geometry:["point","area"],tags:{shop:"watches"},name:"Watches Shop"},"shop/water_sports":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"water_sports"},name:"Watersport/Swim Shop"},"shop/water":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"water"},name:"Drinking Water Shop"},"shop/weapons":{icon:"maki-shop",geometry:["point","area"],terms:["ammo","gun","knife","knives"],tags:{shop:"weapons"},name:"Weapon Shop"},"shop/wholesale":{icon:"maki-warehouse",fields:["{shop}","wholesale"],geometry:["point","area"],terms:["warehouse club","cash and carry"],tags:{shop:"wholesale"},name:"Wholesale Store"},"shop/window_blind":{icon:"temaki-window",geometry:["point","area"],tags:{shop:"window_blind"},name:"Window Blind Store"},"shop/wine":{icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"wine"},name:"Wine Shop"},"tourism/alpine_hut":{icon:"maki-lodging",fields:["name","operator","address","building_area","internet_access","fee"],moreFields:["payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["climbing hut"],tags:{tourism:"alpine_hut"},name:"Alpine Hut"},"tourism/apartment":{icon:"maki-lodging",fields:["name","operator","address","building_area","rooms","internet_access"],moreFields:["smoking","payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{tourism:"apartment"},name:"Guest Apartment / Condo"},"tourism/aquarium":{icon:"maki-aquarium",fields:["name","operator","address","building_area","opening_hours"],moreFields:["fee","payment_multi","smoking","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["fish","sea","water"],tags:{tourism:"aquarium"},name:"Aquarium"},"tourism/artwork":{icon:"maki-art-gallery",fields:["name","artwork_type","artist"],moreFields:["material","website"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork"},terms:["mural","sculpture","statue"],name:"Artwork"},"tourism/artwork/mural":{icon:"maki-art-gallery",fields:["name","artist"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"mural"},reference:{key:"artwork_type",value:"mural"},terms:["fresco","wall painting"],name:"Mural"},"tourism/artwork/sculpture":{icon:"maki-art-gallery",fields:["name","artist","material"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"sculpture"},reference:{key:"artwork_type",value:"sculpture"},terms:["statue","figure","carving"],name:"Sculpture"},"tourism/artwork/statue":{icon:"maki-art-gallery",fields:["name","artist","material"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"statue"},reference:{key:"artwork_type",value:"statue"},terms:["sculpture","figure","carving"],name:"Statue"},"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"],moreFields:["payment_multi","internet_access/fee","internet_access/ssid","sanitary_dump_station","power_supply","website","phone","email","fax","wheelchair"],geometry:["point","vertex","area"],terms:["tent","rv"],tags:{tourism:"camp_site"},name:"Campground"},"tourism/caravan_site":{icon:"temaki-rv_park",fields:["name","address","capacity","sanitary_dump_station","power_supply","internet_access"],moreFields:["operator","fee","payment_multi","internet_access/fee","internet_access/ssid","smoking","website","phone","email","fax","wheelchair"],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","internet_access"],moreFields:["smoking","payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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","rooms","internet_access"],moreFields:["smoking","payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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","rooms","internet_access"],moreFields:["smoking","payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{tourism:"hostel"},name:"Hostel"},"tourism/hotel":{icon:"maki-lodging",fields:["name","brand","address","building_area","rooms","internet_access"],moreFields:["operator","smoking","payment_multi","internet_access/fee","internet_access/ssid","stars","website","phone","email","fax","wheelchair"],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"],moreFields:["material"],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"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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","brand","address","building_area","rooms","internet_access"],moreFields:["operator","smoking","payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{tourism:"motel"},name:"Motel"},"tourism/museum":{icon:"temaki-museum",fields:["name","operator","address","building_area","opening_hours"],moreFields:["fee","payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["smoking","fee","payment_multi","website","wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["address","opening_hours","website","phone","email","fax"],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","fee","fireplace"],moreFields:["payment_multi","wheelchair"],geometry:["point","area"],terms:["wilderness hut","backcountry hut","bothy"],tags:{tourism:"wilderness_hut"},name:"Wilderness Hut"},"tourism/zoo":{icon:"temaki-zoo",fields:["name","operator","address","opening_hours","fee"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["animal"],tags:{tourism:"zoo"},name:"Zoo"},traffic_calming:{icon:"temaki-diamond",fields:["traffic_calming","surface","direction_vertex"],geometry:["vertex","line","area"],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:["surface","direction_vertex"],geometry:["vertex","area"],terms:["driveway link","speed","slow"],tags:{traffic_calming:"chicane"},name:"Traffic Chicane"},"traffic_calming/choker":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","area"],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",fields:["surface"],geometry:["vertex","area"],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","direction_vertex"],geometry:["vertex"],tags:{traffic_calming:"table"},terms:["flat top","hump","speed","slow"],name:"Speed Table"},traffic_sign_vertex:{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction"],geometry:["vertex"],tags:{traffic_sign:"*"},terms:["road","highway"],name:"Traffic Sign"},traffic_sign:{icon:"maki-square-stroked",fields:["traffic_sign","direction"],geometry:["point"],tags:{traffic_sign:"*"},terms:["road","highway"],name:"Traffic Sign"},"traffic_sign/city_limit_vertex":{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction","name"],geometry:["vertex"],tags:{traffic_sign:"city_limit"},terms:["town","village","hamlet","boundary","edge","border","road","highway"],name:"City Limit Sign"},"traffic_sign/city_limit":{icon:"maki-square-stroked",fields:["traffic_sign","direction","name"],geometry:["point"],tags:{traffic_sign:"city_limit"},terms:["town","village","hamlet","boundary","edge","border","road","highway"],name:"City Limit Sign"},"traffic_sign/maxspeed_vertex":{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction","maxspeed"],geometry:["vertex"],tags:{traffic_sign:"maxspeed"},terms:["max speed","maximum speed","road","highway"],name:"Speed Limit Sign"},"traffic_sign/maxspeed":{icon:"maki-square-stroked",fields:["traffic_sign","direction","maxspeed"],geometry:["point"],tags:{traffic_sign:"maxspeed"},terms:["max speed","maximum speed","road","highway"],name:"Speed Limit Sign"},"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/enforcement":{icon:"iD-relation",fields:["name","enforcement"],geometry:["relation"],tags:{type:"enforcement"},name:"Enforcement"},"type/restriction":{icon:"iD-restriction",fields:["restriction","except"],geometry:["relation"],tags:{type:"restriction"},name:"Restriction"},"type/restriction/no_left_turn":{icon:"iD-restriction-no-left-turn",geometry:["relation"],tags:{type:"restriction",restriction:"no_left_turn"},name:"No Left Turn"},"type/restriction/no_right_turn":{icon:"iD-restriction-no-right-turn",geometry:["relation"],tags:{type:"restriction",restriction:"no_right_turn"},name:"No Right Turn"},"type/restriction/no_straight_on":{icon:"iD-restriction-no-straight-on",geometry:["relation"],tags:{type:"restriction",restriction:"no_straight_on"},name:"No Straight On"},"type/restriction/no_u_turn":{icon:"iD-restriction-no-u-turn",geometry:["relation"],tags:{type:"restriction",restriction:"no_u_turn"},name:"No U-turn"},"type/restriction/only_left_turn":{icon:"iD-restriction-only-left-turn",geometry:["relation"],tags:{type:"restriction",restriction:"only_left_turn"},name:"Only Left Turn"},"type/restriction/only_right_turn":{icon:"iD-restriction-only-right-turn",geometry:["relation"],tags:{type:"restriction",restriction:"only_right_turn"},name:"Only Right Turn"},"type/restriction/only_straight_on":{icon:"iD-restriction-only-straight-on",geometry:["relation"],tags:{type:"restriction",restriction:"only_straight_on"},name:"Only Straight On"},"type/restriction/only_u_turn":{icon:"iD-restriction-only-u-turn",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","to","from"],geometry:["relation"],tags:{type:"route",route:"bicycle"},name:"Cycle Route"},"type/route/bus":{icon:"iD-route-bus",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"bus"},name:"Bus Route"},"type/route/detour":{icon:"iD-route-detour",fields:["name","ref_route","to","from"],geometry:["relation"],tags:{type:"route",route:"detour"},name:"Detour Route"},"type/route/ferry":{icon:"iD-route-ferry",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"ferry"},name:"Ferry Route"},"type/route/foot":{icon:"iD-route-foot",fields:["name","ref_route","operator","network_foot","to","from"],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","to","from"],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","to","from"],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","to","from"],geometry:["relation"],tags:{type:"route",route:"light_rail"},name:"Light Rail Route"},"type/route/pipeline":{icon:"iD-route-pipeline",fields:["name","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"pipeline"},name:"Pipeline Route"},"type/route/piste":{icon:"iD-route-piste",fields:["name","piste/type","colour","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"piste"},name:"Piste/Ski Route"},"type/route/power":{icon:"iD-route-power",fields:["name","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"power"},name:"Power Route"},"type/route/road":{icon:"iD-route-road",fields:["name","ref_route","network_road","to","from"],geometry:["relation"],tags:{type:"route",route:"road"},name:"Road Route"},"type/route/subway":{icon:"iD-route-subway",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"subway"},name:"Subway Route"},"type/route/train":{icon:"iD-route-train",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"train"},name:"Train Route"},"type/route/tram":{icon:"iD-route-tram",fields:["name","ref_route","operator","network","to","from"],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:{moreFields:["name"],geometry:["vertex"],tags:{},name:"Other",matchScore:0.1},"waterway/riverbank":{icon:"maki-water",geometry:["area"],tags:{waterway:"riverbank"},name:"Riverbank",searchable:false},"waterway/boatyard":{icon:"maki-harbor",fields:["name","operator"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["area","vertex","point"],tags:{waterway:"boatyard"},name:"Boatyard"},"waterway/canal":{icon:"iD-waterway-canal",fields:["name","width","intermittent"],moreFields:["salt"],geometry:["line"],tags:{waterway:"canal"},name:"Canal"},"waterway/dam":{icon:"maki-dam",geometry:["point","vertex","line","area"],moreFields:["website"],fields:["name"],tags:{waterway:"dam"},name:"Dam"},"waterway/ditch":{icon:"iD-waterway-ditch",fields:["{waterway/drain}"],moreFields:["{waterway/drain}"],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"],moreFields:["covered"],geometry:["line"],tags:{waterway:"drain"},name:"Drain"},"waterway/fuel":{icon:"maki-fuel",fields:["name","operator","address","opening_hours","fuel_multi"],moreFields:["payment_multi","brand","seamark/type","building","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["petrol","gas","diesel","boat"],tags:{waterway:"fuel"},name:"Marine Fuel Station"},"waterway/milestone":{icon:"temaki-milestone",fields:["distance","direction_vertex"],moreFields:["seamark/type"],geometry:["point","vertex"],tags:{waterway:"milestone"},terms:["milestone","marker"],name:"Waterway Milestone"},"waterway/river":{icon:"iD-waterway-river",fields:["name","structure_waterway","width","intermittent","tidal"],moreFields:["covered","salt"],geometry:["line"],terms:["beck","branch","brook","course","creek","estuary","rill","rivulet","run","runnel","stream","tributary","watercourse"],tags:{waterway:"river"},name:"River"},"waterway/sanitary_dump_station":{icon:"temaki-storage_tank",fields:["name","operator","access_simple","fee","water_point"],moreFields:["opening_hours","payment_multi","seamark/type"],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:["{waterway/stream}","intermittent"],moreFields:["{waterway/stream}"],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"],moreFields:["covered","salt","tidal"],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-waterfall",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/bank/ABANCA":{name:"ABANCA",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9598744"},addTags:{amenity:"bank",brand:"ABANCA","brand:wikidata":"Q9598744","brand:wikipedia":"es:Abanca",name:"ABANCA"},removeTags:{amenity:"bank",brand:"ABANCA","brand:wikidata":"Q9598744","brand:wikipedia":"es:Abanca",name:"ABANCA"},matchScore:2,suggestion:true},"amenity/bank/ABN AMRO":{name:"ABN AMRO",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q287471"},addTags:{amenity:"bank",brand:"ABN AMRO","brand:wikidata":"Q287471","brand:wikipedia":"en:ABN AMRO",name:"ABN AMRO"},removeTags:{amenity:"bank",brand:"ABN AMRO","brand:wikidata":"Q287471","brand:wikipedia":"en:ABN AMRO",name:"ABN AMRO"},matchScore:2,suggestion:true},"amenity/bank/ABSA":{name:"ABSA",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q331688"},addTags:{amenity:"bank",brand:"ABSA","brand:wikidata":"Q331688","brand:wikipedia":"en:ABSA Group Limited",name:"ABSA"},removeTags:{amenity:"bank",brand:"ABSA","brand:wikidata":"Q331688","brand:wikipedia":"en:ABSA Group Limited",name:"ABSA"},matchScore:2,suggestion:true},"amenity/bank/AIB":{name:"AIB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1642179"},addTags:{amenity:"bank",brand:"AIB","brand:wikidata":"Q1642179","brand:wikipedia":"en:Allied Irish Banks",name:"AIB"},removeTags:{amenity:"bank",brand:"AIB","brand:wikidata":"Q1642179","brand:wikipedia":"en:Allied Irish Banks",name:"AIB"},matchScore:2,suggestion:true},"amenity/bank/ANZ":{name:"ANZ",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q714641"},addTags:{amenity:"bank",brand:"ANZ","brand:wikidata":"Q714641","brand:wikipedia":"en:Australia and New Zealand Banking Group",name:"ANZ"},removeTags:{amenity:"bank",brand:"ANZ","brand:wikidata":"Q714641","brand:wikipedia":"en:Australia and New Zealand Banking Group",name:"ANZ"},matchScore:2,suggestion:true},"amenity/bank/ASB Bank":{name:"ASB Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q297214"},addTags:{amenity:"bank",brand:"ASB Bank","brand:wikidata":"Q297214","brand:wikipedia":"en:ASB Bank",name:"ASB Bank"},removeTags:{amenity:"bank",brand:"ASB Bank","brand:wikidata":"Q297214","brand:wikipedia":"en:ASB Bank",name:"ASB Bank"},matchScore:2,suggestion:true},"amenity/bank/ATB Financial":{name:"ATB Financial",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q298762"},addTags:{amenity:"bank",brand:"ATB Financial","brand:wikidata":"Q298762","brand:wikipedia":"en:ATB Financial",name:"ATB Financial"},removeTags:{amenity:"bank",brand:"ATB Financial","brand:wikidata":"Q298762","brand:wikipedia":"en:ATB Financial",name:"ATB Financial"},matchScore:2,suggestion:true},"amenity/bank/AXA":{name:"AXA",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q160054"},addTags:{amenity:"bank",brand:"AXA","brand:wikidata":"Q160054","brand:wikipedia":"en:AXA",name:"AXA"},removeTags:{amenity:"bank",brand:"AXA","brand:wikidata":"Q160054","brand:wikipedia":"en:AXA",name:"AXA"},matchScore:2,suggestion:true},"amenity/bank/Access Bank":{name:"Access Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4672420"},addTags:{amenity:"bank","brand:wikidata":"Q4672420","brand:wikipedia":"en:Access Bank Group",name:"Access Bank"},removeTags:{amenity:"bank","brand:wikidata":"Q4672420","brand:wikipedia":"en:Access Bank Group",name:"Access Bank"},matchScore:2,suggestion:true},"amenity/bank/Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড":{name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q517050"},addTags:{amenity:"bank",brand:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","brand:wikidata":"Q517050","brand:wikipedia":"en:Agrani Bank",name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড"},removeTags:{amenity:"bank",brand:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","brand:wikidata":"Q517050","brand:wikipedia":"en:Agrani Bank",name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড"},matchScore:2,suggestion:true},"amenity/bank/Agribank":{name:"Agribank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4693829"},addTags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693829","brand:wikipedia":"en:AgriBank",name:"Agribank"},removeTags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693829","brand:wikipedia":"en:AgriBank",name:"Agribank"},matchScore:2,suggestion:true},"amenity/bank/Akbank":{name:"Akbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q416624"},addTags:{amenity:"bank",brand:"Akbank","brand:wikidata":"Q416624","brand:wikipedia":"en:Akbank",name:"Akbank"},removeTags:{amenity:"bank",brand:"Akbank","brand:wikidata":"Q416624","brand:wikipedia":"en:Akbank",name:"Akbank"},matchScore:2,suggestion:true},"amenity/bank/Alior Bank":{name:"Alior Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9148395"},addTags:{amenity:"bank",brand:"Alior Bank","brand:wikidata":"Q9148395","brand:wikipedia":"en:Alior Bank",name:"Alior Bank"},removeTags:{amenity:"bank",brand:"Alior Bank","brand:wikidata":"Q9148395","brand:wikipedia":"en:Alior Bank",name:"Alior Bank"},matchScore:2,suggestion:true},"amenity/bank/Allahabad Bank":{name:"Allahabad Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2018840"},addTags:{amenity:"bank",brand:"Allahabad Bank","brand:wikidata":"Q2018840","brand:wikipedia":"en:Allahabad Bank",name:"Allahabad Bank"},removeTags:{amenity:"bank",brand:"Allahabad Bank","brand:wikidata":"Q2018840","brand:wikipedia":"en:Allahabad Bank",name:"Allahabad Bank"},matchScore:2,suggestion:true},"amenity/bank/Allied Bank":{name:"Allied Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4732555"},addTags:{amenity:"bank",brand:"Allied Bank","brand:wikidata":"Q4732555","brand:wikipedia":"en:Allied Banking Corporation",name:"Allied Bank"},removeTags:{amenity:"bank",brand:"Allied Bank","brand:wikidata":"Q4732555","brand:wikipedia":"en:Allied Banking Corporation",name:"Allied Bank"},matchScore:2,suggestion:true},"amenity/bank/Alpha Bank":{name:"Alpha Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q747394"},addTags:{amenity:"bank",brand:"Alpha Bank","brand:wikidata":"Q747394","brand:wikipedia":"en:Alpha Bank",name:"Alpha Bank"},removeTags:{amenity:"bank",brand:"Alpha Bank","brand:wikidata":"Q747394","brand:wikipedia":"en:Alpha Bank",name:"Alpha Bank"},matchScore:2,suggestion:true},"amenity/bank/Andhra Bank":{name:"Andhra Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003476"},addTags:{amenity:"bank",brand:"Andhra Bank","brand:wikidata":"Q2003476","brand:wikipedia":"en:Andhra Bank",name:"Andhra Bank"},removeTags:{amenity:"bank",brand:"Andhra Bank","brand:wikidata":"Q2003476","brand:wikipedia":"en:Andhra Bank",name:"Andhra Bank"},matchScore:2,suggestion:true},"amenity/bank/Antonveneta":{name:"Antonveneta",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633689"},addTags:{amenity:"bank",brand:"Antonveneta","brand:wikidata":"Q3633689","brand:wikipedia":"en:Banca Antonveneta",name:"Antonveneta"},removeTags:{amenity:"bank",brand:"Antonveneta","brand:wikidata":"Q3633689","brand:wikipedia":"en:Banca Antonveneta",name:"Antonveneta"},matchScore:2,suggestion:true},"amenity/bank/Argenta":{name:"Argenta",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q932856"},addTags:{amenity:"bank",brand:"Argenta","brand:wikidata":"Q932856","brand:wikipedia":"en:Argenta (bank)",name:"Argenta"},removeTags:{amenity:"bank",brand:"Argenta","brand:wikidata":"Q932856","brand:wikipedia":"en:Argenta (bank)",name:"Argenta"},matchScore:2,suggestion:true},"amenity/bank/Arvest Bank":{name:"Arvest Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4802393"},addTags:{amenity:"bank",brand:"Arvest Bank","brand:wikidata":"Q4802393","brand:wikipedia":"en:Arvest Bank",name:"Arvest Bank"},removeTags:{amenity:"bank",brand:"Arvest Bank","brand:wikidata":"Q4802393","brand:wikipedia":"en:Arvest Bank",name:"Arvest Bank"},matchScore:2,suggestion:true},"amenity/bank/Asia United Bank":{name:"Asia United Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4806482"},addTags:{amenity:"bank",brand:"Asia United Bank","brand:wikidata":"Q4806482","brand:wikipedia":"en:Asia United Bank",name:"Asia United Bank"},removeTags:{amenity:"bank",brand:"Asia United Bank","brand:wikidata":"Q4806482","brand:wikipedia":"en:Asia United Bank",name:"Asia United Bank"},matchScore:2,suggestion:true},"amenity/bank/Askari Bank":{name:"Askari Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4807137"},addTags:{amenity:"bank",brand:"Askari Bank","brand:wikidata":"Q4807137","brand:wikipedia":"en:Askari Bank",name:"Askari Bank"},removeTags:{amenity:"bank",brand:"Askari Bank","brand:wikidata":"Q4807137","brand:wikipedia":"en:Askari Bank",name:"Askari Bank"},matchScore:2,suggestion:true},"amenity/bank/Associated Bank":{name:"Associated Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4809155"},addTags:{amenity:"bank",brand:"Associated Bank","brand:wikidata":"Q4809155","brand:wikipedia":"en:Associated Banc-Corp",name:"Associated Bank"},removeTags:{amenity:"bank",brand:"Associated Bank","brand:wikidata":"Q4809155","brand:wikipedia":"en:Associated Banc-Corp",name:"Associated Bank"},matchScore:2,suggestion:true},"amenity/bank/Attijariwafa Bank":{name:"Attijariwafa Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q758052"},addTags:{amenity:"bank",brand:"Attijariwafa Bank","brand:wikidata":"Q758052","brand:wikipedia":"en:Attijariwafa Bank",name:"Attijariwafa Bank"},removeTags:{amenity:"bank",brand:"Attijariwafa Bank","brand:wikidata":"Q758052","brand:wikipedia":"en:Attijariwafa Bank",name:"Attijariwafa Bank"},matchScore:2,suggestion:true},"amenity/bank/Axis Bank":{name:"Axis Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003549"},addTags:{amenity:"bank",brand:"Axis Bank","brand:wikidata":"Q2003549","brand:wikipedia":"en:Axis Bank",name:"Axis Bank"},removeTags:{amenity:"bank",brand:"Axis Bank","brand:wikidata":"Q2003549","brand:wikipedia":"en:Axis Bank",name:"Axis Bank"},matchScore:2,suggestion:true},"amenity/bank/BAC":{name:"BAC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5715556"},addTags:{amenity:"bank",brand:"BAC","brand:wikidata":"Q5715556","brand:wikipedia":"en:Banco de America Central",name:"BAC"},removeTags:{amenity:"bank",brand:"BAC","brand:wikidata":"Q5715556","brand:wikipedia":"en:Banco de America Central",name:"BAC"},matchScore:2,suggestion:true},"amenity/bank/BAWAG PSK":{name:"BAWAG PSK",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q379938"},addTags:{amenity:"bank",brand:"BAWAG PSK","brand:wikidata":"Q379938","brand:wikipedia":"en:BAWAG P.S.K.",name:"BAWAG PSK"},removeTags:{amenity:"bank",brand:"BAWAG PSK","brand:wikidata":"Q379938","brand:wikipedia":"en:BAWAG P.S.K.",name:"BAWAG PSK"},matchScore:2,suggestion:true},"amenity/bank/BB&T":{name:"BB&T",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q795486"},addTags:{amenity:"bank",brand:"BB&T","brand:wikidata":"Q795486","brand:wikipedia":"en:BB&T",name:"BB&T"},removeTags:{amenity:"bank",brand:"BB&T","brand:wikidata":"Q795486","brand:wikipedia":"en:BB&T",name:"BB&T"},matchScore:2,suggestion:true},"amenity/bank/BBBank":{name:"BBBank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q795504"},addTags:{amenity:"bank",brand:"BBBank","brand:wikidata":"Q795504","brand:wikipedia":"en:BBBank",name:"BBBank"},removeTags:{amenity:"bank",brand:"BBBank","brand:wikidata":"Q795504","brand:wikipedia":"en:BBBank",name:"BBBank"},matchScore:2,suggestion:true},"amenity/bank/BBVA":{name:"BBVA",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806189"},addTags:{amenity:"bank",brand:"BBVA","brand:wikidata":"Q806189","brand:wikipedia":"en:Banco Bilbao Vizcaya Argentaria",name:"BBVA"},removeTags:{amenity:"bank",brand:"BBVA","brand:wikidata":"Q806189","brand:wikipedia":"en:Banco Bilbao Vizcaya Argentaria",name:"BBVA"},matchScore:2,suggestion:true},"amenity/bank/BBVA Bancomer":{name:"BBVA Bancomer",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2876794"},addTags:{amenity:"bank",brand:"BBVA Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"BBVA Bancomer"},removeTags:{amenity:"bank",brand:"BBVA Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"BBVA Bancomer"},matchScore:2,suggestion:true},"amenity/bank/BBVA Compass":{name:"BBVA Compass",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4835088"},addTags:{amenity:"bank",brand:"BBVA Compass","brand:wikidata":"Q4835088","brand:wikipedia":"en:BBVA Compass",name:"BBVA Compass"},removeTags:{amenity:"bank",brand:"BBVA Compass","brand:wikidata":"Q4835088","brand:wikipedia":"en:BBVA Compass",name:"BBVA Compass"},matchScore:2,suggestion:true},"amenity/bank/BBVA Continental":{name:"BBVA Continental",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4835089"},addTags:{amenity:"bank",brand:"BBVA Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"BBVA Continental"},removeTags:{amenity:"bank",brand:"BBVA Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"BBVA Continental"},matchScore:2,suggestion:true},"amenity/bank/BBVA Francés":{name:"BBVA Francés",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2876788"},addTags:{amenity:"bank",brand:"BBVA Francés","brand:wikidata":"Q2876788","brand:wikipedia":"en:BBVA Francés",name:"BBVA Francés"},removeTags:{amenity:"bank",brand:"BBVA Francés","brand:wikidata":"Q2876788","brand:wikipedia":"en:BBVA Francés",name:"BBVA Francés"},matchScore:2,suggestion:true},"amenity/bank/BCA":{name:"BCA",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806626"},addTags:{amenity:"bank",brand:"BCA","brand:wikidata":"Q806626","brand:wikipedia":"id:Bank Central Asia",name:"BCA"},removeTags:{amenity:"bank",brand:"BCA","brand:wikidata":"Q806626","brand:wikipedia":"id:Bank Central Asia",name:"BCA"},matchScore:2,suggestion:true},"amenity/bank/BCI":{name:"BCI",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882083"},addTags:{amenity:"bank",brand:"BCI","brand:wikidata":"Q2882083","brand:wikipedia":"es:Banco de Crédito e Inversiones",name:"BCI"},removeTags:{amenity:"bank",brand:"BCI","brand:wikidata":"Q2882083","brand:wikipedia":"es:Banco de Crédito e Inversiones",name:"BCI"},matchScore:2,suggestion:true},"amenity/bank/BCP (Bolivia)":{name:"BCP (Bolivia)",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q16826675"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q16826675","brand:wikipedia":"es:Banco de Crédito de Bolivia",name:"BCP"},removeTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q16826675","brand:wikipedia":"es:Banco de Crédito de Bolivia",name:"BCP"},matchScore:2,suggestion:true},"amenity/bank/BCP (France)":{name:"BCP (France)",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q118581"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},removeTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},matchScore:2,suggestion:true},"amenity/bank/BCP (Luxembourg)":{name:"BCP (Luxembourg)",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q118581"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},removeTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},matchScore:2,suggestion:true},"amenity/bank/BCP (Peru)":{name:"BCP (Peru)",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854124"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q4854124","brand:wikipedia":"es:Banco de Crédito del Perú",name:"BCP"},removeTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q4854124","brand:wikipedia":"es:Banco de Crédito del Perú",name:"BCP"},matchScore:2,suggestion:true},"amenity/bank/BCR":{name:"BCR",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6951632"},addTags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q6951632","brand:wikipedia":"es:Banco de Costa Rica",name:"BCR"},removeTags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q6951632","brand:wikipedia":"es:Banco de Costa Rica",name:"BCR"},matchScore:2,suggestion:true},"amenity/bank/BDO":{name:"BDO",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854129"},addTags:{amenity:"bank",brand:"BDO","brand:wikidata":"Q4854129","brand:wikipedia":"en:Banco de Oro",name:"BDO"},removeTags:{amenity:"bank",brand:"BDO","brand:wikidata":"Q4854129","brand:wikipedia":"en:Banco de Oro",name:"BDO"},matchScore:2,suggestion:true},"amenity/bank/BGŻ BNP Paribas":{name:"BGŻ BNP Paribas",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9164980"},addTags:{amenity:"bank",brand:"BGŻ BNP Paribas","brand:wikidata":"Q9164980","brand:wikipedia":"pl:Bank BGŻ BNP Paribas",name:"BGŻ BNP Paribas"},removeTags:{amenity:"bank",brand:"BGŻ BNP Paribas","brand:wikidata":"Q9164980","brand:wikipedia":"pl:Bank BGŻ BNP Paribas",name:"BGŻ BNP Paribas"},matchScore:2,suggestion:true},"amenity/bank/BMCE Bank":{name:"BMCE Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2300433"},addTags:{amenity:"bank",brand:"BMCE Bank","brand:wikidata":"Q2300433","brand:wikipedia":"ar:البنك المغربي للتجارة الخارجية",name:"BMCE Bank"},removeTags:{amenity:"bank",brand:"BMCE Bank","brand:wikidata":"Q2300433","brand:wikipedia":"ar:البنك المغربي للتجارة الخارجية",name:"BMCE Bank"},matchScore:2,suggestion:true},"amenity/bank/BMCI":{name:"BMCI",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883409"},addTags:{amenity:"bank",brand:"BMCI","brand:wikidata":"Q2883409","brand:wikipedia":"ar:البنك المغربي للتجارة والصناعة",name:"BMCI"},removeTags:{amenity:"bank",brand:"BMCI","brand:wikidata":"Q2883409","brand:wikipedia":"ar:البنك المغربي للتجارة والصناعة",name:"BMCI"},matchScore:2,suggestion:true},"amenity/bank/BMN":{name:"BMN",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3754900"},addTags:{amenity:"bank",brand:"BMN","brand:wikidata":"Q3754900","brand:wikipedia":"es:Banco Mare Nostrum",name:"BMN"},removeTags:{amenity:"bank",brand:"BMN","brand:wikidata":"Q3754900","brand:wikipedia":"es:Banco Mare Nostrum",name:"BMN"},matchScore:2,suggestion:true},"amenity/bank/BMO":{name:"BMO",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806693"},addTags:{amenity:"bank",brand:"BMO","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"BMO"},removeTags:{amenity:"bank",brand:"BMO","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"BMO"},matchScore:2,suggestion:true},"amenity/bank/BMO Harris Bank":{name:"BMO Harris Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4835981"},addTags:{amenity:"bank",brand:"BMO Harris Bank","brand:wikidata":"Q4835981","brand:wikipedia":"en:BMO Harris Bank",name:"BMO Harris Bank"},removeTags:{amenity:"bank",brand:"BMO Harris Bank","brand:wikidata":"Q4835981","brand:wikipedia":"en:BMO Harris Bank",name:"BMO Harris Bank"},matchScore:2,suggestion:true},"amenity/bank/BNA":{name:"BNA",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883410"},addTags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883410","brand:wikipedia":"fr:Banque nationale d'Algérie",name:"BNA"},removeTags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883410","brand:wikipedia":"fr:Banque nationale d'Algérie",name:"BNA"},matchScore:2,suggestion:true},"amenity/bank/BNI":{name:"BNI",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882611"},addTags:{amenity:"bank",brand:"BNI","brand:wikidata":"Q2882611","brand:wikipedia":"id:Bank Negara Indonesia",name:"BNI"},removeTags:{amenity:"bank",brand:"BNI","brand:wikidata":"Q2882611","brand:wikipedia":"id:Bank Negara Indonesia",name:"BNI"},matchScore:2,suggestion:true},"amenity/bank/BNL":{name:"BNL",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2201225"},addTags:{amenity:"bank",brand:"BNL","brand:wikidata":"Q2201225","brand:wikipedia":"en:Banca Nazionale del Lavoro",name:"BNL"},removeTags:{amenity:"bank",brand:"BNL","brand:wikidata":"Q2201225","brand:wikipedia":"en:Banca Nazionale del Lavoro",name:"BNL"},matchScore:2,suggestion:true},"amenity/bank/BNP Paribas":{name:"BNP Paribas",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q499707"},addTags:{amenity:"bank",brand:"BNP Paribas","brand:wikidata":"Q499707","brand:wikipedia":"en:BNP Paribas",name:"BNP Paribas"},removeTags:{amenity:"bank",brand:"BNP Paribas","brand:wikidata":"Q499707","brand:wikipedia":"en:BNP Paribas",name:"BNP Paribas"},matchScore:2,suggestion:true},"amenity/bank/BNP Paribas Fortis":{name:"BNP Paribas Fortis",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q796827"},addTags:{amenity:"bank",brand:"BNP Paribas Fortis","brand:wikidata":"Q796827","brand:wikipedia":"en:BNP Paribas Fortis",name:"BNP Paribas Fortis"},removeTags:{amenity:"bank",brand:"BNP Paribas Fortis","brand:wikidata":"Q796827","brand:wikipedia":"en:BNP Paribas Fortis",name:"BNP Paribas Fortis"},matchScore:2,suggestion:true},"amenity/bank/BOC":{name:"BOC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q790068"},addTags:{amenity:"bank",brand:"BOC","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"BOC"},removeTags:{amenity:"bank",brand:"BOC","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"BOC"},matchScore:2,suggestion:true},"amenity/bank/BPI":{name:"BPI",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2501256"},addTags:{amenity:"bank",brand:"BPI","brand:wikidata":"Q2501256","brand:wikipedia":"en:Bank of the Philippine Islands",name:"BPI"},removeTags:{amenity:"bank",brand:"BPI","brand:wikidata":"Q2501256","brand:wikipedia":"en:Bank of the Philippine Islands",name:"BPI"},matchScore:2,suggestion:true},"amenity/bank/BRD":{name:"BRD",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q796927"},addTags:{amenity:"bank",brand:"BRD","brand:wikidata":"Q796927","brand:wikipedia":"ro:BRD - Groupe Société Générale",name:"BRD"},removeTags:{amenity:"bank",brand:"BRD","brand:wikidata":"Q796927","brand:wikipedia":"ro:BRD - Groupe Société Générale",name:"BRD"},matchScore:2,suggestion:true},"amenity/bank/BRED":{name:"BRED",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2877455"},addTags:{amenity:"bank",brand:"BRED","brand:wikidata":"Q2877455","brand:wikipedia":"fr:BRED Banque populaire",name:"BRED"},removeTags:{amenity:"bank",brand:"BRED","brand:wikidata":"Q2877455","brand:wikipedia":"fr:BRED Banque populaire",name:"BRED"},matchScore:2,suggestion:true},"amenity/bank/BRI":{name:"BRI",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q623042"},addTags:{amenity:"bank",brand:"BRI","brand:wikidata":"Q623042","brand:wikipedia":"id:Bank Rakyat Indonesia",name:"BRI"},removeTags:{amenity:"bank",brand:"BRI","brand:wikidata":"Q623042","brand:wikipedia":"id:Bank Rakyat Indonesia",name:"BRI"},matchScore:2,suggestion:true},"amenity/bank/BTN":{name:"BTN",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12474534"},addTags:{amenity:"bank",brand:"BTN","brand:en":"BTN","brand:wikidata":"Q12474534","brand:wikipedia":"id:Bank Tabungan Negara",name:"BTN","name:en":"BTN"},removeTags:{amenity:"bank",brand:"BTN","brand:en":"BTN","brand:wikidata":"Q12474534","brand:wikipedia":"id:Bank Tabungan Negara",name:"BTN","name:en":"BTN"},matchScore:2,suggestion:true},"amenity/bank/BW-Bank":{name:"BW-Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q798891"},addTags:{amenity:"bank",brand:"BW-Bank","brand:en":"BW-Bank","brand:wikidata":"Q798891","brand:wikipedia":"de:Baden-Württembergische Bank",name:"BW-Bank","name:en":"BW-Bank"},removeTags:{amenity:"bank",brand:"BW-Bank","brand:en":"BW-Bank","brand:wikidata":"Q798891","brand:wikipedia":"de:Baden-Württembergische Bank",name:"BW-Bank","name:en":"BW-Bank"},matchScore:2,suggestion:true},"amenity/bank/Banamex":{name:"Banamex",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q749474"},addTags:{amenity:"bank",brand:"Banamex","brand:wikidata":"Q749474","brand:wikipedia":"en:Grupo Financiero Banamex",name:"Banamex"},removeTags:{amenity:"bank",brand:"Banamex","brand:wikidata":"Q749474","brand:wikipedia":"en:Grupo Financiero Banamex",name:"Banamex"},matchScore:2,suggestion:true},"amenity/bank/Banca Intesa":{name:"Banca Intesa",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q647092"},addTags:{amenity:"bank",brand:"Banca Intesa","brand:wikidata":"Q647092","brand:wikipedia":"en:Banca Intesa",name:"Banca Intesa"},removeTags:{amenity:"bank",brand:"Banca Intesa","brand:wikidata":"Q647092","brand:wikipedia":"en:Banca Intesa",name:"Banca Intesa"},matchScore:2,suggestion:true},"amenity/bank/Banca March":{name:"Banca March",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q578252"},addTags:{amenity:"bank",brand:"Banca March","brand:wikidata":"Q578252","brand:wikipedia":"en:Banca March",name:"Banca March"},removeTags:{amenity:"bank",brand:"Banca March","brand:wikidata":"Q578252","brand:wikipedia":"en:Banca March",name:"Banca March"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Milano":{name:"Banca Popolare di Milano",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806154"},addTags:{amenity:"bank",brand:"Banca Popolare di Milano","brand:wikidata":"Q806154","brand:wikipedia":"en:Banca Popolare di Milano",name:"Banca Popolare di Milano"},removeTags:{amenity:"bank",brand:"Banca Popolare di Milano","brand:wikidata":"Q806154","brand:wikipedia":"en:Banca Popolare di Milano",name:"Banca Popolare di Milano"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Novara":{name:"Banca Popolare di Novara",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633742"},addTags:{amenity:"bank",brand:"Banca Popolare di Novara","brand:wikidata":"Q3633742","brand:wikipedia":"en:Banca Popolare di Novara",name:"Banca Popolare di Novara"},removeTags:{amenity:"bank",brand:"Banca Popolare di Novara","brand:wikidata":"Q3633742","brand:wikipedia":"en:Banca Popolare di Novara",name:"Banca Popolare di Novara"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Sondrio":{name:"Banca Popolare di Sondrio",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q686176"},addTags:{amenity:"bank",brand:"Banca Popolare di Sondrio","brand:wikidata":"Q686176","brand:wikipedia":"en:Banca Popolare di Sondrio",name:"Banca Popolare di Sondrio"},removeTags:{amenity:"bank",brand:"Banca Popolare di Sondrio","brand:wikidata":"Q686176","brand:wikipedia":"en:Banca Popolare di Sondrio",name:"Banca Popolare di Sondrio"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Verona":{name:"Banca Popolare di Verona",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3167468"},addTags:{amenity:"bank",brand:"Banca Popolare di Verona","brand:wikidata":"Q3167468","brand:wikipedia":"en:Banca Popolare di Verona",name:"Banca Popolare di Verona"},removeTags:{amenity:"bank",brand:"Banca Popolare di Verona","brand:wikidata":"Q3167468","brand:wikipedia":"en:Banca Popolare di Verona",name:"Banca Popolare di Verona"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Vicenza":{name:"Banca Popolare di Vicenza",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3127200"},addTags:{amenity:"bank",brand:"Banca Popolare di Vicenza","brand:wikidata":"Q3127200","brand:wikipedia":"en:Banca Popolare di Vicenza",name:"Banca Popolare di Vicenza"},removeTags:{amenity:"bank",brand:"Banca Popolare di Vicenza","brand:wikidata":"Q3127200","brand:wikipedia":"en:Banca Popolare di Vicenza",name:"Banca Popolare di Vicenza"},matchScore:2,suggestion:true},"amenity/bank/Banca Românească":{name:"Banca Românească",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854052"},addTags:{amenity:"bank",brand:"Banca Românească","brand:wikidata":"Q4854052","brand:wikipedia":"en:Banca Românească",name:"Banca Românească"},removeTags:{amenity:"bank",brand:"Banca Românească","brand:wikidata":"Q4854052","brand:wikipedia":"en:Banca Românească",name:"Banca Românească"},matchScore:2,suggestion:true},"amenity/bank/Banca Sella":{name:"Banca Sella",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633749"},addTags:{amenity:"bank",brand:"Banca Sella","brand:wikidata":"Q3633749","brand:wikipedia":"en:Banca Sella Group",name:"Banca Sella"},removeTags:{amenity:"bank",brand:"Banca Sella","brand:wikidata":"Q3633749","brand:wikipedia":"en:Banca Sella Group",name:"Banca Sella"},matchScore:2,suggestion:true},"amenity/bank/Banca Transilvania":{name:"Banca Transilvania",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806161"},addTags:{amenity:"bank",brand:"Banca Transilvania","brand:wikidata":"Q806161","brand:wikipedia":"en:Banca Transilvania",name:"Banca Transilvania"},removeTags:{amenity:"bank",brand:"Banca Transilvania","brand:wikidata":"Q806161","brand:wikipedia":"en:Banca Transilvania",name:"Banca Transilvania"},matchScore:2,suggestion:true},"amenity/bank/Bancaribe":{name:"Bancaribe",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5717827"},addTags:{amenity:"bank",brand:"Bancaribe","brand:wikidata":"Q5717827","brand:wikipedia":"en:Bancaribe",name:"Bancaribe"},removeTags:{amenity:"bank",brand:"Bancaribe","brand:wikidata":"Q5717827","brand:wikipedia":"en:Bancaribe",name:"Bancaribe"},matchScore:2,suggestion:true},"amenity/bank/Banco AV Villas":{name:"Banco AV Villas",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854068"},addTags:{amenity:"bank",brand:"Banco AV Villas","brand:wikidata":"Q4854068","brand:wikipedia":"en:Banco AV Villas",name:"Banco AV Villas"},removeTags:{amenity:"bank",brand:"Banco AV Villas","brand:wikidata":"Q4854068","brand:wikipedia":"en:Banco AV Villas",name:"Banco AV Villas"},matchScore:2,suggestion:true},"amenity/bank/Banco Agrario":{name:"Banco Agrario",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q20013358"},addTags:{amenity:"bank",brand:"Banco Agrario","brand:wikidata":"Q20013358","brand:wikipedia":"en:Banco Agrario de Colombia",name:"Banco Agrario"},removeTags:{amenity:"bank",brand:"Banco Agrario","brand:wikidata":"Q20013358","brand:wikipedia":"en:Banco Agrario de Colombia",name:"Banco Agrario"},matchScore:2,suggestion:true},"amenity/bank/Banco Agrario de Colombia":{name:"Banco Agrario de Colombia",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q20013358"},addTags:{amenity:"bank",brand:"Banco Agrario de Colombia","brand:wikidata":"Q20013358","brand:wikipedia":"en:Banco Agrario de Colombia",name:"Banco Agrario de Colombia"},removeTags:{amenity:"bank",brand:"Banco Agrario de Colombia","brand:wikidata":"Q20013358","brand:wikipedia":"en:Banco Agrario de Colombia",name:"Banco Agrario de Colombia"},matchScore:2,suggestion:true},"amenity/bank/Banco Azteca":{name:"Banco Azteca",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854076"},addTags:{amenity:"bank",brand:"Banco Azteca","brand:wikidata":"Q4854076","brand:wikipedia":"en:Banco Azteca",name:"Banco Azteca"},removeTags:{amenity:"bank",brand:"Banco Azteca","brand:wikidata":"Q4854076","brand:wikipedia":"en:Banco Azteca",name:"Banco Azteca"},matchScore:2,suggestion:true},"amenity/bank/Banco BPM":{name:"Banco BPM",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q27331643"},addTags:{amenity:"bank",brand:"Banco BPM","brand:wikidata":"Q27331643","brand:wikipedia":"en:Banco BPM",name:"Banco BPM"},removeTags:{amenity:"bank",brand:"Banco BPM","brand:wikidata":"Q27331643","brand:wikipedia":"en:Banco BPM",name:"Banco BPM"},matchScore:2,suggestion:true},"amenity/bank/Banco Caja Social":{name:"Banco Caja Social",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5717869"},addTags:{amenity:"bank",brand:"Banco Caja Social","brand:wikidata":"Q5717869","brand:wikipedia":"es:Banco Caja Social",name:"Banco Caja Social"},removeTags:{amenity:"bank",brand:"Banco Caja Social","brand:wikidata":"Q5717869","brand:wikipedia":"es:Banco Caja Social",name:"Banco Caja Social"},matchScore:2,suggestion:true},"amenity/bank/Banco Ciudad":{name:"Banco Ciudad",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4856204"},addTags:{amenity:"bank",brand:"Banco Ciudad","brand:wikidata":"Q4856204","brand:wikipedia":"en:Bank of the City of Buenos Aires",name:"Banco Ciudad"},removeTags:{amenity:"bank",brand:"Banco Ciudad","brand:wikidata":"Q4856204","brand:wikipedia":"en:Bank of the City of Buenos Aires",name:"Banco Ciudad"},matchScore:2,suggestion:true},"amenity/bank/Banco Continental":{name:"Banco Continental",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4835089"},addTags:{amenity:"bank",brand:"Banco Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"Banco Continental"},removeTags:{amenity:"bank",brand:"Banco Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"Banco Continental"},matchScore:2,suggestion:true},"amenity/bank/Banco Estado":{name:"Banco Estado",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5718188"},addTags:{amenity:"bank",brand:"Banco Estado","brand:wikidata":"Q5718188","brand:wikipedia":"es:Banco del Estado de Chile",name:"Banco Estado"},removeTags:{amenity:"bank",brand:"Banco Estado","brand:wikidata":"Q5718188","brand:wikipedia":"es:Banco del Estado de Chile",name:"Banco Estado"},matchScore:2,suggestion:true},"amenity/bank/Banco Falabella":{name:"Banco Falabella",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854088"},addTags:{amenity:"bank",brand:"Banco Falabella","brand:wikidata":"Q4854088","brand:wikipedia":"en:Banco Falabella",name:"Banco Falabella"},removeTags:{amenity:"bank",brand:"Banco Falabella","brand:wikidata":"Q4854088","brand:wikipedia":"en:Banco Falabella",name:"Banco Falabella"},matchScore:2,suggestion:true},"amenity/bank/Banco G&T Continental":{name:"Banco G&T Continental",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5717949"},addTags:{amenity:"bank",brand:"Banco G&T Continental","brand:wikidata":"Q5717949","brand:wikipedia":"es:Banco GYT Continental, S.A.",name:"Banco G&T Continental"},removeTags:{amenity:"bank",brand:"Banco G&T Continental","brand:wikidata":"Q5717949","brand:wikipedia":"es:Banco GYT Continental, S.A.",name:"Banco G&T Continental"},matchScore:2,suggestion:true},"amenity/bank/Banco General":{name:"Banco General",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q27618271"},addTags:{amenity:"bank",brand:"Banco General","brand:wikidata":"Q27618271","brand:wikipedia":"es:Banco General (Panamá)",name:"Banco General"},removeTags:{amenity:"bank",brand:"Banco General","brand:wikidata":"Q27618271","brand:wikipedia":"es:Banco General (Panamá)",name:"Banco General"},matchScore:2,suggestion:true},"amenity/bank/Banco Industrial":{name:"Banco Industrial",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q16489444"},addTags:{amenity:"bank",brand:"Banco Industrial","brand:wikidata":"Q16489444","brand:wikipedia":"es:Banco Industrial",name:"Banco Industrial"},removeTags:{amenity:"bank",brand:"Banco Industrial","brand:wikidata":"Q16489444","brand:wikipedia":"es:Banco Industrial",name:"Banco Industrial"},matchScore:2,suggestion:true},"amenity/bank/Banco Nacional":{name:"Banco Nacional",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854104"},addTags:{amenity:"bank",brand:"Banco Nacional","brand:wikidata":"Q4854104","brand:wikipedia":"en:Banco Nacional",name:"Banco Nacional"},removeTags:{amenity:"bank",brand:"Banco Nacional","brand:wikidata":"Q4854104","brand:wikipedia":"en:Banco Nacional",name:"Banco Nacional"},matchScore:2,suggestion:true},"amenity/bank/Banco Nación":{name:"Banco Nación",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883376"},addTags:{amenity:"bank",brand:"Banco Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco Nación"},removeTags:{amenity:"bank",brand:"Banco Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco Nación"},matchScore:2,suggestion:true},"amenity/bank/Banco Pastor":{name:"Banco Pastor",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806193"},addTags:{amenity:"bank",brand:"Banco Pastor","brand:wikidata":"Q806193","brand:wikipedia":"en:Banco Pastor",name:"Banco Pastor"},removeTags:{amenity:"bank",brand:"Banco Pastor","brand:wikidata":"Q806193","brand:wikipedia":"en:Banco Pastor",name:"Banco Pastor"},matchScore:2,suggestion:true},"amenity/bank/Banco Pichincha":{name:"Banco Pichincha",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854135"},addTags:{amenity:"bank",brand:"Banco Pichincha","brand:wikidata":"Q4854135","brand:wikipedia":"en:Banco Pichincha",name:"Banco Pichincha"},removeTags:{amenity:"bank",brand:"Banco Pichincha","brand:wikidata":"Q4854135","brand:wikipedia":"en:Banco Pichincha",name:"Banco Pichincha"},matchScore:2,suggestion:true},"amenity/bank/Banco Popular":{name:"Banco Popular",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q537259"},addTags:{amenity:"bank",brand:"Banco Popular","brand:wikidata":"Q537259","brand:wikipedia":"es:Banco Popular Español",name:"Banco Popular"},removeTags:{amenity:"bank",brand:"Banco Popular","brand:wikidata":"Q537259","brand:wikipedia":"es:Banco Popular Español",name:"Banco Popular"},matchScore:2,suggestion:true},"amenity/bank/Banco Provincia":{name:"Banco Provincia",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4856209"},addTags:{amenity:"bank",brand:"Banco Provincia","brand:wikidata":"Q4856209","brand:wikipedia":"es:Banco de la Provincia de Buenos Aires",name:"Banco Provincia"},removeTags:{amenity:"bank",brand:"Banco Provincia","brand:wikidata":"Q4856209","brand:wikipedia":"es:Banco de la Provincia de Buenos Aires",name:"Banco Provincia"},matchScore:2,suggestion:true},"amenity/bank/Banco Sabadell":{name:"Banco Sabadell",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q762330"},addTags:{amenity:"bank",brand:"Banco Sabadell","brand:wikidata":"Q762330","brand:wikipedia":"es:Banco Sabadell",name:"Banco Sabadell"},removeTags:{amenity:"bank",brand:"Banco Sabadell","brand:wikidata":"Q762330","brand:wikipedia":"es:Banco Sabadell",name:"Banco Sabadell"},matchScore:2,suggestion:true},"amenity/bank/Banco Santa Fe":{name:"Banco Santa Fe",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6046871"},addTags:{amenity:"bank",brand:"Banco Santa Fe","brand:wikidata":"Q6046871","brand:wikipedia":"es:Nuevo Banco de Santa Fe",name:"Banco Santa Fe"},removeTags:{amenity:"bank",brand:"Banco Santa Fe","brand:wikidata":"Q6046871","brand:wikipedia":"es:Nuevo Banco de Santa Fe",name:"Banco Santa Fe"},matchScore:2,suggestion:true},"amenity/bank/Banco Santander":{name:"Banco Santander",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6496310"},addTags:{amenity:"bank",brand:"Banco Santander","brand:wikidata":"Q6496310","brand:wikipedia":"es:Banco Santander",name:"Banco Santander"},removeTags:{amenity:"bank",brand:"Banco Santander","brand:wikidata":"Q6496310","brand:wikipedia":"es:Banco Santander",name:"Banco Santander"},matchScore:2,suggestion:true},"amenity/bank/Banco de Bogotá":{name:"Banco de Bogotá",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854122"},addTags:{amenity:"bank",brand:"Banco de Bogotá","brand:wikidata":"Q4854122","brand:wikipedia":"es:Banco de Bogotá",name:"Banco de Bogotá"},removeTags:{amenity:"bank",brand:"Banco de Bogotá","brand:wikidata":"Q4854122","brand:wikipedia":"es:Banco de Bogotá",name:"Banco de Bogotá"},matchScore:2,suggestion:true},"amenity/bank/Banco de Chile":{name:"Banco de Chile",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882085"},addTags:{amenity:"bank",brand:"Banco de Chile","brand:wikidata":"Q2882085","brand:wikipedia":"es:Banco de Chile",name:"Banco de Chile"},removeTags:{amenity:"bank",brand:"Banco de Chile","brand:wikidata":"Q2882085","brand:wikipedia":"es:Banco de Chile",name:"Banco de Chile"},matchScore:2,suggestion:true},"amenity/bank/Banco de Desarrollo Banrural":{name:"Banco de Desarrollo Banrural",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5719130"},addTags:{amenity:"bank",brand:"Banco de Desarrollo Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banco de Desarrollo Banrural"},removeTags:{amenity:"bank",brand:"Banco de Desarrollo Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banco de Desarrollo Banrural"},matchScore:2,suggestion:true},"amenity/bank/Banco de Occidente":{name:"Banco de Occidente",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854127"},addTags:{amenity:"bank",brand:"Banco de Occidente","brand:wikidata":"Q4854127","brand:wikipedia":"es:Banco de Occidente (Colombia)",name:"Banco de Occidente"},removeTags:{amenity:"bank",brand:"Banco de Occidente","brand:wikidata":"Q4854127","brand:wikipedia":"es:Banco de Occidente (Colombia)",name:"Banco de Occidente"},matchScore:2,suggestion:true},"amenity/bank/Banco de Venezuela":{name:"Banco de Venezuela",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q517093"},addTags:{amenity:"bank",brand:"Banco de Venezuela","brand:wikidata":"Q517093","brand:wikipedia":"es:Banco de Venezuela",name:"Banco de Venezuela"},removeTags:{amenity:"bank",brand:"Banco de Venezuela","brand:wikidata":"Q517093","brand:wikipedia":"es:Banco de Venezuela",name:"Banco de Venezuela"},matchScore:2,suggestion:true},"amenity/bank/Banco de la Nación":{name:"Banco de la Nación",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883376"},addTags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco de la Nación"},removeTags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco de la Nación"},matchScore:2,suggestion:true},"amenity/bank/Banco di Napoli":{name:"Banco di Napoli",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633835"},addTags:{amenity:"bank",brand:"Banco di Napoli","brand:wikidata":"Q3633835","brand:wikipedia":"en:Banco di Napoli",name:"Banco di Napoli"},removeTags:{amenity:"bank",brand:"Banco di Napoli","brand:wikidata":"Q3633835","brand:wikipedia":"en:Banco di Napoli",name:"Banco di Napoli"},matchScore:2,suggestion:true},"amenity/bank/Banco di Sardegna":{name:"Banco di Sardegna",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806205"},addTags:{amenity:"bank",brand:"Banco di Sardegna","brand:wikidata":"Q806205","brand:wikipedia":"en:Banco di Sardegna",name:"Banco di Sardegna"},removeTags:{amenity:"bank",brand:"Banco di Sardegna","brand:wikidata":"Q806205","brand:wikipedia":"en:Banco di Sardegna",name:"Banco di Sardegna"},matchScore:2,suggestion:true},"amenity/bank/Banco do Brasil":{name:"Banco do Brasil",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q610817"},addTags:{amenity:"bank",brand:"Banco do Brasil","brand:wikidata":"Q610817","brand:wikipedia":"en:Banco do Brasil",name:"Banco do Brasil"},removeTags:{amenity:"bank",brand:"Banco do Brasil","brand:wikidata":"Q610817","brand:wikipedia":"en:Banco do Brasil",name:"Banco do Brasil"},matchScore:2,suggestion:true},"amenity/bank/Banco do Nordeste":{name:"Banco do Nordeste",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854137"},addTags:{amenity:"bank",brand:"Banco do Nordeste","brand:wikidata":"Q4854137","brand:wikipedia":"en:Banco do Nordeste",name:"Banco do Nordeste"},removeTags:{amenity:"bank",brand:"Banco do Nordeste","brand:wikidata":"Q4854137","brand:wikipedia":"en:Banco do Nordeste",name:"Banco do Nordeste"},matchScore:2,suggestion:true},"amenity/bank/Bancolombia":{name:"Bancolombia",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806206"},addTags:{amenity:"bank",brand:"Bancolombia","brand:wikidata":"Q806206","brand:wikipedia":"en:Bancolombia",name:"Bancolombia"},removeTags:{amenity:"bank",brand:"Bancolombia","brand:wikidata":"Q806206","brand:wikipedia":"en:Bancolombia",name:"Bancolombia"},matchScore:2,suggestion:true},"amenity/bank/Bancomer":{name:"Bancomer",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2876794"},addTags:{amenity:"bank",brand:"Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"Bancomer"},removeTags:{amenity:"bank",brand:"Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"Bancomer"},matchScore:2,suggestion:true},"amenity/bank/Bancpost":{name:"Bancpost",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854143"},addTags:{amenity:"bank",brand:"Bancpost","brand:wikidata":"Q4854143","brand:wikipedia":"ro:Bancpost",name:"Bancpost"},removeTags:{amenity:"bank",brand:"Bancpost","brand:wikidata":"Q4854143","brand:wikipedia":"ro:Bancpost",name:"Bancpost"},matchScore:2,suggestion:true},"amenity/bank/Banesco":{name:"Banesco",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854841"},addTags:{amenity:"bank",brand:"Banesco","brand:wikidata":"Q4854841","brand:wikipedia":"en:Banesco",name:"Banesco"},removeTags:{amenity:"bank",brand:"Banesco","brand:wikidata":"Q4854841","brand:wikipedia":"en:Banesco",name:"Banesco"},matchScore:2,suggestion:true},"amenity/bank/Bangkok Bank":{name:"Bangkok Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806483"},addTags:{amenity:"bank",brand:"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"Bangkok Bank"},removeTags:{amenity:"bank",brand:"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"Bangkok Bank"},matchScore:2,suggestion:true},"amenity/bank/Bank Al Habib":{name:"Bank Al Habib",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4034833"},addTags:{amenity:"bank",brand:"Bank Al Habib","brand:wikidata":"Q4034833","brand:wikipedia":"ur:بينک الحبيب لمیٹڈ",name:"Bank Al Habib"},removeTags:{amenity:"bank",brand:"Bank Al Habib","brand:wikidata":"Q4034833","brand:wikipedia":"ur:بينک الحبيب لمیٹڈ",name:"Bank Al Habib"},matchScore:2,suggestion:true},"amenity/bank/Bank Alfalah":{name:"Bank Alfalah",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855895"},addTags:{amenity:"bank",brand:"Bank Alfalah","brand:wikidata":"Q4855895","brand:wikipedia":"en:Bank Alfalah",name:"Bank Alfalah"},removeTags:{amenity:"bank",brand:"Bank Alfalah","brand:wikidata":"Q4855895","brand:wikipedia":"en:Bank Alfalah",name:"Bank Alfalah"},matchScore:2,suggestion:true},"amenity/bank/Bank Austria":{name:"Bank Austria",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q697619"},addTags:{amenity:"bank",brand:"Bank Austria","brand:wikidata":"Q697619","brand:wikipedia":"en:Bank Austria",name:"Bank Austria"},removeTags:{amenity:"bank",brand:"Bank Austria","brand:wikidata":"Q697619","brand:wikipedia":"en:Bank Austria",name:"Bank Austria"},matchScore:2,suggestion:true},"amenity/bank/Bank Danamon":{name:"Bank Danamon",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855913"},addTags:{amenity:"bank",brand:"Bank Danamon","brand:wikidata":"Q4855913","brand:wikipedia":"en:Bank Danamon",name:"Bank Danamon"},removeTags:{amenity:"bank",brand:"Bank Danamon","brand:wikidata":"Q4855913","brand:wikipedia":"en:Bank Danamon",name:"Bank Danamon"},matchScore:2,suggestion:true},"amenity/bank/Bank Mandiri":{name:"Bank Mandiri",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806639"},addTags:{amenity:"bank",brand:"Bank Mandiri","brand:wikidata":"Q806639","brand:wikipedia":"en:Bank Mandiri",name:"Bank Mandiri"},removeTags:{amenity:"bank",brand:"Bank Mandiri","brand:wikidata":"Q806639","brand:wikipedia":"en:Bank Mandiri",name:"Bank Mandiri"},matchScore:2,suggestion:true},"amenity/bank/Bank Mandiri Syariah":{name:"Bank Mandiri Syariah",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12474533"},addTags:{amenity:"bank",brand:"Bank Mandiri Syariah","brand:wikidata":"Q12474533","brand:wikipedia":"id:Bank Syariah Mandiri",name:"Bank Mandiri Syariah"},removeTags:{amenity:"bank",brand:"Bank Mandiri Syariah","brand:wikidata":"Q12474533","brand:wikipedia":"id:Bank Syariah Mandiri",name:"Bank Mandiri Syariah"},matchScore:2,suggestion:true},"amenity/bank/Bank Mega":{name:"Bank Mega",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12474504"},addTags:{amenity:"bank",brand:"Bank Mega","brand:wikidata":"Q12474504","brand:wikipedia":"id:Bank Mega",name:"Bank Mega"},removeTags:{amenity:"bank",brand:"Bank Mega","brand:wikidata":"Q12474504","brand:wikipedia":"id:Bank Mega",name:"Bank Mega"},matchScore:2,suggestion:true},"amenity/bank/Bank Muamalat":{name:"Bank Muamalat",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855949"},addTags:{amenity:"bank",brand:"Bank Muamalat","brand:wikidata":"Q4855949","brand:wikipedia":"en:Bank Muamalat",name:"Bank Muamalat"},removeTags:{amenity:"bank",brand:"Bank Muamalat","brand:wikidata":"Q4855949","brand:wikipedia":"en:Bank Muamalat",name:"Bank Muamalat"},matchScore:2,suggestion:true},"amenity/bank/Bank Pekao":{name:"Bank Pekao",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806642"},addTags:{amenity:"bank",brand:"Bank Pekao","brand:wikidata":"Q806642","brand:wikipedia":"en:Bank Pekao",name:"Bank Pekao"},removeTags:{amenity:"bank",brand:"Bank Pekao","brand:wikidata":"Q806642","brand:wikipedia":"en:Bank Pekao",name:"Bank Pekao"},matchScore:2,suggestion:true},"amenity/bank/Bank Rakyat":{name:"Bank Rakyat",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855964"},addTags:{amenity:"bank",brand:"Bank Rakyat","brand:wikidata":"Q4855964","brand:wikipedia":"ms:Bank Rakyat",name:"Bank Rakyat"},removeTags:{amenity:"bank",brand:"Bank Rakyat","brand:wikidata":"Q4855964","brand:wikipedia":"ms:Bank Rakyat",name:"Bank Rakyat"},matchScore:2,suggestion:true},"amenity/bank/Bank of Africa":{name:"Bank of Africa",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882627"},addTags:{amenity:"bank",brand:"Bank of Africa","brand:wikidata":"Q2882627","brand:wikipedia":"en:Bank of Africa Group",name:"Bank of Africa",short_name:"BOA"},removeTags:{amenity:"bank",brand:"Bank of Africa","brand:wikidata":"Q2882627","brand:wikipedia":"en:Bank of Africa Group",name:"Bank of Africa",short_name:"BOA"},matchScore:2,suggestion:true},"amenity/bank/Bank of America":{name:"Bank of America",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q487907"},addTags:{amenity:"bank",brand:"Bank of America","brand:wikidata":"Q487907","brand:wikipedia":"en:Bank of America",name:"Bank of America"},removeTags:{amenity:"bank",brand:"Bank of America","brand:wikidata":"Q487907","brand:wikipedia":"en:Bank of America",name:"Bank of America"},matchScore:2,suggestion:true},"amenity/bank/Bank of Baroda":{name:"Bank of Baroda",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003797"},addTags:{amenity:"bank",brand:"Bank of Baroda","brand:wikidata":"Q2003797","brand:wikipedia":"en:Bank of Baroda",name:"Bank of Baroda"},removeTags:{amenity:"bank",brand:"Bank of Baroda","brand:wikidata":"Q2003797","brand:wikipedia":"en:Bank of Baroda",name:"Bank of Baroda"},matchScore:2,suggestion:true},"amenity/bank/Bank of Ceylon":{name:"Bank of Ceylon",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882652"},addTags:{amenity:"bank",brand:"Bank of Ceylon","brand:wikidata":"Q2882652","brand:wikipedia":"en:Bank of Ceylon",name:"Bank of Ceylon"},removeTags:{amenity:"bank",brand:"Bank of Ceylon","brand:wikidata":"Q2882652","brand:wikipedia":"en:Bank of Ceylon",name:"Bank of Ceylon"},matchScore:2,suggestion:true},"amenity/bank/Bank of China":{name:"Bank of China",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q790068"},addTags:{amenity:"bank",brand:"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"Bank of China"},removeTags:{amenity:"bank",brand:"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"Bank of China"},matchScore:2,suggestion:true},"amenity/bank/Bank of Commerce":{name:"Bank of Commerce",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4856092"},addTags:{amenity:"bank",brand:"Bank of Commerce","brand:wikidata":"Q4856092","brand:wikipedia":"en:Bank of Commerce",name:"Bank of Commerce"},removeTags:{amenity:"bank",brand:"Bank of Commerce","brand:wikidata":"Q4856092","brand:wikipedia":"en:Bank of Commerce",name:"Bank of Commerce"},matchScore:2,suggestion:true},"amenity/bank/Bank of Cyprus":{name:"Bank of Cyprus",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806678"},addTags:{amenity:"bank",brand:"Bank of Cyprus","brand:wikidata":"Q806678","brand:wikipedia":"en:Bank of Cyprus",name:"Bank of Cyprus"},removeTags:{amenity:"bank",brand:"Bank of Cyprus","brand:wikidata":"Q806678","brand:wikipedia":"en:Bank of Cyprus",name:"Bank of Cyprus"},matchScore:2,suggestion:true},"amenity/bank/Bank of India":{name:"Bank of India",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2004439"},addTags:{amenity:"bank",brand:"Bank of India","brand:wikidata":"Q2004439","brand:wikipedia":"en:Bank of India",name:"Bank of India"},removeTags:{amenity:"bank",brand:"Bank of India","brand:wikidata":"Q2004439","brand:wikipedia":"en:Bank of India",name:"Bank of India"},matchScore:2,suggestion:true},"amenity/bank/Bank of Ireland":{name:"Bank of Ireland",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806689"},addTags:{amenity:"bank",brand:"Bank of Ireland","brand:wikidata":"Q806689","brand:wikipedia":"en:Bank of Ireland",name:"Bank of Ireland"},removeTags:{amenity:"bank",brand:"Bank of Ireland","brand:wikidata":"Q806689","brand:wikipedia":"en:Bank of Ireland",name:"Bank of Ireland"},matchScore:2,suggestion:true},"amenity/bank/Bank of Maharashtra":{name:"Bank of Maharashtra",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2004304"},addTags:{amenity:"bank",brand:"Bank of Maharashtra","brand:wikidata":"Q2004304","brand:wikipedia":"en:Bank of Maharashtra",name:"Bank of Maharashtra"},removeTags:{amenity:"bank",brand:"Bank of Maharashtra","brand:wikidata":"Q2004304","brand:wikipedia":"en:Bank of Maharashtra",name:"Bank of Maharashtra"},matchScore:2,suggestion:true},"amenity/bank/Bank of Montreal":{name:"Bank of Montreal",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806693"},addTags:{amenity:"bank",brand:"Bank of Montreal","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"Bank of Montreal"},removeTags:{amenity:"bank",brand:"Bank of Montreal","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"Bank of Montreal"},matchScore:2,suggestion:true},"amenity/bank/Bank of New Zealand":{name:"Bank of New Zealand",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806687"},addTags:{amenity:"bank",brand:"Bank of New Zealand","brand:wikidata":"Q806687","brand:wikipedia":"en:Bank of New Zealand",name:"Bank of New Zealand"},removeTags:{amenity:"bank",brand:"Bank of New Zealand","brand:wikidata":"Q806687","brand:wikipedia":"en:Bank of New Zealand",name:"Bank of New Zealand"},matchScore:2,suggestion:true},"amenity/bank/Bank of Scotland":{name:"Bank of Scotland",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q627381"},addTags:{amenity:"bank",brand:"Bank of Scotland","brand:wikidata":"Q627381","brand:wikipedia":"en:Bank of Scotland",name:"Bank of Scotland"},removeTags:{amenity:"bank",brand:"Bank of Scotland","brand:wikidata":"Q627381","brand:wikipedia":"en:Bank of Scotland",name:"Bank of Scotland"},matchScore:2,suggestion:true},"amenity/bank/Bank of the West":{name:"Bank of the West",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2881919"},addTags:{amenity:"bank",brand:"Bank of the West","brand:wikidata":"Q2881919","brand:wikipedia":"en:Bank of the West",name:"Bank of the West"},removeTags:{amenity:"bank",brand:"Bank of the West","brand:wikidata":"Q2881919","brand:wikipedia":"en:Bank of the West",name:"Bank of the West"},matchScore:2,suggestion:true},"amenity/bank/Bankia":{name:"Bankia",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806807"},addTags:{amenity:"bank",brand:"Bankia","brand:wikidata":"Q806807","brand:wikipedia":"en:Bankia",name:"Bankia"},removeTags:{amenity:"bank",brand:"Bankia","brand:wikidata":"Q806807","brand:wikipedia":"en:Bankia",name:"Bankia"},matchScore:2,suggestion:true},"amenity/bank/Bankinter":{name:"Bankinter",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806808"},addTags:{amenity:"bank",brand:"Bankinter","brand:wikidata":"Q806808","brand:wikipedia":"es:Bankinter",name:"Bankinter"},removeTags:{amenity:"bank",brand:"Bankinter","brand:wikidata":"Q806808","brand:wikipedia":"es:Bankinter",name:"Bankinter"},matchScore:2,suggestion:true},"amenity/bank/Banner Bank":{name:"Banner Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4856910"},addTags:{amenity:"bank",brand:"Banner Bank","brand:wikidata":"Q4856910","brand:wikipedia":"en:Banner Bank",name:"Banner Bank"},removeTags:{amenity:"bank",brand:"Banner Bank","brand:wikidata":"Q4856910","brand:wikipedia":"en:Banner Bank",name:"Banner Bank"},matchScore:2,suggestion:true},"amenity/bank/Banorte":{name:"Banorte",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806914"},addTags:{amenity:"bank",brand:"Banorte","brand:wikidata":"Q806914","brand:wikipedia":"en:Banorte",name:"Banorte"},removeTags:{amenity:"bank",brand:"Banorte","brand:wikidata":"Q806914","brand:wikipedia":"en:Banorte",name:"Banorte"},matchScore:2,suggestion:true},"amenity/bank/Banque Atlantique":{name:"Banque Atlantique",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882890"},addTags:{amenity:"bank",brand:"Banque Atlantique","brand:wikidata":"Q2882890","brand:wikipedia":"en:Atlantic Bank Group",name:"Banque Atlantique"},removeTags:{amenity:"bank",brand:"Banque Atlantique","brand:wikidata":"Q2882890","brand:wikipedia":"en:Atlantic Bank Group",name:"Banque Atlantique"},matchScore:2,suggestion:true},"amenity/bank/Banque Laurentienne":{name:"Banque Laurentienne",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1360087"},addTags:{amenity:"bank",brand:"Banque Laurentienne","brand:wikidata":"Q1360087","brand:wikipedia":"en:Laurentian Bank of Canada",name:"Banque Laurentienne"},removeTags:{amenity:"bank",brand:"Banque Laurentienne","brand:wikidata":"Q1360087","brand:wikipedia":"en:Laurentian Bank of Canada",name:"Banque Laurentienne"},matchScore:2,suggestion:true},"amenity/bank/Banque Populaire":{name:"Banque Populaire",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883441"},addTags:{amenity:"bank",brand:"Banque Populaire","brand:wikidata":"Q2883441","brand:wikipedia":"en:Banque Populaire du Maroc",name:"Banque Populaire"},removeTags:{amenity:"bank",brand:"Banque Populaire","brand:wikidata":"Q2883441","brand:wikipedia":"en:Banque Populaire du Maroc",name:"Banque Populaire"},matchScore:2,suggestion:true},"amenity/bank/Banrisul":{name:"Banrisul",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4857098"},addTags:{amenity:"bank",brand:"Banrisul","brand:wikidata":"Q4857098","brand:wikipedia":"en:Banrisul",name:"Banrisul"},removeTags:{amenity:"bank",brand:"Banrisul","brand:wikidata":"Q4857098","brand:wikipedia":"en:Banrisul",name:"Banrisul"},matchScore:2,suggestion:true},"amenity/bank/Barclays":{name:"Barclays",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q245343"},addTags:{amenity:"bank",brand:"Barclays","brand:wikidata":"Q245343","brand:wikipedia":"en:Barclays",name:"Barclays"},removeTags:{amenity:"bank",brand:"Barclays","brand:wikidata":"Q245343","brand:wikipedia":"en:Barclays",name:"Barclays"},matchScore:2,suggestion:true},"amenity/bank/Belfius":{name:"Belfius",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1956014"},addTags:{amenity:"bank",brand:"Belfius","brand:wikidata":"Q1956014","brand:wikipedia":"en:Belfius",name:"Belfius"},removeTags:{amenity:"bank",brand:"Belfius","brand:wikidata":"Q1956014","brand:wikipedia":"en:Belfius",name:"Belfius"},matchScore:2,suggestion:true},"amenity/bank/Bendigo Bank":{name:"Bendigo Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4887077"},addTags:{amenity:"bank",brand:"Bendigo Bank","brand:wikidata":"Q4887077","brand:wikipedia":"en:Bendigo and Adelaide Bank",name:"Bendigo Bank"},removeTags:{amenity:"bank",brand:"Bendigo Bank","brand:wikidata":"Q4887077","brand:wikipedia":"en:Bendigo and Adelaide Bank",name:"Bendigo Bank"},matchScore:2,suggestion:true},"amenity/bank/Berliner Volksbank":{name:"Berliner Volksbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q821855"},addTags:{amenity:"bank",brand:"Berliner Volksbank","brand:wikidata":"Q821855","brand:wikipedia":"de:Berliner Volksbank",name:"Berliner Volksbank"},removeTags:{amenity:"bank",brand:"Berliner Volksbank","brand:wikidata":"Q821855","brand:wikipedia":"de:Berliner Volksbank",name:"Berliner Volksbank"},matchScore:2,suggestion:true},"amenity/bank/Bicentenario":{name:"Bicentenario",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5728123"},addTags:{amenity:"bank",brand:"Bicentenario","brand:wikidata":"Q5728123","brand:wikipedia":"es:Bicentenario Banco Universal",name:"Bicentenario"},removeTags:{amenity:"bank",brand:"Bicentenario","brand:wikidata":"Q5728123","brand:wikipedia":"es:Bicentenario Banco Universal",name:"Bicentenario"},matchScore:2,suggestion:true},"amenity/bank/Bicici":{name:"Bicici",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1667302"},addTags:{amenity:"bank",brand:"Bicici","brand:wikidata":"Q1667302","brand:wikipedia":"fr:Banque internationale pour le commerce et l'industrie de la Côte d'Ivoire",name:"Bicici"},removeTags:{amenity:"bank",brand:"Bicici","brand:wikidata":"Q1667302","brand:wikipedia":"fr:Banque internationale pour le commerce et l'industrie de la Côte d'Ivoire",name:"Bicici"},matchScore:2,suggestion:true},"amenity/bank/Bradesco":{name:"Bradesco",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806181"},addTags:{amenity:"bank",brand:"Bradesco","brand:wikidata":"Q806181","brand:wikipedia":"en:Banco Bradesco",name:"Bradesco"},removeTags:{amenity:"bank",brand:"Bradesco","brand:wikidata":"Q806181","brand:wikipedia":"en:Banco Bradesco",name:"Bradesco"},matchScore:2,suggestion:true},"amenity/bank/Budapest Bank":{name:"Budapest Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q27493463"},addTags:{amenity:"bank",brand:"Budapest Bank","brand:wikidata":"Q27493463","brand:wikipedia":"en:Budapest Bank",name:"Budapest Bank"},removeTags:{amenity:"bank",brand:"Budapest Bank","brand:wikidata":"Q27493463","brand:wikipedia":"en:Budapest Bank",name:"Budapest Bank"},matchScore:2,suggestion:true},"amenity/bank/CBAO":{name:"CBAO",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q532104"},addTags:{amenity:"bank",brand:"CBAO","brand:wikidata":"Q532104","brand:wikipedia":"fr:CBAO Groupe Attijariwafa bank",name:"CBAO"},removeTags:{amenity:"bank",brand:"CBAO","brand:wikidata":"Q532104","brand:wikipedia":"fr:CBAO Groupe Attijariwafa bank",name:"CBAO"},matchScore:2,suggestion:true},"amenity/bank/CEC Bank":{name:"CEC Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1023306"},addTags:{amenity:"bank",brand:"CEC Bank","brand:wikidata":"Q1023306","brand:wikipedia":"en:CEC Bank",name:"CEC Bank"},removeTags:{amenity:"bank",brand:"CEC Bank","brand:wikidata":"Q1023306","brand:wikipedia":"en:CEC Bank",name:"CEC Bank"},matchScore:2,suggestion:true},"amenity/bank/CIB Bank":{name:"CIB Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q839566"},addTags:{amenity:"bank",brand:"CIB Bank","brand:wikidata":"Q839566","brand:wikipedia":"en:CIB Bank",name:"CIB Bank"},removeTags:{amenity:"bank",brand:"CIB Bank","brand:wikidata":"Q839566","brand:wikipedia":"en:CIB Bank",name:"CIB Bank"},matchScore:2,suggestion:true},"amenity/bank/CIBC":{name:"CIBC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q666694"},addTags:{amenity:"bank",brand:"CIBC","brand:wikidata":"Q666694","brand:wikipedia":"en:Canadian Imperial Bank of Commerce",name:"CIBC"},removeTags:{amenity:"bank",brand:"CIBC","brand:wikidata":"Q666694","brand:wikipedia":"en:Canadian Imperial Bank of Commerce",name:"CIBC"},matchScore:2,suggestion:true},"amenity/bank/CIC":{name:"CIC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q746525"},addTags:{amenity:"bank",brand:"CIC","brand:wikidata":"Q746525","brand:wikipedia":"en:Crédit Industriel et Commercial",name:"CIC"},removeTags:{amenity:"bank",brand:"CIC","brand:wikidata":"Q746525","brand:wikipedia":"en:Crédit Industriel et Commercial",name:"CIC"},matchScore:2,suggestion:true},"amenity/bank/CIH Bank":{name:"CIH Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3006220"},addTags:{amenity:"bank",brand:"CIH Bank","brand:wikidata":"Q3006220","brand:wikipedia":"en:CIH Bank",name:"CIH Bank"},removeTags:{amenity:"bank",brand:"CIH Bank","brand:wikidata":"Q3006220","brand:wikipedia":"en:CIH Bank",name:"CIH Bank"},matchScore:2,suggestion:true},"amenity/bank/CIMB Bank":{name:"CIMB Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3045976"},addTags:{amenity:"bank",brand:"CIMB Bank","brand:wikidata":"Q3045976","brand:wikipedia":"en:CIMB",name:"CIMB Bank"},removeTags:{amenity:"bank",brand:"CIMB Bank","brand:wikidata":"Q3045976","brand:wikipedia":"en:CIMB",name:"CIMB Bank"},matchScore:2,suggestion:true},"amenity/bank/CIMB Niaga":{name:"CIMB Niaga",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5011747"},addTags:{amenity:"bank",brand:"CIMB Niaga","brand:wikidata":"Q5011747","brand:wikipedia":"en:CIMB Niaga",name:"CIMB Niaga"},removeTags:{amenity:"bank",brand:"CIMB Niaga","brand:wikidata":"Q5011747","brand:wikipedia":"en:CIMB Niaga",name:"CIMB Niaga"},matchScore:2,suggestion:true},"amenity/bank/CNEP":{name:"CNEP",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2931752"},addTags:{amenity:"bank",brand:"CNEP","brand:wikidata":"Q2931752","brand:wikipedia":"fr:CNEP-Banque",name:"CNEP"},removeTags:{amenity:"bank",brand:"CNEP","brand:wikidata":"Q2931752","brand:wikipedia":"fr:CNEP-Banque",name:"CNEP"},matchScore:2,suggestion:true},"amenity/bank/Caisse Desjardins":{name:"Caisse Desjardins",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2933350"},addTags:{amenity:"bank",brand:"Caisse Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Caisse Desjardins"},removeTags:{amenity:"bank",brand:"Caisse Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Caisse Desjardins"},matchScore:2,suggestion:true},"amenity/bank/Caisse d'Épargne":{name:"Caisse d'Épargne",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1547738"},addTags:{amenity:"bank",brand:"Caisse d'Épargne","brand:wikidata":"Q1547738","brand:wikipedia":"en:Groupe Caisse d'Épargne",name:"Caisse d'Épargne"},removeTags:{amenity:"bank",brand:"Caisse d'Épargne","brand:wikidata":"Q1547738","brand:wikipedia":"en:Groupe Caisse d'Épargne",name:"Caisse d'Épargne"},matchScore:2,suggestion:true},"amenity/bank/Caixa Econômica Federal":{name:"Caixa Econômica Federal",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q835283"},addTags:{amenity:"bank",brand:"Caixa Econômica Federal","brand:wikidata":"Q835283","brand:wikipedia":"pt:Caixa Econômica Federal",name:"Caixa Econômica Federal"},removeTags:{amenity:"bank",brand:"Caixa Econômica Federal","brand:wikidata":"Q835283","brand:wikipedia":"pt:Caixa Econômica Federal",name:"Caixa Econômica Federal"},matchScore:2,suggestion:true},"amenity/bank/Caixa Geral de Depósitos":{name:"Caixa Geral de Depósitos",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1026044"},addTags:{amenity:"bank",brand:"Caixa Geral de Depósitos","brand:wikidata":"Q1026044","brand:wikipedia":"pt:Caixa Geral de Depósitos",name:"Caixa Geral de Depósitos"},removeTags:{amenity:"bank",brand:"Caixa Geral de Depósitos","brand:wikidata":"Q1026044","brand:wikipedia":"pt:Caixa Geral de Depósitos",name:"Caixa Geral de Depósitos"},matchScore:2,suggestion:true},"amenity/bank/Caixabank":{name:"Caixabank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q847225"},addTags:{amenity:"bank","brand:wikidata":"Q847225","brand:wikipedia":"en:CaixaBank",name:"Caixabank"},removeTags:{amenity:"bank","brand:wikidata":"Q847225","brand:wikipedia":"en:CaixaBank",name:"Caixabank"},matchScore:2,suggestion:true},"amenity/bank/Caja España":{name:"Caja España",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q966985"},addTags:{amenity:"bank",brand:"Caja España","brand:wikidata":"Q966985","brand:wikipedia":"es:Caja España",name:"Caja España"},removeTags:{amenity:"bank",brand:"Caja España","brand:wikidata":"Q966985","brand:wikipedia":"es:Caja España",name:"Caja España"},matchScore:2,suggestion:true},"amenity/bank/Caja Rural":{name:"Caja Rural",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3649971"},addTags:{amenity:"bank",brand:"Caja Rural","brand:wikidata":"Q3649971","brand:wikipedia":"es:Caja Rural",name:"Caja Rural"},removeTags:{amenity:"bank",brand:"Caja Rural","brand:wikidata":"Q3649971","brand:wikipedia":"es:Caja Rural",name:"Caja Rural"},matchScore:2,suggestion:true},"amenity/bank/Caja Rural de Jaén":{name:"Caja Rural de Jaén",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q18720350"},addTags:{amenity:"bank",brand:"Caja Rural de Jaén","brand:wikidata":"Q18720350","brand:wikipedia":"es:Caja Rural de Jaén",name:"Caja Rural de Jaén"},removeTags:{amenity:"bank",brand:"Caja Rural de Jaén","brand:wikidata":"Q18720350","brand:wikipedia":"es:Caja Rural de Jaén",name:"Caja Rural de Jaén"},matchScore:2,suggestion:true},"amenity/bank/CajaSur":{name:"CajaSur",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3751637"},addTags:{amenity:"bank",brand:"CajaSur","brand:wikidata":"Q3751637","brand:wikipedia":"en:CajaSur",name:"CajaSur"},removeTags:{amenity:"bank",brand:"CajaSur","brand:wikidata":"Q3751637","brand:wikipedia":"en:CajaSur",name:"CajaSur"},matchScore:2,suggestion:true},"amenity/bank/Cajamar":{name:"Cajamar",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q8254971"},addTags:{amenity:"bank",brand:"Cajamar","brand:wikidata":"Q8254971","brand:wikipedia":"es:Cajamar",name:"Cajamar"},removeTags:{amenity:"bank",brand:"Cajamar","brand:wikidata":"Q8254971","brand:wikipedia":"es:Cajamar",name:"Cajamar"},matchScore:2,suggestion:true},"amenity/bank/Canara Bank":{name:"Canara Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003777"},addTags:{amenity:"bank",brand:"Canara Bank","brand:wikidata":"Q2003777","brand:wikipedia":"en:Canara Bank",name:"Canara Bank"},removeTags:{amenity:"bank",brand:"Canara Bank","brand:wikidata":"Q2003777","brand:wikipedia":"en:Canara Bank",name:"Canara Bank"},matchScore:2,suggestion:true},"amenity/bank/Capital One":{name:"Capital One",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1034654"},addTags:{amenity:"bank",brand:"Capital One","brand:wikidata":"Q1034654","brand:wikipedia":"en:Capital One",name:"Capital One"},removeTags:{amenity:"bank",brand:"Capital One","brand:wikidata":"Q1034654","brand:wikipedia":"en:Capital One",name:"Capital One"},matchScore:2,suggestion:true},"amenity/bank/Carige":{name:"Carige",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633695"},addTags:{amenity:"bank",brand:"Carige","brand:wikidata":"Q3633695","brand:wikipedia":"en:Banca Carige",name:"Carige"},removeTags:{amenity:"bank",brand:"Carige","brand:wikidata":"Q3633695","brand:wikipedia":"en:Banca Carige",name:"Carige"},matchScore:2,suggestion:true},"amenity/bank/Cariparma":{name:"Cariparma",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2938832"},addTags:{amenity:"bank",brand:"Cariparma","brand:wikidata":"Q2938832","brand:wikipedia":"en:Crédit Agricole Italia",name:"Cariparma"},removeTags:{amenity:"bank",brand:"Cariparma","brand:wikidata":"Q2938832","brand:wikipedia":"en:Crédit Agricole Italia",name:"Cariparma"},matchScore:2,suggestion:true},"amenity/bank/Carisbo":{name:"Carisbo",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3661937"},addTags:{amenity:"bank",brand:"Carisbo","brand:wikidata":"Q3661937","brand:wikipedia":"en:Cassa di Risparmio in Bologna",name:"Carisbo"},removeTags:{amenity:"bank",brand:"Carisbo","brand:wikidata":"Q3661937","brand:wikipedia":"en:Cassa di Risparmio in Bologna",name:"Carisbo"},matchScore:2,suggestion:true},"amenity/bank/Cassa di Risparmio del Veneto":{name:"Cassa di Risparmio del Veneto",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3661909"},addTags:{amenity:"bank",brand:"Cassa di Risparmio del Veneto","brand:wikidata":"Q3661909","brand:wikipedia":"en:Cassa di Risparmio del Veneto",name:"Cassa di Risparmio del Veneto"},removeTags:{amenity:"bank",brand:"Cassa di Risparmio del Veneto","brand:wikidata":"Q3661909","brand:wikipedia":"en:Cassa di Risparmio del Veneto",name:"Cassa di Risparmio del Veneto"},matchScore:2,suggestion:true},"amenity/bank/CatalunyaCaixa":{name:"CatalunyaCaixa",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3750952"},addTags:{amenity:"bank",brand:"CatalunyaCaixa","brand:wikidata":"Q3750952","brand:wikipedia":"en:CatalunyaCaixa",name:"CatalunyaCaixa"},removeTags:{amenity:"bank",brand:"CatalunyaCaixa","brand:wikidata":"Q3750952","brand:wikipedia":"en:CatalunyaCaixa",name:"CatalunyaCaixa"},matchScore:2,suggestion:true},"amenity/bank/Central Bank of India":{name:"Central Bank of India",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2007090"},addTags:{amenity:"bank",brand:"Central Bank of India","brand:wikidata":"Q2007090","brand:wikipedia":"en:Central Bank of India",name:"Central Bank of India"},removeTags:{amenity:"bank",brand:"Central Bank of India","brand:wikidata":"Q2007090","brand:wikipedia":"en:Central Bank of India",name:"Central Bank of India"},matchScore:2,suggestion:true},"amenity/bank/Chase":{name:"Chase",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q524629"},addTags:{amenity:"bank",brand:"Chase","brand:wikidata":"Q524629","brand:wikipedia":"en:Chase Bank",name:"Chase"},removeTags:{amenity:"bank",brand:"Chase","brand:wikidata":"Q524629","brand:wikipedia":"en:Chase Bank",name:"Chase"},matchScore:2,suggestion:true},"amenity/bank/China Bank":{name:"China Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5100080"},addTags:{amenity:"bank",brand:"China Bank","brand:wikidata":"Q5100080","brand:wikipedia":"en:Chinabank",name:"China Bank"},removeTags:{amenity:"bank",brand:"China Bank","brand:wikidata":"Q5100080","brand:wikipedia":"en:Chinabank",name:"China Bank"},matchScore:2,suggestion:true},"amenity/bank/China Bank Savings":{name:"China Bank Savings",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q18387359"},addTags:{amenity:"bank",brand:"China Bank Savings","brand:wikidata":"Q18387359","brand:wikipedia":"en:China Bank Savings",name:"China Bank Savings"},removeTags:{amenity:"bank",brand:"China Bank Savings","brand:wikidata":"Q18387359","brand:wikipedia":"en:China Bank Savings",name:"China Bank Savings"},matchScore:2,suggestion:true},"amenity/bank/China Construction Bank":{name:"China Construction Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26299"},addTags:{amenity:"bank",brand:"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"China Construction Bank"},removeTags:{amenity:"bank",brand:"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"China Construction Bank"},matchScore:2,suggestion:true},"amenity/bank/Citibank":{name:"Citibank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q857063"},addTags:{amenity:"bank",brand:"Citibank","brand:wikidata":"Q857063","brand:wikipedia":"en:Citibank",name:"Citibank"},removeTags:{amenity:"bank",brand:"Citibank","brand:wikidata":"Q857063","brand:wikipedia":"en:Citibank",name:"Citibank"},matchScore:2,suggestion:true},"amenity/bank/Citizens Bank":{name:"Citizens Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q25209674"},addTags:{amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q25209674","brand:wikipedia":"en:Citizens Bank (South Bend, Indiana)",name:"Citizens Bank"},removeTags:{amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q25209674","brand:wikipedia":"en:Citizens Bank (South Bend, Indiana)",name:"Citizens Bank"},matchScore:2,suggestion:true},"amenity/bank/Clydesdale Bank":{name:"Clydesdale Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q971680"},addTags:{amenity:"bank",brand:"Clydesdale Bank","brand:wikipedia":"en:Clydesdale Bank","brand:wikidata":"Q971680",name:"Clydesdale Bank"},removeTags:{amenity:"bank",brand:"Clydesdale Bank","brand:wikipedia":"en:Clydesdale Bank","brand:wikidata":"Q971680",name:"Clydesdale Bank"},matchScore:2,suggestion:true},"amenity/bank/Comerica Bank":{name:"Comerica Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1114148"},addTags:{amenity:"bank",brand:"Comerica Bank","brand:wikidata":"Q1114148","brand:wikipedia":"en:Comerica",name:"Comerica Bank"},removeTags:{amenity:"bank",brand:"Comerica Bank","brand:wikidata":"Q1114148","brand:wikipedia":"en:Comerica",name:"Comerica Bank"},matchScore:2,suggestion:true},"amenity/bank/Commercial Bank of Ceylon PLC":{name:"Commercial Bank of Ceylon PLC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5152468"},addTags:{amenity:"bank",brand:"Commercial Bank of Ceylon PLC","brand:wikidata":"Q5152468","brand:wikipedia":"en:Commercial Bank of Ceylon",name:"Commercial Bank of Ceylon PLC"},removeTags:{amenity:"bank",brand:"Commercial Bank of Ceylon PLC","brand:wikidata":"Q5152468","brand:wikipedia":"en:Commercial Bank of Ceylon",name:"Commercial Bank of Ceylon PLC"},matchScore:2,suggestion:true},"amenity/bank/Commerzbank":{name:"Commerzbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q157617"},addTags:{amenity:"bank",brand:"Commerzbank","brand:wikidata":"Q157617","brand:wikipedia":"en:Commerzbank",name:"Commerzbank"},removeTags:{amenity:"bank",brand:"Commerzbank","brand:wikidata":"Q157617","brand:wikipedia":"en:Commerzbank",name:"Commerzbank"},matchScore:2,suggestion:true},"amenity/bank/Commonwealth Bank":{name:"Commonwealth Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q285328"},addTags:{amenity:"bank",brand:"Commonwealth Bank","brand:wikidata":"Q285328","brand:wikipedia":"en:Commonwealth Bank",name:"Commonwealth Bank"},removeTags:{amenity:"bank",brand:"Commonwealth Bank","brand:wikidata":"Q285328","brand:wikipedia":"en:Commonwealth Bank",name:"Commonwealth Bank"},matchScore:2,suggestion:true},"amenity/bank/Corporation Bank":{name:"Corporation Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003387"},addTags:{amenity:"bank",brand:"Corporation Bank","brand:wikidata":"Q2003387","brand:wikipedia":"en:Corporation Bank",name:"Corporation Bank"},removeTags:{amenity:"bank",brand:"Corporation Bank","brand:wikidata":"Q2003387","brand:wikipedia":"en:Corporation Bank",name:"Corporation Bank"},matchScore:2,suggestion:true},"amenity/bank/Credem":{name:"Credem",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3696881"},addTags:{amenity:"bank",brand:"Credem","brand:wikidata":"Q3696881","brand:wikipedia":"en:Credito Emiliano",name:"Credem"},removeTags:{amenity:"bank",brand:"Credem","brand:wikidata":"Q3696881","brand:wikipedia":"en:Credito Emiliano",name:"Credem"},matchScore:2,suggestion:true},"amenity/bank/Credicoop":{name:"Credicoop",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854086"},addTags:{amenity:"bank",brand:"Credicoop","brand:wikidata":"Q4854086","brand:wikipedia":"en:Banco Credicoop",name:"Credicoop"},removeTags:{amenity:"bank",brand:"Credicoop","brand:wikidata":"Q4854086","brand:wikipedia":"en:Banco Credicoop",name:"Credicoop"},matchScore:2,suggestion:true},"amenity/bank/Credit Suisse":{name:"Credit Suisse",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q372657"},addTags:{amenity:"bank",brand:"Credit Suisse","brand:wikidata":"Q372657","brand:wikipedia":"en:Credit Suisse",name:"Credit Suisse"},removeTags:{amenity:"bank",brand:"Credit Suisse","brand:wikidata":"Q372657","brand:wikipedia":"en:Credit Suisse",name:"Credit Suisse"},matchScore:2,suggestion:true},"amenity/bank/Credito Valtellinese":{name:"Credito Valtellinese",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3696888"},addTags:{amenity:"bank",brand:"Credito Valtellinese","brand:wikidata":"Q3696888","brand:wikipedia":"en:Credito Valtellinese",name:"Credito Valtellinese"},removeTags:{amenity:"bank",brand:"Credito Valtellinese","brand:wikidata":"Q3696888","brand:wikipedia":"en:Credito Valtellinese",name:"Credito Valtellinese"},matchScore:2,suggestion:true},"amenity/bank/Crelan":{name:"Crelan",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q389872"},addTags:{amenity:"bank",brand:"Crelan","brand:wikidata":"Q389872","brand:wikipedia":"en:Crelan",name:"Crelan"},removeTags:{amenity:"bank",brand:"Crelan","brand:wikidata":"Q389872","brand:wikipedia":"en:Crelan",name:"Crelan"},matchScore:2,suggestion:true},"amenity/bank/Crédit Agricole":{name:"Crédit Agricole",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q590952"},addTags:{amenity:"bank",brand:"Crédit Agricole","brand:wikidata":"Q590952","brand:wikipedia":"fr:Crédit agricole",name:"Crédit Agricole"},removeTags:{amenity:"bank",brand:"Crédit Agricole","brand:wikidata":"Q590952","brand:wikipedia":"fr:Crédit agricole",name:"Crédit Agricole"},matchScore:2,suggestion:true},"amenity/bank/Crédit Maritime":{name:"Crédit Maritime",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q17176866"},addTags:{amenity:"bank",brand:"Crédit Maritime","brand:wikidata":"Q17176866","brand:wikipedia":"fr:Crédit maritime",name:"Crédit Maritime"},removeTags:{amenity:"bank",brand:"Crédit Maritime","brand:wikidata":"Q17176866","brand:wikipedia":"fr:Crédit maritime",name:"Crédit Maritime"},matchScore:2,suggestion:true},"amenity/bank/Crédit Mutuel":{name:"Crédit Mutuel",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q642627"},addTags:{amenity:"bank",brand:"Crédit Mutuel","brand:wikidata":"Q642627","brand:wikipedia":"en:Crédit Mutuel",name:"Crédit Mutuel"},removeTags:{amenity:"bank",brand:"Crédit Mutuel","brand:wikidata":"Q642627","brand:wikipedia":"en:Crédit Mutuel",name:"Crédit Mutuel"},matchScore:2,suggestion:true},"amenity/bank/Crédit Mutuel de Bretagne":{name:"Crédit Mutuel de Bretagne",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3006236"},addTags:{amenity:"bank",brand:"Crédit Mutuel de Bretagne","brand:wikidata":"Q3006236","brand:wikipedia":"fr:Crédit mutuel Arkéa",name:"Crédit Mutuel de Bretagne"},removeTags:{amenity:"bank",brand:"Crédit Mutuel de Bretagne","brand:wikidata":"Q3006236","brand:wikipedia":"fr:Crédit mutuel Arkéa",name:"Crédit Mutuel de Bretagne"},matchScore:2,suggestion:true},"amenity/bank/Crédit du Nord":{name:"Crédit du Nord",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3006209"},addTags:{amenity:"bank",brand:"Crédit du Nord","brand:wikidata":"Q3006209","brand:wikipedia":"en:Crédit du Nord",name:"Crédit du Nord"},removeTags:{amenity:"bank",brand:"Crédit du Nord","brand:wikidata":"Q3006209","brand:wikipedia":"en:Crédit du Nord",name:"Crédit du Nord"},matchScore:2,suggestion:true},"amenity/bank/Crédito Agrícola":{name:"Crédito Agrícola",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10262017"},addTags:{amenity:"bank",brand:"Crédito Agrícola","brand:wikidata":"Q10262017","brand:wikipedia":"pt:Crédito Agrícola",name:"Crédito Agrícola"},removeTags:{amenity:"bank",brand:"Crédito Agrícola","brand:wikidata":"Q10262017","brand:wikipedia":"pt:Crédito Agrícola",name:"Crédito Agrícola"},matchScore:2,suggestion:true},"amenity/bank/Cбербанк":{name:"Cбербанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q205012"},addTags:{amenity:"bank",brand:"Cбербанк","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Cбербанк"},removeTags:{amenity:"bank",brand:"Cбербанк","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Cбербанк"},matchScore:2,suggestion:true},"amenity/bank/Danske Bank":{name:"Danske Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1636974"},addTags:{amenity:"bank",brand:"Danske Bank","brand:wikidata":"Q1636974","brand:wikipedia":"en:Danske Bank",name:"Danske Bank"},removeTags:{amenity:"bank",brand:"Danske Bank","brand:wikidata":"Q1636974","brand:wikipedia":"en:Danske Bank",name:"Danske Bank"},matchScore:2,suggestion:true},"amenity/bank/Davivienda":{name:"Davivienda",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5242054"},addTags:{amenity:"bank",brand:"Davivienda","brand:wikidata":"Q5242054","brand:wikipedia":"en:Davivienda",name:"Davivienda"},removeTags:{amenity:"bank",brand:"Davivienda","brand:wikidata":"Q5242054","brand:wikipedia":"en:Davivienda",name:"Davivienda"},matchScore:2,suggestion:true},"amenity/bank/Denizbank":{name:"Denizbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1115064"},addTags:{amenity:"bank",brand:"Denizbank","brand:wikidata":"Q1115064","brand:wikipedia":"en:DenizBank",name:"Denizbank"},removeTags:{amenity:"bank",brand:"Denizbank","brand:wikidata":"Q1115064","brand:wikipedia":"en:DenizBank",name:"Denizbank"},matchScore:2,suggestion:true},"amenity/bank/Desjardins":{name:"Desjardins",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2933350"},addTags:{amenity:"bank",brand:"Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Desjardins"},removeTags:{amenity:"bank",brand:"Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Desjardins"},matchScore:2,suggestion:true},"amenity/bank/Deutsche Bank":{name:"Deutsche Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q66048"},addTags:{amenity:"bank",brand:"Deutsche Bank","brand:wikidata":"Q66048","brand:wikipedia":"en:Deutsche Bank",name:"Deutsche Bank"},removeTags:{amenity:"bank",brand:"Deutsche Bank","brand:wikidata":"Q66048","brand:wikipedia":"en:Deutsche Bank",name:"Deutsche Bank"},matchScore:2,suggestion:true},"amenity/bank/Dubai Islamic Bank":{name:"Dubai Islamic Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5310570"},addTags:{amenity:"bank",brand:"Dubai Islamic Bank","brand:wikidata":"Q5310570","brand:wikipedia":"en:Dubai Islamic Bank",name:"Dubai Islamic Bank"},removeTags:{amenity:"bank",brand:"Dubai Islamic Bank","brand:wikidata":"Q5310570","brand:wikipedia":"en:Dubai Islamic Bank",name:"Dubai Islamic Bank"},matchScore:2,suggestion:true},"amenity/bank/EastWest Bank":{name:"EastWest Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5327595"},addTags:{amenity:"bank",brand:"EastWest Bank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Bank"},removeTags:{amenity:"bank",brand:"EastWest Bank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Bank"},matchScore:2,suggestion:true},"amenity/bank/EastWest Unibank":{name:"EastWest Unibank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5327595"},addTags:{amenity:"bank",brand:"EastWest Unibank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Unibank"},removeTags:{amenity:"bank",brand:"EastWest Unibank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Unibank"},matchScore:2,suggestion:true},"amenity/bank/Ecobank":{name:"Ecobank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q930225"},addTags:{amenity:"bank",brand:"Ecobank","brand:wikidata":"Q930225","brand:wikipedia":"en:Ecobank",name:"Ecobank"},removeTags:{amenity:"bank",brand:"Ecobank","brand:wikidata":"Q930225","brand:wikipedia":"en:Ecobank",name:"Ecobank"},matchScore:2,suggestion:true},"amenity/bank/Erste Bank":{name:"Erste Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q696867"},addTags:{amenity:"bank",brand:"Erste Bank","brand:wikidata":"Q696867","brand:wikipedia":"de:Erste Bank",name:"Erste Bank"},removeTags:{amenity:"bank",brand:"Erste Bank","brand:wikidata":"Q696867","brand:wikipedia":"de:Erste Bank",name:"Erste Bank"},matchScore:2,suggestion:true},"amenity/bank/FNB":{name:"FNB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3072956"},addTags:{amenity:"bank",brand:"FNB","brand:wikidata":"Q3072956","brand:wikipedia":"en:First National Bank (South Africa)",name:"FNB"},removeTags:{amenity:"bank",brand:"FNB","brand:wikidata":"Q3072956","brand:wikipedia":"en:First National Bank (South Africa)",name:"FNB"},matchScore:2,suggestion:true},"amenity/bank/Faysal Bank":{name:"Faysal Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5439099"},addTags:{amenity:"bank",brand:"Faysal Bank","brand:wikidata":"Q5439099","brand:wikipedia":"en:Faysal Bank",name:"Faysal Bank"},removeTags:{amenity:"bank",brand:"Faysal Bank","brand:wikidata":"Q5439099","brand:wikipedia":"en:Faysal Bank",name:"Faysal Bank"},matchScore:2,suggestion:true},"amenity/bank/Federal Bank":{name:"Federal Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2044983"},addTags:{amenity:"bank",brand:"Federal Bank","brand:wikidata":"Q2044983","brand:wikipedia":"en:Federal Bank",name:"Federal Bank"},removeTags:{amenity:"bank",brand:"Federal Bank","brand:wikidata":"Q2044983","brand:wikipedia":"en:Federal Bank",name:"Federal Bank"},matchScore:2,suggestion:true},"amenity/bank/Fifth Third Bank":{name:"Fifth Third Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1411810"},addTags:{amenity:"bank",brand:"Fifth Third Bank","brand:wikidata":"Q1411810","brand:wikipedia":"en:Fifth Third Bank",name:"Fifth Third Bank"},removeTags:{amenity:"bank",brand:"Fifth Third Bank","brand:wikidata":"Q1411810","brand:wikipedia":"en:Fifth Third Bank",name:"Fifth Third Bank"},matchScore:2,suggestion:true},"amenity/bank/Finansbank":{name:"Finansbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1416237"},addTags:{amenity:"bank",brand:"Finansbank","brand:wikidata":"Q1416237","brand:wikipedia":"en:Finansbank",name:"Finansbank"},removeTags:{amenity:"bank",brand:"Finansbank","brand:wikidata":"Q1416237","brand:wikipedia":"en:Finansbank",name:"Finansbank"},matchScore:2,suggestion:true},"amenity/bank/First Citizens Bank":{name:"First Citizens Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5452734"},addTags:{amenity:"bank",brand:"First Citizens Bank","brand:wikidata":"Q5452734","brand:wikipedia":"en:First Citizens Bank (Trinidad and Tobago)",name:"First Citizens Bank"},removeTags:{amenity:"bank",brand:"First Citizens Bank","brand:wikidata":"Q5452734","brand:wikipedia":"en:First Citizens Bank (Trinidad and Tobago)",name:"First Citizens Bank"},matchScore:2,suggestion:true},"amenity/bank/First National Bank":{name:"First National Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5426765"},addTags:{amenity:"bank",brand:"First National Bank","brand:wikidata":"Q5426765","brand:wikipedia":"en:F.N.B. Corporation",name:"First National Bank"},removeTags:{amenity:"bank",brand:"First National Bank","brand:wikidata":"Q5426765","brand:wikipedia":"en:F.N.B. Corporation",name:"First National Bank"},matchScore:2,suggestion:true},"amenity/bank/Frost Bank":{name:"Frost Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5506152"},addTags:{amenity:"bank",brand:"Frost Bank","brand:wikidata":"Q5506152","brand:wikipedia":"en:Frost Bank",name:"Frost Bank"},removeTags:{amenity:"bank",brand:"Frost Bank","brand:wikidata":"Q5506152","brand:wikipedia":"en:Frost Bank",name:"Frost Bank"},matchScore:2,suggestion:true},"amenity/bank/GCB Bank":{name:"GCB Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1521346"},addTags:{amenity:"bank",brand:"GCB Bank","brand:wikidata":"Q1521346","brand:wikipedia":"en:GCB Bank Limited",name:"GCB Bank"},removeTags:{amenity:"bank",brand:"GCB Bank","brand:wikidata":"Q1521346","brand:wikipedia":"en:GCB Bank Limited",name:"GCB Bank"},matchScore:2,suggestion:true},"amenity/bank/Galicia":{name:"Galicia",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5717952"},addTags:{amenity:"bank",brand:"Galicia","brand:wikidata":"Q5717952","brand:wikipedia":"es:Banco Galicia",name:"Galicia"},removeTags:{amenity:"bank",brand:"Galicia","brand:wikidata":"Q5717952","brand:wikipedia":"es:Banco Galicia",name:"Galicia"},matchScore:2,suggestion:true},"amenity/bank/Garanti":{name:"Garanti",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q322962"},addTags:{amenity:"bank",brand:"Garanti","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti"},removeTags:{amenity:"bank",brand:"Garanti","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti"},matchScore:2,suggestion:true},"amenity/bank/Garanti Bankası":{name:"Garanti Bankası",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q322962"},addTags:{amenity:"bank",brand:"Garanti Bankası","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti Bankası"},removeTags:{amenity:"bank",brand:"Garanti Bankası","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti Bankası"},matchScore:2,suggestion:true},"amenity/bank/Getin Bank":{name:"Getin Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9267646"},addTags:{amenity:"bank",brand:"Getin Bank","brand:wikidata":"Q9267646","brand:wikipedia":"en:Getin Bank",name:"Getin Bank"},removeTags:{amenity:"bank",brand:"Getin Bank","brand:wikidata":"Q9267646","brand:wikipedia":"en:Getin Bank",name:"Getin Bank"},matchScore:2,suggestion:true},"amenity/bank/Great Western Bank":{name:"Great Western Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5600185"},addTags:{amenity:"bank",brand:"Great Western Bank","brand:wikidata":"Q5600185","brand:wikipedia":"en:Great Western Bank (1907–present)",name:"Great Western Bank"},removeTags:{amenity:"bank",brand:"Great Western Bank","brand:wikidata":"Q5600185","brand:wikipedia":"en:Great Western Bank (1907–present)",name:"Great Western Bank"},matchScore:2,suggestion:true},"amenity/bank/Groupama":{name:"Groupama",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3083531"},addTags:{amenity:"bank",brand:"Groupama","brand:wikidata":"Q3083531","brand:wikipedia":"en:Groupama",name:"Groupama"},removeTags:{amenity:"bank",brand:"Groupama","brand:wikidata":"Q3083531","brand:wikipedia":"en:Groupama",name:"Groupama"},matchScore:2,suggestion:true},"amenity/bank/HBL Bank":{name:"HBL Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1566843"},addTags:{amenity:"bank",brand:"HBL Bank","brand:wikidata":"Q1566843","brand:wikipedia":"ur:ایچ بی ایل پاکستان",name:"HBL Bank"},removeTags:{amenity:"bank",brand:"HBL Bank","brand:wikidata":"Q1566843","brand:wikipedia":"ur:ایچ بی ایل پاکستان",name:"HBL Bank"},matchScore:2,suggestion:true},"amenity/bank/HDFC Bank":{name:"HDFC Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q631047"},addTags:{amenity:"bank",brand:"HDFC Bank","brand:wikidata":"Q631047","brand:wikipedia":"en:HDFC Bank",name:"HDFC Bank"},removeTags:{amenity:"bank",brand:"HDFC Bank","brand:wikidata":"Q631047","brand:wikipedia":"en:HDFC Bank",name:"HDFC Bank"},matchScore:2,suggestion:true},"amenity/bank/HNB":{name:"HNB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3532080"},addTags:{amenity:"bank",brand:"HNB","brand:wikidata":"Q3532080","brand:wikipedia":"en:Hatton National Bank",name:"HNB"},removeTags:{amenity:"bank",brand:"HNB","brand:wikidata":"Q3532080","brand:wikipedia":"en:Hatton National Bank",name:"HNB"},matchScore:2,suggestion:true},"amenity/bank/HSBC":{name:"HSBC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q190464"},addTags:{amenity:"bank",brand:"HSBC","brand:wikidata":"Q190464","brand:wikipedia":"en:HSBC",name:"HSBC"},removeTags:{amenity:"bank",brand:"HSBC","brand:wikidata":"Q190464","brand:wikipedia":"en:HSBC",name:"HSBC"},matchScore:2,suggestion:true},"amenity/bank/Halifax":{name:"Halifax",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3310164"},addTags:{amenity:"bank",brand:"Halifax","brand:wikidata":"Q3310164","brand:wikipedia":"en:Halifax (bank)",name:"Halifax"},removeTags:{amenity:"bank",brand:"Halifax","brand:wikidata":"Q3310164","brand:wikipedia":"en:Halifax (bank)",name:"Halifax"},matchScore:2,suggestion:true},"amenity/bank/Halkbank":{name:"Halkbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3593818"},addTags:{amenity:"bank",brand:"Halkbank","brand:wikidata":"Q3593818","brand:wikipedia":"en:Halkbank a.d.",name:"Halkbank"},removeTags:{amenity:"bank",brand:"Halkbank","brand:wikidata":"Q3593818","brand:wikipedia":"en:Halkbank a.d.",name:"Halkbank"},matchScore:2,suggestion:true},"amenity/bank/Handelsbanken":{name:"Handelsbanken",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1421630"},addTags:{amenity:"bank",brand:"Handelsbanken","brand:wikidata":"Q1421630","brand:wikipedia":"en:Handelsbanken",name:"Handelsbanken"},removeTags:{amenity:"bank",brand:"Handelsbanken","brand:wikidata":"Q1421630","brand:wikipedia":"en:Handelsbanken",name:"Handelsbanken"},matchScore:2,suggestion:true},"amenity/bank/Heritage Bank":{name:"Heritage Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5738690"},addTags:{amenity:"bank",brand:"Heritage Bank","brand:wikidata":"Q5738690","brand:wikipedia":"en:Heritage Bank",name:"Heritage Bank"},removeTags:{amenity:"bank",brand:"Heritage Bank","brand:wikidata":"Q5738690","brand:wikipedia":"en:Heritage Bank",name:"Heritage Bank"},matchScore:2,suggestion:true},"amenity/bank/Hong Leong Bank":{name:"Hong Leong Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4383943"},addTags:{amenity:"bank",brand:"Hong Leong Bank","brand:wikidata":"Q4383943","brand:wikipedia":"en:Hong Leong Bank",name:"Hong Leong Bank"},removeTags:{amenity:"bank",brand:"Hong Leong Bank","brand:wikidata":"Q4383943","brand:wikipedia":"en:Hong Leong Bank",name:"Hong Leong Bank"},matchScore:2,suggestion:true},"amenity/bank/Hrvatska poštanska banka":{name:"Hrvatska poštanska banka",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5923981"},addTags:{amenity:"bank",brand:"Hrvatska poštanska banka","brand:wikidata":"Q5923981","brand:wikipedia":"en:Hrvatska poštanska banka",name:"Hrvatska poštanska banka"},removeTags:{amenity:"bank",brand:"Hrvatska poštanska banka","brand:wikidata":"Q5923981","brand:wikipedia":"en:Hrvatska poštanska banka",name:"Hrvatska poštanska banka"},matchScore:2,suggestion:true},"amenity/bank/Huntington Bank":{name:"Huntington Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q798819"},addTags:{amenity:"bank",brand:"Huntington Bank","brand:wikidata":"Q798819","brand:wikipedia":"en:Huntington Bancshares",name:"Huntington Bank"},removeTags:{amenity:"bank",brand:"Huntington Bank","brand:wikidata":"Q798819","brand:wikipedia":"en:Huntington Bancshares",name:"Huntington Bank"},matchScore:2,suggestion:true},"amenity/bank/HypoVereinsbank":{name:"HypoVereinsbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q220189"},addTags:{amenity:"bank",brand:"HypoVereinsbank","brand:wikidata":"Q220189","brand:wikipedia":"en:HypoVereinsbank",name:"HypoVereinsbank"},removeTags:{amenity:"bank",brand:"HypoVereinsbank","brand:wikidata":"Q220189","brand:wikipedia":"en:HypoVereinsbank",name:"HypoVereinsbank"},matchScore:2,suggestion:true},"amenity/bank/ICBC":{name:"ICBC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26463"},addTags:{amenity:"bank",brand:"ICBC","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"ICBC"},removeTags:{amenity:"bank",brand:"ICBC","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"ICBC"},matchScore:2,suggestion:true},"amenity/bank/ICICI Bank":{name:"ICICI Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1653258"},addTags:{amenity:"bank",brand:"ICICI Bank","brand:wikidata":"Q1653258","brand:wikipedia":"en:ICICI Bank",name:"ICICI Bank"},removeTags:{amenity:"bank",brand:"ICICI Bank","brand:wikidata":"Q1653258","brand:wikipedia":"en:ICICI Bank",name:"ICICI Bank"},matchScore:2,suggestion:true},"amenity/bank/IDBI Bank":{name:"IDBI Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633485"},addTags:{amenity:"bank",brand:"IDBI Bank","brand:wikidata":"Q3633485","brand:wikipedia":"en:IDBI Bank",name:"IDBI Bank"},removeTags:{amenity:"bank",brand:"IDBI Bank","brand:wikidata":"Q3633485","brand:wikipedia":"en:IDBI Bank",name:"IDBI Bank"},matchScore:2,suggestion:true},"amenity/bank/ING":{name:"ING",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q645708"},addTags:{amenity:"bank",brand:"ING","brand:wikidata":"Q645708","brand:wikipedia":"en:ING Group",name:"ING"},removeTags:{amenity:"bank",brand:"ING","brand:wikidata":"Q645708","brand:wikipedia":"en:ING Group",name:"ING"},matchScore:2,suggestion:true},"amenity/bank/ING Bank Śląski":{name:"ING Bank Śląski",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1410383"},addTags:{amenity:"bank",brand:"ING Bank Śląski","brand:wikidata":"Q1410383","brand:wikipedia":"en:ING Bank Śląski",name:"ING Bank Śląski"},removeTags:{amenity:"bank",brand:"ING Bank Śląski","brand:wikidata":"Q1410383","brand:wikipedia":"en:ING Bank Śląski",name:"ING Bank Śląski"},matchScore:2,suggestion:true},"amenity/bank/Ibercaja":{name:"Ibercaja",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5907815"},addTags:{amenity:"bank",brand:"Ibercaja","brand:wikidata":"Q5907815","brand:wikipedia":"es:Ibercaja Banco",name:"Ibercaja"},removeTags:{amenity:"bank",brand:"Ibercaja","brand:wikidata":"Q5907815","brand:wikipedia":"es:Ibercaja Banco",name:"Ibercaja"},matchScore:2,suggestion:true},"amenity/bank/Indian Bank":{name:"Indian Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003789"},addTags:{amenity:"bank",brand:"Indian Bank","brand:wikidata":"Q2003789","brand:wikipedia":"en:Indian Bank",name:"Indian Bank"},removeTags:{amenity:"bank",brand:"Indian Bank","brand:wikidata":"Q2003789","brand:wikipedia":"en:Indian Bank",name:"Indian Bank"},matchScore:2,suggestion:true},"amenity/bank/Indian Overseas Bank":{name:"Indian Overseas Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003611"},addTags:{amenity:"bank",brand:"Indian Overseas Bank","brand:wikidata":"Q2003611","brand:wikipedia":"en:Indian Overseas Bank",name:"Indian Overseas Bank"},removeTags:{amenity:"bank",brand:"Indian Overseas Bank","brand:wikidata":"Q2003611","brand:wikipedia":"en:Indian Overseas Bank",name:"Indian Overseas Bank"},matchScore:2,suggestion:true},"amenity/bank/Interbank":{name:"Interbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2835558"},addTags:{amenity:"bank",brand:"Interbank","brand:wikidata":"Q2835558","brand:wikipedia":"es:Banco Interbank",name:"Interbank"},removeTags:{amenity:"bank",brand:"Interbank","brand:wikidata":"Q2835558","brand:wikipedia":"es:Banco Interbank",name:"Interbank"},matchScore:2,suggestion:true},"amenity/bank/Intesa Sanpaolo":{name:"Intesa Sanpaolo",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1343118"},addTags:{amenity:"bank",brand:"Intesa Sanpaolo","brand:wikidata":"Q1343118","brand:wikipedia":"it:Intesa Sanpaolo",name:"Intesa Sanpaolo"},removeTags:{amenity:"bank",brand:"Intesa Sanpaolo","brand:wikidata":"Q1343118","brand:wikipedia":"it:Intesa Sanpaolo",name:"Intesa Sanpaolo"},matchScore:2,suggestion:true},"amenity/bank/Itaú":{name:"Itaú",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2423252"},addTags:{amenity:"bank",brand:"Itaú","brand:wikidata":"Q2423252","brand:wikipedia":"en:Itaú Corpbanca",name:"Itaú"},removeTags:{amenity:"bank",brand:"Itaú","brand:wikidata":"Q2423252","brand:wikipedia":"en:Itaú Corpbanca",name:"Itaú"},matchScore:2,suggestion:true},"amenity/bank/JS Bank":{name:"JS Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6108986"},addTags:{amenity:"bank",brand:"JS Bank","brand:wikidata":"Q6108986","brand:wikipedia":"en:JS Bank",name:"JS Bank"},removeTags:{amenity:"bank",brand:"JS Bank","brand:wikidata":"Q6108986","brand:wikipedia":"en:JS Bank",name:"JS Bank"},matchScore:2,suggestion:true},"amenity/bank/Janata Bank Limited জনতা ব্যাংক লিমিটেড":{name:"Janata Bank Limited জনতা ব্যাংক লিমিটেড",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3347028"},addTags:{amenity:"bank",brand:"Janata Bank Limited জনতা ব্যাংক লিমিটেড","brand:wikidata":"Q3347028","brand:wikipedia":"en:Janata Bank",name:"Janata Bank Limited জনতা ব্যাংক লিমিটেড"},removeTags:{amenity:"bank",brand:"Janata Bank Limited জনতা ব্যাংক লিমিটেড","brand:wikidata":"Q3347028","brand:wikipedia":"en:Janata Bank",name:"Janata Bank Limited জনতা ব্যাংক লিমিটেড"},matchScore:2,suggestion:true},"amenity/bank/Jyske Bank":{name:"Jyske Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q136672"},addTags:{amenity:"bank",brand:"Jyske Bank","brand:wikidata":"Q136672","brand:wikipedia":"en:Jyske Bank",name:"Jyske Bank"},removeTags:{amenity:"bank",brand:"Jyske Bank","brand:wikidata":"Q136672","brand:wikipedia":"en:Jyske Bank",name:"Jyske Bank"},matchScore:2,suggestion:true},"amenity/bank/K&H Bank":{name:"K&H Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6393834"},addTags:{amenity:"bank",brand:"K&H Bank","brand:wikidata":"Q6393834","brand:wikipedia":"en:K&H Bank",name:"K&H Bank"},removeTags:{amenity:"bank",brand:"K&H Bank","brand:wikidata":"Q6393834","brand:wikipedia":"en:K&H Bank",name:"K&H Bank"},matchScore:2,suggestion:true},"amenity/bank/KBC":{name:"KBC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q941020"},addTags:{amenity:"bank",brand:"KBC","brand:wikidata":"Q941020","brand:wikipedia":"en:KBC Bank",name:"KBC"},removeTags:{amenity:"bank",brand:"KBC","brand:wikidata":"Q941020","brand:wikipedia":"en:KBC Bank",name:"KBC"},matchScore:2,suggestion:true},"amenity/bank/KBZ Bank":{name:"KBZ Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6360949"},addTags:{amenity:"bank",brand:"KBZ Bank","brand:wikidata":"Q6360949","brand:wikipedia":"en:Kanbawza Bank",name:"KBZ Bank"},removeTags:{amenity:"bank",brand:"KBZ Bank","brand:wikidata":"Q6360949","brand:wikipedia":"en:Kanbawza Bank",name:"KBZ Bank"},matchScore:2,suggestion:true},"amenity/bank/Karnataka Bank":{name:"Karnataka Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2042632"},addTags:{amenity:"bank",brand:"Karnataka Bank","brand:wikidata":"Q2042632","brand:wikipedia":"en:Karnataka Bank",name:"Karnataka Bank"},removeTags:{amenity:"bank",brand:"Karnataka Bank","brand:wikidata":"Q2042632","brand:wikipedia":"en:Karnataka Bank",name:"Karnataka Bank"},matchScore:2,suggestion:true},"amenity/bank/Kasa Stefczyka":{name:"Kasa Stefczyka",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q57624461"},addTags:{amenity:"bank",brand:"Kasa Stefczyka","brand:wikidata":"Q57624461",name:"Kasa Stefczyka"},removeTags:{amenity:"bank",brand:"Kasa Stefczyka","brand:wikidata":"Q57624461",name:"Kasa Stefczyka"},matchScore:2,suggestion:true},"amenity/bank/Key Bank":{name:"Key Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1740314"},addTags:{amenity:"bank",brand:"Key Bank","brand:wikidata":"Q1740314","brand:wikipedia":"en:KeyBank",name:"Key Bank"},removeTags:{amenity:"bank",brand:"Key Bank","brand:wikidata":"Q1740314","brand:wikipedia":"en:KeyBank",name:"Key Bank"},matchScore:2,suggestion:true},"amenity/bank/Komerční banka":{name:"Komerční banka",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1541079"},addTags:{amenity:"bank",brand:"Komerční banka","brand:wikidata":"Q1541079","brand:wikipedia":"en:Komerční banka",name:"Komerční banka"},removeTags:{amenity:"bank",brand:"Komerční banka","brand:wikidata":"Q1541079","brand:wikipedia":"en:Komerční banka",name:"Komerční banka"},matchScore:2,suggestion:true},"amenity/bank/Kotak Mahindra Bank":{name:"Kotak Mahindra Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2040404"},addTags:{amenity:"bank","brand:wikidata":"Q2040404","brand:wikipedia":"en:Kotak Mahindra Bank",name:"Kotak Mahindra Bank"},removeTags:{amenity:"bank","brand:wikidata":"Q2040404","brand:wikipedia":"en:Kotak Mahindra Bank",name:"Kotak Mahindra Bank"},matchScore:2,suggestion:true},"amenity/bank/Kreissparkasse":{name:"Kreissparkasse",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2513770"},addTags:{amenity:"bank",brand:"Kreissparkasse","brand:wikidata":"Q2513770","brand:wikipedia":"de:Verband der Freien Sparkassen",name:"Kreissparkasse"},removeTags:{amenity:"bank",brand:"Kreissparkasse","brand:wikidata":"Q2513770","brand:wikipedia":"de:Verband der Freien Sparkassen",name:"Kreissparkasse"},matchScore:2,suggestion:true},"amenity/bank/Kutxabank":{name:"Kutxabank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5139377"},addTags:{amenity:"bank",brand:"Kutxabank","brand:wikidata":"Q5139377","brand:wikipedia":"en:Kutxabank",name:"Kutxabank"},removeTags:{amenity:"bank",brand:"Kutxabank","brand:wikidata":"Q5139377","brand:wikipedia":"en:Kutxabank",name:"Kutxabank"},matchScore:2,suggestion:true},"amenity/bank/LCL":{name:"LCL",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q779722"},addTags:{amenity:"bank",brand:"LCL","brand:wikidata":"Q779722","brand:wikipedia":"en:Crédit Lyonnais",name:"LCL"},removeTags:{amenity:"bank",brand:"LCL","brand:wikidata":"Q779722","brand:wikipedia":"en:Crédit Lyonnais",name:"LCL"},matchScore:2,suggestion:true},"amenity/bank/La Banque Postale":{name:"La Banque Postale",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3206431"},addTags:{amenity:"bank",brand:"La Banque Postale","brand:wikidata":"Q3206431","brand:wikipedia":"en:La Banque postale",name:"La Banque Postale"},removeTags:{amenity:"bank",brand:"La Banque Postale","brand:wikidata":"Q3206431","brand:wikipedia":"en:La Banque postale",name:"La Banque Postale"},matchScore:2,suggestion:true},"amenity/bank/La Caixa":{name:"La Caixa",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q287753"},addTags:{amenity:"bank",brand:"La Caixa","brand:wikidata":"Q287753","brand:wikipedia":"en:La Caixa",name:"La Caixa"},removeTags:{amenity:"bank",brand:"La Caixa","brand:wikidata":"Q287753","brand:wikipedia":"en:La Caixa",name:"La Caixa"},matchScore:2,suggestion:true},"amenity/bank/Laboral Kutxa":{name:"Laboral Kutxa",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12052386"},addTags:{amenity:"bank",brand:"Laboral Kutxa","brand:wikidata":"Q12052386","brand:wikipedia":"en:Laboral Kutxa",name:"Laboral Kutxa"},removeTags:{amenity:"bank",brand:"Laboral Kutxa","brand:wikidata":"Q12052386","brand:wikipedia":"en:Laboral Kutxa",name:"Laboral Kutxa"},matchScore:2,suggestion:true},"amenity/bank/Landbank":{name:"Landbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6483872"},addTags:{amenity:"bank",brand:"Landbank","brand:wikidata":"Q6483872","brand:wikipedia":"en:Land Bank of the Philippines",name:"Landbank"},removeTags:{amenity:"bank",brand:"Landbank","brand:wikidata":"Q6483872","brand:wikipedia":"en:Land Bank of the Philippines",name:"Landbank"},matchScore:2,suggestion:true},"amenity/bank/Liberbank":{name:"Liberbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2891018"},addTags:{amenity:"bank",brand:"Liberbank","brand:wikidata":"Q2891018","brand:wikipedia":"en:Liberbank",name:"Liberbank"},removeTags:{amenity:"bank",brand:"Liberbank","brand:wikidata":"Q2891018","brand:wikipedia":"en:Liberbank",name:"Liberbank"},matchScore:2,suggestion:true},"amenity/bank/Lloyds Bank":{name:"Lloyds Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1152847"},addTags:{amenity:"bank",brand:"Lloyds Bank","brand:wikidata":"Q1152847","brand:wikipedia":"en:Lloyds Bank",name:"Lloyds Bank"},removeTags:{amenity:"bank",brand:"Lloyds Bank","brand:wikidata":"Q1152847","brand:wikipedia":"en:Lloyds Bank",name:"Lloyds Bank"},matchScore:2,suggestion:true},"amenity/bank/M&T Bank":{name:"M&T Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3272257"},addTags:{amenity:"bank",brand:"M&T Bank","brand:wikidata":"Q3272257","brand:wikipedia":"en:M&T Bank",name:"M&T Bank"},removeTags:{amenity:"bank",brand:"M&T Bank","brand:wikidata":"Q3272257","brand:wikipedia":"en:M&T Bank",name:"M&T Bank"},matchScore:2,suggestion:true},"amenity/bank/MCB":{name:"MCB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15982510"},addTags:{amenity:"bank",brand:"MCB","brand:wikidata":"Q15982510","brand:wikipedia":"ur:ایم سی بی بینک لمیٹڈ",name:"MCB"},removeTags:{amenity:"bank",brand:"MCB","brand:wikidata":"Q15982510","brand:wikipedia":"ur:ایم سی بی بینک لمیٹڈ",name:"MCB"},matchScore:2,suggestion:true},"amenity/bank/MONETA Money Bank":{name:"MONETA Money Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q24282966"},addTags:{amenity:"bank",brand:"MONETA Money Bank","brand:wikidata":"Q24282966","brand:wikipedia":"cs:Moneta Money Bank",name:"MONETA Money Bank"},removeTags:{amenity:"bank",brand:"MONETA Money Bank","brand:wikidata":"Q24282966","brand:wikipedia":"cs:Moneta Money Bank",name:"MONETA Money Bank"},matchScore:2,suggestion:true},"amenity/bank/Macro":{name:"Macro",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2335199"},addTags:{amenity:"bank",brand:"Macro","brand:wikidata":"Q2335199","brand:wikipedia":"en:Banco Macro",name:"Macro"},removeTags:{amenity:"bank",brand:"Macro","brand:wikidata":"Q2335199","brand:wikipedia":"en:Banco Macro",name:"Macro"},matchScore:2,suggestion:true},"amenity/bank/Maybank":{name:"Maybank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1364018"},addTags:{amenity:"bank",brand:"Maybank","brand:wikidata":"Q1364018","brand:wikipedia":"en:Maybank",name:"Maybank"},removeTags:{amenity:"bank",brand:"Maybank","brand:wikidata":"Q1364018","brand:wikipedia":"en:Maybank",name:"Maybank"},matchScore:2,suggestion:true},"amenity/bank/Meezan Bank":{name:"Meezan Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6807934"},addTags:{amenity:"bank",brand:"Meezan Bank","brand:wikidata":"Q6807934","brand:wikipedia":"en:Meezan Bank",name:"Meezan Bank"},removeTags:{amenity:"bank",brand:"Meezan Bank","brand:wikidata":"Q6807934","brand:wikipedia":"en:Meezan Bank",name:"Meezan Bank"},matchScore:2,suggestion:true},"amenity/bank/Mercantil":{name:"Mercantil",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6818004"},addTags:{amenity:"bank",brand:"Mercantil","brand:wikidata":"Q6818004","brand:wikipedia":"en:Mercantil Servicios Financieros",name:"Mercantil"},removeTags:{amenity:"bank",brand:"Mercantil","brand:wikidata":"Q6818004","brand:wikipedia":"en:Mercantil Servicios Financieros",name:"Mercantil"},matchScore:2,suggestion:true},"amenity/bank/Mibanco":{name:"Mibanco",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5558589"},addTags:{amenity:"bank",brand:"Mibanco","brand:wikidata":"Q5558589","brand:wikipedia":"es:MiBanco",name:"Mibanco"},removeTags:{amenity:"bank",brand:"Mibanco","brand:wikidata":"Q5558589","brand:wikipedia":"es:MiBanco",name:"Mibanco"},matchScore:2,suggestion:true},"amenity/bank/Millennium Bank":{name:"Millennium Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855947"},addTags:{amenity:"bank",brand:"Millennium Bank","brand:wikidata":"Q4855947","brand:wikipedia":"pl:Bank Millennium",name:"Millennium Bank"},removeTags:{amenity:"bank",brand:"Millennium Bank","brand:wikidata":"Q4855947","brand:wikipedia":"pl:Bank Millennium",name:"Millennium Bank"},matchScore:2,suggestion:true},"amenity/bank/Millennium bcp":{name:"Millennium bcp",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q118581"},addTags:{amenity:"bank",brand:"Millennium bcp","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"Millennium bcp"},removeTags:{amenity:"bank",brand:"Millennium bcp","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"Millennium bcp"},matchScore:2,suggestion:true},"amenity/bank/Monte dei Paschi di Siena":{name:"Monte dei Paschi di Siena",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q46730"},addTags:{amenity:"bank",brand:"Monte dei Paschi di Siena","brand:wikidata":"Q46730","brand:wikipedia":"en:Banca Monte dei Paschi di Siena",name:"Monte dei Paschi di Siena"},removeTags:{amenity:"bank",brand:"Monte dei Paschi di Siena","brand:wikidata":"Q46730","brand:wikipedia":"en:Banca Monte dei Paschi di Siena",name:"Monte dei Paschi di Siena"},matchScore:2,suggestion:true},"amenity/bank/Montepio":{name:"Montepio",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1946091"},addTags:{amenity:"bank",brand:"Montepio","brand:wikidata":"Q1946091","brand:wikipedia":"en:Montepio (bank)",name:"Montepio"},removeTags:{amenity:"bank",brand:"Montepio","brand:wikidata":"Q1946091","brand:wikipedia":"en:Montepio (bank)",name:"Montepio"},matchScore:2,suggestion:true},"amenity/bank/NAB":{name:"NAB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1430985"},addTags:{amenity:"bank",brand:"NAB","brand:wikidata":"Q1430985","brand:wikipedia":"en:National Australia Bank",name:"NAB"},removeTags:{amenity:"bank",brand:"NAB","brand:wikidata":"Q1430985","brand:wikipedia":"en:National Australia Bank",name:"NAB"},matchScore:2,suggestion:true},"amenity/bank/NatWest":{name:"NatWest",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2740021"},addTags:{amenity:"bank",brand:"NatWest","brand:wikidata":"Q2740021","brand:wikipedia":"en:NatWest",name:"NatWest"},removeTags:{amenity:"bank",brand:"NatWest","brand:wikidata":"Q2740021","brand:wikipedia":"en:NatWest",name:"NatWest"},matchScore:2,suggestion:true},"amenity/bank/Nationwide":{name:"Nationwide",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q846735"},addTags:{amenity:"bank",brand:"Nationwide","brand:wikidata":"Q846735","brand:wikipedia":"en:Nationwide Building Society",name:"Nationwide"},removeTags:{amenity:"bank",brand:"Nationwide","brand:wikidata":"Q846735","brand:wikipedia":"en:Nationwide Building Society",name:"Nationwide"},matchScore:2,suggestion:true},"amenity/bank/Navy Federal Credit Union":{name:"Navy Federal Credit Union",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6982632"},addTags:{amenity:"bank",brand:"Navy Federal Credit Union","brand:wikidata":"Q6982632","brand:wikipedia":"en:Navy Federal Credit Union",name:"Navy Federal Credit Union"},removeTags:{amenity:"bank",brand:"Navy Federal Credit Union","brand:wikidata":"Q6982632","brand:wikipedia":"en:Navy Federal Credit Union",name:"Navy Federal Credit Union"},matchScore:2,suggestion:true},"amenity/bank/Nedbank":{name:"Nedbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2751701"},addTags:{amenity:"bank",brand:"Nedbank","brand:wikidata":"Q2751701","brand:wikipedia":"en:Nedbank",name:"Nedbank"},removeTags:{amenity:"bank",brand:"Nedbank","brand:wikidata":"Q2751701","brand:wikipedia":"en:Nedbank",name:"Nedbank"},matchScore:2,suggestion:true},"amenity/bank/Nordea":{name:"Nordea",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1123823"},addTags:{amenity:"bank",brand:"Nordea","brand:wikidata":"Q1123823","brand:wikipedia":"en:Nordea",name:"Nordea"},removeTags:{amenity:"bank",brand:"Nordea","brand:wikidata":"Q1123823","brand:wikipedia":"en:Nordea",name:"Nordea"},matchScore:2,suggestion:true},"amenity/bank/Novo Banco":{name:"Novo Banco",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q17488861"},addTags:{amenity:"bank",brand:"Novo Banco","brand:wikidata":"Q17488861","brand:wikipedia":"en:Novo Banco",name:"Novo Banco"},removeTags:{amenity:"bank",brand:"Novo Banco","brand:wikidata":"Q17488861","brand:wikipedia":"en:Novo Banco",name:"Novo Banco"},matchScore:2,suggestion:true},"amenity/bank/OLB":{name:"OLB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q879591"},addTags:{amenity:"bank",brand:"OLB","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"OLB"},removeTags:{amenity:"bank",brand:"OLB","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"OLB"},matchScore:2,suggestion:true},"amenity/bank/OTP":{name:"OTP",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q912778"},addTags:{amenity:"bank",brand:"OTP","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"OTP"},removeTags:{amenity:"bank",brand:"OTP","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"OTP"},matchScore:2,suggestion:true},"amenity/bank/Oberbank":{name:"Oberbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2009139"},addTags:{amenity:"bank",brand:"Oberbank","brand:wikidata":"Q2009139","brand:wikipedia":"de:Oberbank",name:"Oberbank"},removeTags:{amenity:"bank",brand:"Oberbank","brand:wikidata":"Q2009139","brand:wikipedia":"de:Oberbank",name:"Oberbank"},matchScore:2,suggestion:true},"amenity/bank/Occidental de Descuento":{name:"Occidental de Descuento",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854108"},addTags:{amenity:"bank",brand:"Occidental de Descuento","brand:wikidata":"Q4854108","brand:wikipedia":"en:Banco Occidental de Descuento",name:"Occidental de Descuento"},removeTags:{amenity:"bank",brand:"Occidental de Descuento","brand:wikidata":"Q4854108","brand:wikipedia":"en:Banco Occidental de Descuento",name:"Occidental de Descuento"},matchScore:2,suggestion:true},"amenity/bank/Oldenburgische Landesbank":{name:"Oldenburgische Landesbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q879591"},addTags:{amenity:"bank",brand:"Oldenburgische Landesbank","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"Oldenburgische Landesbank"},removeTags:{amenity:"bank",brand:"Oldenburgische Landesbank","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"Oldenburgische Landesbank"},matchScore:2,suggestion:true},"amenity/bank/One Network Bank":{name:"One Network Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7093019"},addTags:{amenity:"bank",brand:"One Network Bank","brand:wikidata":"Q7093019","brand:wikipedia":"en:One Network Bank",name:"One Network Bank"},removeTags:{amenity:"bank",brand:"One Network Bank","brand:wikidata":"Q7093019","brand:wikipedia":"en:One Network Bank",name:"One Network Bank"},matchScore:2,suggestion:true},"amenity/bank/Oriental Bank of Commerce":{name:"Oriental Bank of Commerce",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q367008"},addTags:{amenity:"bank",brand:"Oriental Bank of Commerce","brand:wikidata":"Q367008","brand:wikipedia":"en:Oriental Bank of Commerce",name:"Oriental Bank of Commerce"},removeTags:{amenity:"bank",brand:"Oriental Bank of Commerce","brand:wikidata":"Q367008","brand:wikipedia":"en:Oriental Bank of Commerce",name:"Oriental Bank of Commerce"},matchScore:2,suggestion:true},"amenity/bank/PBZ":{name:"PBZ",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7246343"},addTags:{amenity:"bank",brand:"PBZ","brand:wikidata":"Q7246343","brand:wikipedia":"en:Privredna banka Zagreb",name:"PBZ"},removeTags:{amenity:"bank",brand:"PBZ","brand:wikidata":"Q7246343","brand:wikipedia":"en:Privredna banka Zagreb",name:"PBZ"},matchScore:2,suggestion:true},"amenity/bank/PKO BP":{name:"PKO BP",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q578832"},addTags:{amenity:"bank",brand:"PKO BP","brand:wikidata":"Q578832","brand:wikipedia":"en:PKO Bank Polski",name:"PKO BP"},removeTags:{amenity:"bank",brand:"PKO BP","brand:wikidata":"Q578832","brand:wikipedia":"en:PKO Bank Polski",name:"PKO BP"},matchScore:2,suggestion:true},"amenity/bank/PNC Bank":{name:"PNC Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q38928"},addTags:{amenity:"bank",brand:"PNC Bank","brand:wikidata":"Q38928","brand:wikipedia":"en:PNC Financial Services",name:"PNC Bank"},removeTags:{amenity:"bank",brand:"PNC Bank","brand:wikidata":"Q38928","brand:wikipedia":"en:PNC Financial Services",name:"PNC Bank"},matchScore:2,suggestion:true},"amenity/bank/PSBank":{name:"PSBank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7185203"},addTags:{amenity:"bank",brand:"PSBank","brand:wikidata":"Q7185203","brand:wikipedia":"en:Philippine Savings Bank",name:"PSBank"},removeTags:{amenity:"bank",brand:"PSBank","brand:wikidata":"Q7185203","brand:wikipedia":"en:Philippine Savings Bank",name:"PSBank"},matchScore:2,suggestion:true},"amenity/bank/Panin Bank":{name:"Panin Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12502751"},addTags:{amenity:"bank",brand:"Panin Bank","brand:wikidata":"Q12502751","brand:wikipedia":"id:Panin Bank",name:"Panin Bank"},removeTags:{amenity:"bank",brand:"Panin Bank","brand:wikidata":"Q12502751","brand:wikipedia":"id:Panin Bank",name:"Panin Bank"},matchScore:2,suggestion:true},"amenity/bank/Patagonia":{name:"Patagonia",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882078"},addTags:{amenity:"bank",brand:"Patagonia","brand:wikidata":"Q2882078","brand:wikipedia":"en:Banco Patagonia",name:"Patagonia"},removeTags:{amenity:"bank",brand:"Patagonia","brand:wikidata":"Q2882078","brand:wikipedia":"en:Banco Patagonia",name:"Patagonia"},matchScore:2,suggestion:true},"amenity/bank/Pekao SA":{name:"Pekao SA",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806642"},addTags:{amenity:"bank",brand:"Pekao SA","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Pekao SA"},removeTags:{amenity:"bank",brand:"Pekao SA","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Pekao SA"},matchScore:2,suggestion:true},"amenity/bank/People's United Bank":{name:"People's United Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7165802"},addTags:{amenity:"bank",brand:"People's United Bank","brand:wikidata":"Q7165802","brand:wikipedia":"en:People's United Financial",name:"People's United Bank"},removeTags:{amenity:"bank",brand:"People's United Bank","brand:wikidata":"Q7165802","brand:wikipedia":"en:People's United Financial",name:"People's United Bank"},matchScore:2,suggestion:true},"amenity/bank/Peoples Bank":{name:"Peoples Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7166050"},addTags:{amenity:"bank",brand:"Peoples Bank","brand:wikidata":"Q7166050","brand:wikipedia":"en:Peoples Bank",name:"Peoples Bank"},removeTags:{amenity:"bank",brand:"Peoples Bank","brand:wikidata":"Q7166050","brand:wikipedia":"en:Peoples Bank",name:"Peoples Bank"},matchScore:2,suggestion:true},"amenity/bank/Philippine National Bank":{name:"Philippine National Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1657971"},addTags:{amenity:"bank",brand:"Philippine National Bank","brand:wikidata":"Q1657971","brand:wikipedia":"en:Philippine National Bank",name:"Philippine National Bank"},removeTags:{amenity:"bank",brand:"Philippine National Bank","brand:wikidata":"Q1657971","brand:wikipedia":"en:Philippine National Bank",name:"Philippine National Bank"},matchScore:2,suggestion:true},"amenity/bank/Piraeus Bank":{name:"Piraeus Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3312"},addTags:{amenity:"bank",brand:"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Piraeus Bank"},removeTags:{amenity:"bank",brand:"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Piraeus Bank"},matchScore:2,suggestion:true},"amenity/bank/Postbank":{name:"Postbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q708835"},addTags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q708835","brand:wikipedia":"en:Deutsche Postbank",name:"Postbank"},removeTags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q708835","brand:wikipedia":"en:Deutsche Postbank",name:"Postbank"},matchScore:2,suggestion:true},"amenity/bank/Prima banka":{name:"Prima banka",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q13538661"},addTags:{amenity:"bank",brand:"Prima banka","brand:wikidata":"Q13538661","brand:wikipedia":"sk:Prima banka Slovensko",name:"Prima banka"},removeTags:{amenity:"bank",brand:"Prima banka","brand:wikidata":"Q13538661","brand:wikipedia":"sk:Prima banka Slovensko",name:"Prima banka"},matchScore:2,suggestion:true},"amenity/bank/Punjab National Bank":{name:"Punjab National Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2743499"},addTags:{amenity:"bank",brand:"Punjab National Bank","brand:wikidata":"Q2743499","brand:wikipedia":"en:Punjab National Bank",name:"Punjab National Bank"},removeTags:{amenity:"bank",brand:"Punjab National Bank","brand:wikidata":"Q2743499","brand:wikipedia":"en:Punjab National Bank",name:"Punjab National Bank"},matchScore:2,suggestion:true},"amenity/bank/RBC":{name:"RBC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q735261"},addTags:{amenity:"bank",brand:"RBC","brand:wikidata":"Q735261","brand:wikipedia":"en:Royal Bank of Canada",name:"RBC"},removeTags:{amenity:"bank",brand:"RBC","brand:wikidata":"Q735261","brand:wikipedia":"en:Royal Bank of Canada",name:"RBC"},matchScore:2,suggestion:true},"amenity/bank/RBS":{name:"RBS",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q160126"},addTags:{amenity:"bank",brand:"RBS","brand:wikidata":"Q160126","brand:wikipedia":"en:Royal Bank of Scotland",name:"RBS"},removeTags:{amenity:"bank",brand:"RBS","brand:wikidata":"Q160126","brand:wikipedia":"en:Royal Bank of Scotland",name:"RBS"},matchScore:2,suggestion:true},"amenity/bank/RCBC":{name:"RCBC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7339070"},addTags:{amenity:"bank",brand:"RCBC","brand:wikidata":"Q7339070","brand:wikipedia":"en:Rizal Commercial Banking Corporation",name:"RCBC"},removeTags:{amenity:"bank",brand:"RCBC","brand:wikidata":"Q7339070","brand:wikipedia":"en:Rizal Commercial Banking Corporation",name:"RCBC"},matchScore:2,suggestion:true},"amenity/bank/Rabobank":{name:"Rabobank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q252004"},addTags:{amenity:"bank",brand:"Rabobank","brand:wikidata":"Q252004","brand:wikipedia":"en:Rabobank",name:"Rabobank"},removeTags:{amenity:"bank",brand:"Rabobank","brand:wikidata":"Q252004","brand:wikipedia":"en:Rabobank",name:"Rabobank"},matchScore:2,suggestion:true},"amenity/bank/Raiffeisen Polbank":{name:"Raiffeisen Polbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9303218"},addTags:{amenity:"bank",brand:"Raiffeisen Polbank","brand:wikidata":"Q9303218","brand:wikipedia":"pl:Raiffeisen Bank Polska",name:"Raiffeisen Polbank"},removeTags:{amenity:"bank",brand:"Raiffeisen Polbank","brand:wikidata":"Q9303218","brand:wikipedia":"pl:Raiffeisen Bank Polska",name:"Raiffeisen Polbank"},matchScore:2,suggestion:true},"amenity/bank/Regions Bank":{name:"Regions Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q917131"},addTags:{amenity:"bank",brand:"Regions Bank","brand:wikidata":"Q917131","brand:wikipedia":"en:Regions Financial Corporation",name:"Regions Bank"},removeTags:{amenity:"bank",brand:"Regions Bank","brand:wikidata":"Q917131","brand:wikipedia":"en:Regions Financial Corporation",name:"Regions Bank"},matchScore:2,suggestion:true},"amenity/bank/SEB":{name:"SEB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q975655"},addTags:{amenity:"bank",brand:"SEB","brand:wikidata":"Q975655","brand:wikipedia":"en:SEB Group",name:"SEB"},removeTags:{amenity:"bank",brand:"SEB","brand:wikidata":"Q975655","brand:wikipedia":"en:SEB Group",name:"SEB"},matchScore:2,suggestion:true},"amenity/bank/SGBCI":{name:"SGBCI",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3488360"},addTags:{amenity:"bank",brand:"SGBCI","brand:wikidata":"Q3488360","brand:wikipedia":"fr:Société générale de banques en Côte d'Ivoire",name:"SGBCI"},removeTags:{amenity:"bank",brand:"SGBCI","brand:wikidata":"Q3488360","brand:wikipedia":"fr:Société générale de banques en Côte d'Ivoire",name:"SGBCI"},matchScore:2,suggestion:true},"amenity/bank/SNS Bank":{name:"SNS Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1857899"},addTags:{amenity:"bank",brand:"SNS Bank","brand:wikidata":"Q1857899","brand:wikipedia":"en:De Volksbank",name:"SNS Bank"},removeTags:{amenity:"bank",brand:"SNS Bank","brand:wikidata":"Q1857899","brand:wikipedia":"en:De Volksbank",name:"SNS Bank"},matchScore:2,suggestion:true},"amenity/bank/Sampath Bank":{name:"Sampath Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7410095"},addTags:{amenity:"bank",brand:"Sampath Bank","brand:wikidata":"Q7410095","brand:wikipedia":"en:Sampath Bank",name:"Sampath Bank"},removeTags:{amenity:"bank",brand:"Sampath Bank","brand:wikidata":"Q7410095","brand:wikipedia":"en:Sampath Bank",name:"Sampath Bank"},matchScore:2,suggestion:true},"amenity/bank/Santander":{name:"Santander",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5835668"},addTags:{amenity:"bank",brand:"Santander","brand:wikidata":"Q5835668","brand:wikipedia":"en:Santander Bank",name:"Santander"},removeTags:{amenity:"bank",brand:"Santander","brand:wikidata":"Q5835668","brand:wikipedia":"en:Santander Bank",name:"Santander"},matchScore:2,suggestion:true},"amenity/bank/Santander Río":{name:"Santander Río",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3385268"},addTags:{amenity:"bank",brand:"Santander Río","brand:wikidata":"Q3385268","brand:wikipedia":"es:Banco Santander Río",name:"Santander Río"},removeTags:{amenity:"bank",brand:"Santander Río","brand:wikidata":"Q3385268","brand:wikipedia":"es:Banco Santander Río",name:"Santander Río"},matchScore:2,suggestion:true},"amenity/bank/Santander Totta":{name:"Santander Totta",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854116"},addTags:{amenity:"bank",brand:"Santander Totta","brand:wikidata":"Q4854116","brand:wikipedia":"pt:Banco Santander Portugal",name:"Santander Totta"},removeTags:{amenity:"bank",brand:"Santander Totta","brand:wikidata":"Q4854116","brand:wikipedia":"pt:Banco Santander Portugal",name:"Santander Totta"},matchScore:2,suggestion:true},"amenity/bank/Sberbank":{name:"Sberbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q205012"},addTags:{amenity:"bank",brand:"Sberbank","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Sberbank"},removeTags:{amenity:"bank",brand:"Sberbank","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Sberbank"},matchScore:2,suggestion:true},"amenity/bank/Scotiabank":{name:"Scotiabank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q451476"},addTags:{amenity:"bank",brand:"Scotiabank","brand:wikidata":"Q451476","brand:wikipedia":"en:Scotiabank",name:"Scotiabank"},removeTags:{amenity:"bank",brand:"Scotiabank","brand:wikidata":"Q451476","brand:wikipedia":"en:Scotiabank",name:"Scotiabank"},matchScore:2,suggestion:true},"amenity/bank/Security Bank":{name:"Security Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7444945"},addTags:{amenity:"bank",brand:"Security Bank","brand:wikidata":"Q7444945","brand:wikipedia":"en:Security Bank",name:"Security Bank"},removeTags:{amenity:"bank",brand:"Security Bank","brand:wikidata":"Q7444945","brand:wikipedia":"en:Security Bank",name:"Security Bank"},matchScore:2,suggestion:true},"amenity/bank/Seylan Bank":{name:"Seylan Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3532083"},addTags:{amenity:"bank",brand:"Seylan Bank","brand:wikidata":"Q3532083","brand:wikipedia":"en:Seylan Bank",name:"Seylan Bank"},removeTags:{amenity:"bank",brand:"Seylan Bank","brand:wikidata":"Q3532083","brand:wikipedia":"en:Seylan Bank",name:"Seylan Bank"},matchScore:2,suggestion:true},"amenity/bank/Siam Commercial Bank":{name:"Siam Commercial Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2038986"},addTags:{amenity:"bank",brand:"Siam Commercial Bank","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"Siam Commercial Bank"},removeTags:{amenity:"bank",brand:"Siam Commercial Bank","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"Siam Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/Sicoob":{name:"Sicoob",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q28679754"},addTags:{amenity:"bank",brand:"Sicoob","brand:wikidata":"Q28679754","brand:wikipedia":"pt:Sistema de Cooperativas de Crédito do Brasil",name:"Sicoob"},removeTags:{amenity:"bank",brand:"Sicoob","brand:wikidata":"Q28679754","brand:wikipedia":"pt:Sistema de Cooperativas de Crédito do Brasil",name:"Sicoob"},matchScore:2,suggestion:true},"amenity/bank/Sicredi":{name:"Sicredi",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3483060"},addTags:{amenity:"bank",brand:"Sicredi","brand:wikidata":"Q3483060","brand:wikipedia":"pt:Sistema de Crédito Cooperativo",name:"Sicredi"},removeTags:{amenity:"bank",brand:"Sicredi","brand:wikidata":"Q3483060","brand:wikipedia":"pt:Sistema de Crédito Cooperativo",name:"Sicredi"},matchScore:2,suggestion:true},"amenity/bank/Slovenská sporiteľňa":{name:"Slovenská sporiteľňa",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7541907"},addTags:{amenity:"bank",brand:"Slovenská sporiteľňa","brand:wikidata":"Q7541907","brand:wikipedia":"en:Slovenská sporiteľňa",name:"Slovenská sporiteľňa"},removeTags:{amenity:"bank",brand:"Slovenská sporiteľňa","brand:wikidata":"Q7541907","brand:wikipedia":"en:Slovenská sporiteľňa",name:"Slovenská sporiteľňa"},matchScore:2,suggestion:true},"amenity/bank/Société Générale":{name:"Société Générale",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q270363"},addTags:{amenity:"bank",brand:"Société Générale","brand:wikidata":"Q270363","brand:wikipedia":"en:Société Générale",name:"Société Générale"},removeTags:{amenity:"bank",brand:"Société Générale","brand:wikidata":"Q270363","brand:wikipedia":"en:Société Générale",name:"Société Générale"},matchScore:2,suggestion:true},"amenity/bank/Sonali Bank":{name:"Sonali Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3350382"},addTags:{amenity:"bank",brand:"Sonali Bank","brand:wikipedia":"en:Sonali Bank","brand:wikidata":"Q3350382",name:"Sonali Bank"},removeTags:{amenity:"bank",brand:"Sonali Bank","brand:wikipedia":"en:Sonali Bank","brand:wikidata":"Q3350382",name:"Sonali Bank"},matchScore:2,suggestion:true},"amenity/bank/South Indian Bank":{name:"South Indian Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2044973"},addTags:{amenity:"bank",brand:"South Indian Bank","brand:wikipedia":"en:South Indian Bank","brand:wikidata":"Q2044973",name:"South Indian Bank"},removeTags:{amenity:"bank",brand:"South Indian Bank","brand:wikipedia":"en:South Indian Bank","brand:wikidata":"Q2044973",name:"South Indian Bank"},matchScore:2,suggestion:true},"amenity/bank/Sparda-Bank":{name:"Sparda-Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2307136"},addTags:{amenity:"bank",brand:"Sparda-Bank","brand:wikidata":"Q2307136","brand:wikipedia":"en:Sparda-Bank",name:"Sparda-Bank"},removeTags:{amenity:"bank",brand:"Sparda-Bank","brand:wikidata":"Q2307136","brand:wikipedia":"en:Sparda-Bank",name:"Sparda-Bank"},matchScore:2,suggestion:true},"amenity/bank/Sparkasse":{name:"Sparkasse",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2513770"},addTags:{amenity:"bank",brand:"Sparkasse","brand:wikidata":"Q2513770","brand:wikipedia":"de:Verband der Freien Sparkassen",name:"Sparkasse"},removeTags:{amenity:"bank",brand:"Sparkasse","brand:wikidata":"Q2513770","brand:wikipedia":"de:Verband der Freien Sparkassen",name:"Sparkasse"},matchScore:2,suggestion:true},"amenity/bank/Stanbic Bank":{name:"Stanbic Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7597999"},addTags:{amenity:"bank",brand:"Stanbic Bank","brand:wikidata":"Q7597999","brand:wikipedia":"en:Stanbic Bank",name:"Stanbic Bank"},removeTags:{amenity:"bank",brand:"Stanbic Bank","brand:wikidata":"Q7597999","brand:wikipedia":"en:Stanbic Bank",name:"Stanbic Bank"},matchScore:2,suggestion:true},"amenity/bank/Standard Bank":{name:"Standard Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1576610"},addTags:{amenity:"bank",brand:"Standard Bank","brand:wikidata":"Q1576610","brand:wikipedia":"en:Standard Bank",name:"Standard Bank"},removeTags:{amenity:"bank",brand:"Standard Bank","brand:wikidata":"Q1576610","brand:wikipedia":"en:Standard Bank",name:"Standard Bank"},matchScore:2,suggestion:true},"amenity/bank/Standard Chartered":{name:"Standard Chartered",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q548278"},addTags:{amenity:"bank",brand:"Standard Chartered","brand:wikidata":"Q548278","brand:wikipedia":"en:Standard Chartered",name:"Standard Chartered"},removeTags:{amenity:"bank",brand:"Standard Chartered","brand:wikidata":"Q548278","brand:wikipedia":"en:Standard Chartered",name:"Standard Chartered"},matchScore:2,suggestion:true},"amenity/bank/State Bank of India":{name:"State Bank of India",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1340361"},addTags:{amenity:"bank",brand:"State Bank of India","brand:wikidata":"Q1340361","brand:wikipedia":"en:State Bank of India",name:"State Bank of India"},removeTags:{amenity:"bank",brand:"State Bank of India","brand:wikidata":"Q1340361","brand:wikipedia":"en:State Bank of India",name:"State Bank of India"},matchScore:2,suggestion:true},"amenity/bank/Summit Bank":{name:"Summit Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7637775"},addTags:{amenity:"bank",brand:"Summit Bank","brand:wikidata":"Q7637775","brand:wikipedia":"en:Summit Bank",name:"Summit Bank"},removeTags:{amenity:"bank",brand:"Summit Bank","brand:wikidata":"Q7637775","brand:wikipedia":"en:Summit Bank",name:"Summit Bank"},matchScore:2,suggestion:true},"amenity/bank/SunTrust":{name:"SunTrust",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q181507"},addTags:{amenity:"bank",brand:"SunTrust","brand:wikidata":"Q181507","brand:wikipedia":"en:SunTrust Banks",name:"SunTrust"},removeTags:{amenity:"bank",brand:"SunTrust","brand:wikidata":"Q181507","brand:wikipedia":"en:SunTrust Banks",name:"SunTrust"},matchScore:2,suggestion:true},"amenity/bank/Supervielle":{name:"Supervielle",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5718035"},addTags:{amenity:"bank",brand:"Supervielle","brand:wikidata":"Q5718035","brand:wikipedia":"es:Banco Supervielle",name:"Supervielle"},removeTags:{amenity:"bank",brand:"Supervielle","brand:wikidata":"Q5718035","brand:wikipedia":"es:Banco Supervielle",name:"Supervielle"},matchScore:2,suggestion:true},"amenity/bank/Swedbank":{name:"Swedbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1145493"},addTags:{amenity:"bank",brand:"Swedbank","brand:wikidata":"Q1145493","brand:wikipedia":"en:Swedbank",name:"Swedbank"},removeTags:{amenity:"bank",brand:"Swedbank","brand:wikidata":"Q1145493","brand:wikipedia":"en:Swedbank",name:"Swedbank"},matchScore:2,suggestion:true},"amenity/bank/Syndicate Bank":{name:"Syndicate Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2004088"},addTags:{amenity:"bank",brand:"Syndicate Bank","brand:wikidata":"Q2004088","brand:wikipedia":"en:Syndicate Bank",name:"Syndicate Bank"},removeTags:{amenity:"bank",brand:"Syndicate Bank","brand:wikidata":"Q2004088","brand:wikipedia":"en:Syndicate Bank",name:"Syndicate Bank"},matchScore:2,suggestion:true},"amenity/bank/TCF Bank":{name:"TCF Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7669687"},addTags:{amenity:"bank",brand:"TCF Bank","brand:wikidata":"Q7669687","brand:wikipedia":"en:TCF Bank",name:"TCF Bank"},removeTags:{amenity:"bank",brand:"TCF Bank","brand:wikidata":"Q7669687","brand:wikipedia":"en:TCF Bank",name:"TCF Bank"},matchScore:2,suggestion:true},"amenity/bank/TD Bank":{name:"TD Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7669891"},addTags:{amenity:"bank",brand:"TD Bank","brand:wikidata":"Q7669891","brand:wikipedia":"en:TD Bank, N.A.",name:"TD Bank"},removeTags:{amenity:"bank",brand:"TD Bank","brand:wikidata":"Q7669891","brand:wikipedia":"en:TD Bank, N.A.",name:"TD Bank"},matchScore:2,suggestion:true},"amenity/bank/TD Canada Trust":{name:"TD Canada Trust",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1080670"},addTags:{amenity:"bank",brand:"TD Canada Trust","brand:wikidata":"Q1080670","brand:wikipedia":"en:TD Canada Trust",name:"TD Canada Trust"},removeTags:{amenity:"bank",brand:"TD Canada Trust","brand:wikidata":"Q1080670","brand:wikipedia":"en:TD Canada Trust",name:"TD Canada Trust"},matchScore:2,suggestion:true},"amenity/bank/TEB":{name:"TEB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7862447"},addTags:{amenity:"bank",brand:"TEB","brand:wikidata":"Q7862447","brand:wikipedia":"en:Türk Ekonomi Bankası",name:"TEB"},removeTags:{amenity:"bank",brand:"TEB","brand:wikidata":"Q7862447","brand:wikipedia":"en:Türk Ekonomi Bankası",name:"TEB"},matchScore:2,suggestion:true},"amenity/bank/TSB":{name:"TSB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7671560"},addTags:{amenity:"bank",brand:"TSB","brand:wikidata":"Q7671560","brand:wikipedia":"en:TSB Bank (United Kingdom)",name:"TSB"},removeTags:{amenity:"bank",brand:"TSB","brand:wikidata":"Q7671560","brand:wikipedia":"en:TSB Bank (United Kingdom)",name:"TSB"},matchScore:2,suggestion:true},"amenity/bank/Targobank":{name:"Targobank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1455437"},addTags:{amenity:"bank",brand:"Targobank","brand:wikidata":"Q1455437","brand:wikipedia":"en:Targobank",name:"Targobank"},removeTags:{amenity:"bank",brand:"Targobank","brand:wikidata":"Q1455437","brand:wikipedia":"en:Targobank",name:"Targobank"},matchScore:2,suggestion:true},"amenity/bank/Tatra banka":{name:"Tatra banka",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1718069"},addTags:{amenity:"bank",brand:"Tatra banka","brand:wikidata":"Q1718069","brand:wikipedia":"en:Tatra banka",name:"Tatra banka"},removeTags:{amenity:"bank",brand:"Tatra banka","brand:wikidata":"Q1718069","brand:wikipedia":"en:Tatra banka",name:"Tatra banka"},matchScore:2,suggestion:true},"amenity/bank/Türkiye İş Bankası":{name:"Türkiye İş Bankası",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q909613"},addTags:{amenity:"bank",brand:"Türkiye İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"Türkiye İş Bankası"},removeTags:{amenity:"bank",brand:"Türkiye İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"Türkiye İş Bankası"},matchScore:2,suggestion:true},"amenity/bank/UBA":{name:"UBA",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q513457"},addTags:{amenity:"bank",brand:"UBA","brand:wikidata":"Q513457","brand:wikipedia":"en:United Bank for Africa",name:"UBA"},removeTags:{amenity:"bank",brand:"UBA","brand:wikidata":"Q513457","brand:wikipedia":"en:United Bank for Africa",name:"UBA"},matchScore:2,suggestion:true},"amenity/bank/UBI Banca":{name:"UBI Banca",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1476162"},addTags:{amenity:"bank",brand:"UBI Banca","brand:wikidata":"Q1476162","brand:wikipedia":"en:UBI Banca",name:"UBI Banca"},removeTags:{amenity:"bank",brand:"UBI Banca","brand:wikidata":"Q1476162","brand:wikipedia":"en:UBI Banca",name:"UBI Banca"},matchScore:2,suggestion:true},"amenity/bank/UBL":{name:"UBL",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7887504"},addTags:{amenity:"bank",brand:"UBL","brand:en":"United Bank Limited Pakistan","brand:wikidata":"Q7887504","brand:wikipedia":"ur:یونائیٹڈ بینک (پاکستان)",name:"UBL","name:en":"United Bank Limited Pakistan"},removeTags:{amenity:"bank",brand:"UBL","brand:en":"United Bank Limited Pakistan","brand:wikidata":"Q7887504","brand:wikipedia":"ur:یونائیٹڈ بینک (پاکستان)",name:"UBL","name:en":"United Bank Limited Pakistan"},matchScore:2,suggestion:true},"amenity/bank/UBS":{name:"UBS",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q193199"},addTags:{amenity:"bank",brand:"UBS","brand:wikidata":"Q193199","brand:wikipedia":"en:UBS",name:"UBS"},removeTags:{amenity:"bank",brand:"UBS","brand:wikidata":"Q193199","brand:wikipedia":"en:UBS",name:"UBS"},matchScore:2,suggestion:true},"amenity/bank/UCO Bank":{name:"UCO Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2005310"},addTags:{amenity:"bank",brand:"UCO Bank","brand:wikidata":"Q2005310","brand:wikipedia":"en:UCO Bank",name:"UCO Bank"},removeTags:{amenity:"bank",brand:"UCO Bank","brand:wikidata":"Q2005310","brand:wikipedia":"en:UCO Bank",name:"UCO Bank"},matchScore:2,suggestion:true},"amenity/bank/UCPB":{name:"UCPB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7887615"},addTags:{amenity:"bank",brand:"UCPB","brand:wikidata":"Q7887615","brand:wikipedia":"en:United Coconut Planters Bank",name:"UCPB"},removeTags:{amenity:"bank",brand:"UCPB","brand:wikidata":"Q7887615","brand:wikipedia":"en:United Coconut Planters Bank",name:"UCPB"},matchScore:2,suggestion:true},"amenity/bank/UOB":{name:"UOB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2064074"},addTags:{amenity:"bank",brand:"UOB","brand:wikidata":"Q2064074","brand:wikipedia":"en:United Overseas Bank",name:"UOB"},removeTags:{amenity:"bank",brand:"UOB","brand:wikidata":"Q2064074","brand:wikipedia":"en:United Overseas Bank",name:"UOB"},matchScore:2,suggestion:true},"amenity/bank/US Bank":{name:"US Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q739084"},addTags:{amenity:"bank",brand:"US Bank","brand:wikidata":"Q739084","brand:wikipedia":"en:U.S. Bancorp",name:"US Bank"},removeTags:{amenity:"bank",brand:"US Bank","brand:wikidata":"Q739084","brand:wikipedia":"en:U.S. Bancorp",name:"US Bank"},matchScore:2,suggestion:true},"amenity/bank/Ulster Bank":{name:"Ulster Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2613366"},addTags:{amenity:"bank",brand:"Ulster Bank","brand:wikidata":"Q2613366","brand:wikipedia":"en:Ulster Bank",name:"Ulster Bank"},removeTags:{amenity:"bank",brand:"Ulster Bank","brand:wikidata":"Q2613366","brand:wikipedia":"en:Ulster Bank",name:"Ulster Bank"},matchScore:2,suggestion:true},"amenity/bank/Umpqua Bank":{name:"Umpqua Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7881772"},addTags:{amenity:"bank",brand:"Umpqua Bank","brand:wikidata":"Q7881772","brand:wikipedia":"en:Umpqua Holdings Corporation",name:"Umpqua Bank"},removeTags:{amenity:"bank",brand:"Umpqua Bank","brand:wikidata":"Q7881772","brand:wikipedia":"en:Umpqua Holdings Corporation",name:"Umpqua Bank"},matchScore:2,suggestion:true},"amenity/bank/UniCredit Bank":{name:"UniCredit Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q45568"},addTags:{amenity:"bank",brand:"UniCredit Bank","brand:wikidata":"Q45568","brand:wikipedia":"en:UniCredit",name:"UniCredit Bank"},removeTags:{amenity:"bank",brand:"UniCredit Bank","brand:wikidata":"Q45568","brand:wikipedia":"en:UniCredit",name:"UniCredit Bank"},matchScore:2,suggestion:true},"amenity/bank/Unicaja Banco":{name:"Unicaja Banco",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2543704"},addTags:{amenity:"bank",brand:"Unicaja Banco","brand:wikidata":"Q2543704","brand:wikipedia":"en:Unicaja",name:"Unicaja Banco"},removeTags:{amenity:"bank",brand:"Unicaja Banco","brand:wikidata":"Q2543704","brand:wikipedia":"en:Unicaja",name:"Unicaja Banco"},matchScore:2,suggestion:true},"amenity/bank/Union Bank of India":{name:"Union Bank of India",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2004078"},addTags:{amenity:"bank",brand:"Union Bank of India","brand:wikidata":"Q2004078","brand:wikipedia":"en:Union Bank of India",name:"Union Bank of India"},removeTags:{amenity:"bank",brand:"Union Bank of India","brand:wikidata":"Q2004078","brand:wikipedia":"en:Union Bank of India",name:"Union Bank of India"},matchScore:2,suggestion:true},"amenity/bank/UnionBank (Philippines)":{name:"UnionBank (Philippines)",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7885403"},addTags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q7885403","brand:wikipedia":"en:Union Bank of the Philippines",name:"UnionBank"},removeTags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q7885403","brand:wikipedia":"en:Union Bank of the Philippines",name:"UnionBank"},matchScore:2,suggestion:true},"amenity/bank/UnionBank (USA)":{name:"UnionBank (USA)",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1442804"},addTags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q1442804","brand:wikipedia":"en:MUFG Union Bank",name:"UnionBank"},removeTags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q1442804","brand:wikipedia":"en:MUFG Union Bank",name:"UnionBank"},matchScore:2,suggestion:true},"amenity/bank/Vakıfbank":{name:"Vakıfbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1148521"},addTags:{amenity:"bank",brand:"Vakıfbank","brand:wikidata":"Q1148521","brand:wikipedia":"en:VakıfBank",name:"Vakıfbank"},removeTags:{amenity:"bank",brand:"Vakıfbank","brand:wikidata":"Q1148521","brand:wikipedia":"en:VakıfBank",name:"Vakıfbank"},matchScore:2,suggestion:true},"amenity/bank/Veneto Banca":{name:"Veneto Banca",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3127221"},addTags:{amenity:"bank",brand:"Veneto Banca","brand:wikidata":"Q3127221","brand:wikipedia":"en:Veneto Banca",name:"Veneto Banca"},removeTags:{amenity:"bank",brand:"Veneto Banca","brand:wikidata":"Q3127221","brand:wikipedia":"en:Veneto Banca",name:"Veneto Banca"},matchScore:2,suggestion:true},"amenity/bank/Vijaya Bank":{name:"Vijaya Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003171"},addTags:{amenity:"bank",brand:"Vijaya Bank","brand:wikidata":"Q2003171","brand:wikipedia":"en:Vijaya Bank",name:"Vijaya Bank"},removeTags:{amenity:"bank",brand:"Vijaya Bank","brand:wikidata":"Q2003171","brand:wikipedia":"en:Vijaya Bank",name:"Vijaya Bank"},matchScore:2,suggestion:true},"amenity/bank/Volksbank":{name:"Volksbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q695110"},addTags:{amenity:"bank",brand:"Volksbank","brand:wikidata":"Q695110","brand:wikipedia":"en:Volksbank",name:"Volksbank"},removeTags:{amenity:"bank",brand:"Volksbank","brand:wikidata":"Q695110","brand:wikipedia":"en:Volksbank",name:"Volksbank"},matchScore:2,suggestion:true},"amenity/bank/Volksbank Köln Bonn eG":{name:"Volksbank Köln Bonn eG",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q41680844"},addTags:{amenity:"bank",brand:"Volksbank Köln Bonn eG","brand:wikidata":"Q41680844","brand:wikipedia":"de:Volksbank Köln Bonn",name:"Volksbank"},removeTags:{amenity:"bank",brand:"Volksbank Köln Bonn eG","brand:wikidata":"Q41680844","brand:wikipedia":"de:Volksbank Köln Bonn",name:"Volksbank"},matchScore:2,suggestion:true},"amenity/bank/VÚB":{name:"VÚB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12778981"},addTags:{amenity:"bank",brand:"VÚB","brand:wikidata":"Q12778981","brand:wikipedia":"en:Všeobecná úverová banka",name:"VÚB"},removeTags:{amenity:"bank",brand:"VÚB","brand:wikidata":"Q12778981","brand:wikipedia":"en:Všeobecná úverová banka",name:"VÚB"},matchScore:2,suggestion:true},"amenity/bank/Washington Federal":{name:"Washington Federal",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7971859"},addTags:{amenity:"bank",brand:"Washington Federal","brand:wikidata":"Q7971859","brand:wikipedia":"en:Washington Federal",name:"Washington Federal"},removeTags:{amenity:"bank",brand:"Washington Federal","brand:wikidata":"Q7971859","brand:wikipedia":"en:Washington Federal",name:"Washington Federal"},matchScore:2,suggestion:true},"amenity/bank/Wells Fargo":{name:"Wells Fargo",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q744149"},addTags:{amenity:"bank",brand:"Wells Fargo","brand:wikidata":"Q744149","brand:wikipedia":"en:Wells Fargo",name:"Wells Fargo"},removeTags:{amenity:"bank",brand:"Wells Fargo","brand:wikidata":"Q744149","brand:wikipedia":"en:Wells Fargo",name:"Wells Fargo"},matchScore:2,suggestion:true},"amenity/bank/Western Union":{name:"Western Union",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q861042"},addTags:{amenity:"bank",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},removeTags:{amenity:"bank",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},matchScore:2,suggestion:true},"amenity/bank/Westpac":{name:"Westpac",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2031726"},addTags:{amenity:"bank",brand:"Westpac","brand:wikidata":"Q2031726","brand:wikipedia":"en:Westpac",name:"Westpac"},removeTags:{amenity:"bank",brand:"Westpac","brand:wikidata":"Q2031726","brand:wikipedia":"en:Westpac",name:"Westpac"},matchScore:2,suggestion:true},"amenity/bank/Yapı Kredi":{name:"Yapı Kredi",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q8049138"},addTags:{amenity:"bank",brand:"Yapı Kredi","brand:wikidata":"Q8049138","brand:wikipedia":"en:Yapı ve Kredi Bankası",name:"Yapı Kredi"},removeTags:{amenity:"bank",brand:"Yapı Kredi","brand:wikidata":"Q8049138","brand:wikipedia":"en:Yapı ve Kredi Bankası",name:"Yapı Kredi"},matchScore:2,suggestion:true},"amenity/bank/Yorkshire Bank":{name:"Yorkshire Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q8055678"},addTags:{amenity:"bank",brand:"Yorkshire Bank","brand:wikidata":"Q8055678","brand:wikipedia":"en:Yorkshire Bank",name:"Yorkshire Bank"},removeTags:{amenity:"bank",brand:"Yorkshire Bank","brand:wikidata":"Q8055678","brand:wikipedia":"en:Yorkshire Bank",name:"Yorkshire Bank"},matchScore:2,suggestion:true},"amenity/bank/Yorkshire Building Society":{name:"Yorkshire Building Society",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12073381"},addTags:{amenity:"bank",brand:"Yorkshire Building Society","brand:wikidata":"Q12073381","brand:wikipedia":"en:Yorkshire Building Society",name:"Yorkshire Building Society"},removeTags:{amenity:"bank",brand:"Yorkshire Building Society","brand:wikidata":"Q12073381","brand:wikipedia":"en:Yorkshire Building Society",name:"Yorkshire Building Society"},matchScore:2,suggestion:true},"amenity/bank/Zagrebačka banka":{name:"Zagrebačka banka",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q140381"},addTags:{amenity:"bank",brand:"Zagrebačka banka","brand:wikidata":"Q140381","brand:wikipedia":"en:Zagrebačka banka",name:"Zagrebačka banka"},removeTags:{amenity:"bank",brand:"Zagrebačka banka","brand:wikidata":"Q140381","brand:wikipedia":"en:Zagrebačka banka",name:"Zagrebačka banka"},matchScore:2,suggestion:true},"amenity/bank/Zenith Bank":{name:"Zenith Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5978240"},addTags:{amenity:"bank",brand:"Zenith Bank","brand:wikidata":"Q5978240","brand:wikipedia":"en:Zenith Bank",name:"Zenith Bank"},removeTags:{amenity:"bank",brand:"Zenith Bank","brand:wikidata":"Q5978240","brand:wikipedia":"en:Zenith Bank",name:"Zenith Bank"},matchScore:2,suggestion:true},"amenity/bank/Ziraat Bankası":{name:"Ziraat Bankası",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q696003"},addTags:{amenity:"bank",brand:"Ziraat Bankası","brand:wikidata":"Q696003","brand:wikipedia":"en:Ziraat Bankası",name:"Ziraat Bankası"},removeTags:{amenity:"bank",brand:"Ziraat Bankası","brand:wikidata":"Q696003","brand:wikipedia":"en:Ziraat Bankası",name:"Ziraat Bankası"},matchScore:2,suggestion:true},"amenity/bank/mBank":{name:"mBank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1160928"},addTags:{amenity:"bank",brand:"mBank","brand:wikidata":"Q1160928","brand:wikipedia":"en:MBank",name:"mBank"},removeTags:{amenity:"bank",brand:"mBank","brand:wikidata":"Q1160928","brand:wikipedia":"en:MBank",name:"mBank"},matchScore:2,suggestion:true},"amenity/bank/ČSOB":{name:"ČSOB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q340135"},addTags:{amenity:"bank",brand:"ČSOB","brand:wikidata":"Q340135","brand:wikipedia":"en:Československá obchodní banka",name:"ČSOB"},removeTags:{amenity:"bank",brand:"ČSOB","brand:wikidata":"Q340135","brand:wikipedia":"en:Československá obchodní banka",name:"ČSOB"},matchScore:2,suggestion:true},"amenity/bank/Česká spořitelna":{name:"Česká spořitelna",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q341100"},addTags:{amenity:"bank",brand:"Česká spořitelna","brand:wikidata":"Q341100","brand:wikipedia":"en:Česká spořitelna",name:"Česká spořitelna"},removeTags:{amenity:"bank",brand:"Česká spořitelna","brand:wikidata":"Q341100","brand:wikipedia":"en:Česká spořitelna",name:"Česká spořitelna"},matchScore:2,suggestion:true},"amenity/bank/İş Bankası":{name:"İş Bankası",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q909613"},addTags:{amenity:"bank",brand:"İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"İş Bankası"},removeTags:{amenity:"bank",brand:"İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"İş Bankası"},matchScore:2,suggestion:true},"amenity/bank/Εθνική Τράπεζα":{name:"Εθνική Τράπεζα",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1816028"},addTags:{amenity:"bank",brand:"Εθνική Τράπεζα","brand:en":"National Bank of Greece","brand:wikidata":"Q1816028","brand:wikipedia":"en:National Bank of Greece",name:"Εθνική Τράπεζα","name:en":"National Bank of Greece"},removeTags:{amenity:"bank",brand:"Εθνική Τράπεζα","brand:en":"National Bank of Greece","brand:wikidata":"Q1816028","brand:wikipedia":"en:National Bank of Greece",name:"Εθνική Τράπεζα","name:en":"National Bank of Greece"},matchScore:2,suggestion:true},"amenity/bank/Τράπεζα Πειραιώς":{name:"Τράπεζα Πειραιώς",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3312"},addTags:{amenity:"bank",brand:"Τράπεζα Πειραιώς","brand:en":"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Τράπεζα Πειραιώς","name:en":"Piraeus Bank"},removeTags:{amenity:"bank",brand:"Τράπεζα Πειραιώς","brand:en":"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Τράπεζα Πειραιώς","name:en":"Piraeus Bank"},matchScore:2,suggestion:true},"amenity/bank/Альфа-Банк":{name:"Альфа-Банк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1377835"},addTags:{amenity:"bank",brand:"Альфа-Банк","brand:en":"Alfa-Bank","brand:wikidata":"Q1377835","brand:wikipedia":"en:Alfa-Bank",name:"Альфа-Банк","name:en":"Alfa-Bank"},removeTags:{amenity:"bank",brand:"Альфа-Банк","brand:en":"Alfa-Bank","brand:wikidata":"Q1377835","brand:wikipedia":"en:Alfa-Bank",name:"Альфа-Банк","name:en":"Alfa-Bank"},matchScore:2,suggestion:true},"amenity/bank/Банка ДСК":{name:"Банка ДСК",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5206146"},addTags:{amenity:"bank",brand:"Банка ДСК","brand:en":"DSK Bank","brand:wikidata":"Q5206146","brand:wikipedia":"en:DSK Bank",name:"Банка ДСК","name:en":"DSK Bank"},removeTags:{amenity:"bank",brand:"Банка ДСК","brand:en":"DSK Bank","brand:wikidata":"Q5206146","brand:wikipedia":"en:DSK Bank",name:"Банка ДСК","name:en":"DSK Bank"},matchScore:2,suggestion:true},"amenity/bank/Белагропромбанк":{name:"Белагропромбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1991373"},addTags:{amenity:"bank",brand:"Белагропромбанк","brand:en":"Belagroprom Bank","brand:wikidata":"Q1991373","brand:wikipedia":"be:Белаграпрамбанк",name:"Белагропромбанк","name:en":"Belagroprom Bank"},removeTags:{amenity:"bank",brand:"Белагропромбанк","brand:en":"Belagroprom Bank","brand:wikidata":"Q1991373","brand:wikipedia":"be:Белаграпрамбанк",name:"Белагропромбанк","name:en":"Belagroprom Bank"},matchScore:2,suggestion:true},"amenity/bank/Беларусбанк":{name:"Беларусбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1997334"},addTags:{amenity:"bank",brand:"Беларусбанк","brand:en":"Belarusbank","brand:wikidata":"Q1997334","brand:wikipedia":"en:Belarusbank",name:"Беларусбанк","name:en":"Belarusbank"},removeTags:{amenity:"bank",brand:"Беларусбанк","brand:en":"Belarusbank","brand:wikidata":"Q1997334","brand:wikipedia":"en:Belarusbank",name:"Беларусбанк","name:en":"Belarusbank"},matchScore:2,suggestion:true},"amenity/bank/Белинвестбанк":{name:"Белинвестбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4081940"},addTags:{amenity:"bank",brand:"Белинвестбанк","brand:wikidata":"Q4081940","brand:wikipedia":"ru:Белинвестбанк",name:"Белинвестбанк"},removeTags:{amenity:"bank",brand:"Белинвестбанк","brand:wikidata":"Q4081940","brand:wikipedia":"ru:Белинвестбанк",name:"Белинвестбанк"},matchScore:2,suggestion:true},"amenity/bank/Бинбанк":{name:"Бинбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4086829"},addTags:{amenity:"bank",brand:"Бинбанк","brand:en":"B&N Bank","brand:wikidata":"Q4086829","brand:wikipedia":"en:B&N Bank",name:"Бинбанк","name:en":"B&N Bank"},removeTags:{amenity:"bank",brand:"Бинбанк","brand:en":"B&N Bank","brand:wikidata":"Q4086829","brand:wikipedia":"en:B&N Bank",name:"Бинбанк","name:en":"B&N Bank"},matchScore:2,suggestion:true},"amenity/bank/ВТБ":{name:"ВТБ",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1549389"},addTags:{amenity:"bank",brand:"ВТБ","brand:en":"VTB Bank","brand:wikidata":"Q1549389","brand:wikipedia":"en:VTB Bank",name:"ВТБ","name:en":"VTB Bank"},removeTags:{amenity:"bank",brand:"ВТБ","brand:en":"VTB Bank","brand:wikidata":"Q1549389","brand:wikipedia":"en:VTB Bank",name:"ВТБ","name:en":"VTB Bank"},matchScore:2,suggestion:true},"amenity/bank/Возрождение":{name:"Возрождение",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4114952"},addTags:{amenity:"bank",brand:"Возрождение","brand:wikidata":"Q4114952","brand:wikipedia":"en:Возрождение (банк)",name:"Возрождение"},removeTags:{amenity:"bank",brand:"Возрождение","brand:wikidata":"Q4114952","brand:wikipedia":"en:Возрождение (банк)",name:"Возрождение"},matchScore:2,suggestion:true},"amenity/bank/Газпромбанк":{name:"Газпромбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1924338"},addTags:{amenity:"bank",brand:"Газпромбанк","brand:en":"Gazprombank","brand:wikidata":"Q1924338","brand:wikipedia":"en:Gazprombank",name:"Газпромбанк","name:en":"Gazprombank"},removeTags:{amenity:"bank",brand:"Газпромбанк","brand:en":"Gazprombank","brand:wikidata":"Q1924338","brand:wikipedia":"en:Gazprombank",name:"Газпромбанк","name:en":"Gazprombank"},matchScore:2,suggestion:true},"amenity/bank/Казкоммерцбанк":{name:"Казкоммерцбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1168179"},addTags:{amenity:"bank",brand:"Казкоммерцбанк","brand:en":"Kazkommertsbank","brand:wikidata":"Q1168179","brand:wikipedia":"en:Kazkommertsbank",name:"Казкоммерцбанк","name:en":"Kazkommertsbank"},removeTags:{amenity:"bank",brand:"Казкоммерцбанк","brand:en":"Kazkommertsbank","brand:wikidata":"Q1168179","brand:wikipedia":"en:Kazkommertsbank",name:"Казкоммерцбанк","name:en":"Kazkommertsbank"},matchScore:2,suggestion:true},"amenity/bank/Московский индустриальный банк":{name:"Московский индустриальный банк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4304145"},addTags:{amenity:"bank",brand:"Московский индустриальный банк","brand:en":"Moscow Industrial Bank","brand:wikidata":"Q4304145","brand:wikipedia":"ru:Московский индустриальный банк",name:"Московский индустриальный банк","name:en":"Moscow Industrial Bank"},removeTags:{amenity:"bank",brand:"Московский индустриальный банк","brand:en":"Moscow Industrial Bank","brand:wikidata":"Q4304145","brand:wikipedia":"ru:Московский индустриальный банк",name:"Московский индустриальный банк","name:en":"Moscow Industrial Bank"},matchScore:2,suggestion:true},"amenity/bank/Мособлбанк":{name:"Мособлбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4304446"},addTags:{amenity:"bank",brand:"Мособлбанк","brand:en":"Mosobl Bank","brand:wikidata":"Q4304446","brand:wikipedia":"ru:Мособлбанк",name:"Мособлбанк","name:en":"Mosobl Bank"},removeTags:{amenity:"bank",brand:"Мособлбанк","brand:en":"Mosobl Bank","brand:wikidata":"Q4304446","brand:wikipedia":"ru:Мособлбанк",name:"Мособлбанк","name:en":"Mosobl Bank"},matchScore:2,suggestion:true},"amenity/bank/ОТП Банк":{name:"ОТП Банк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q912778"},addTags:{amenity:"bank",brand:"ОТП Банк","brand:en":"OTP Bank","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"ОТП Банк","name:en":"OTP Bank"},removeTags:{amenity:"bank",brand:"ОТП Банк","brand:en":"OTP Bank","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"ОТП Банк","name:en":"OTP Bank"},matchScore:2,suggestion:true},"amenity/bank/Обединена Българска Банка":{name:"Обединена Българска Банка",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7887555"},addTags:{amenity:"bank",brand:"Обединена Българска Банка","brand:en":"United Bulgarian Bank","brand:wikidata":"Q7887555","brand:wikipedia":"en:United Bulgarian Bank",name:"Обединена Българска Банка","name:en":"United Bulgarian Bank"},removeTags:{amenity:"bank",brand:"Обединена Българска Банка","brand:en":"United Bulgarian Bank","brand:wikidata":"Q7887555","brand:wikipedia":"en:United Bulgarian Bank",name:"Обединена Българска Банка","name:en":"United Bulgarian Bank"},matchScore:2,suggestion:true},"amenity/bank/Ощадбанк":{name:"Ощадбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4340839"},addTags:{amenity:"bank",brand:"Ощадбанк","brand:en":"State Savings Bank of Ukraine","brand:wikidata":"Q4340839","brand:wikipedia":"uk:Ощадбанк",name:"Ощадбанк","name:en":"State Savings Bank of Ukraine"},removeTags:{amenity:"bank",brand:"Ощадбанк","brand:en":"State Savings Bank of Ukraine","brand:wikidata":"Q4340839","brand:wikipedia":"uk:Ощадбанк",name:"Ощадбанк","name:en":"State Savings Bank of Ukraine"},matchScore:2,suggestion:true},"amenity/bank/ПУМБ":{name:"ПУМБ",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4341156"},addTags:{amenity:"bank",brand:"ПУМБ","brand:en":"First Ukrainian International Bank","brand:wikidata":"Q4341156","brand:wikipedia":"en:First Ukrainian International Bank",name:"ПУМБ","name:en":"First Ukrainian International Bank"},removeTags:{amenity:"bank",brand:"ПУМБ","brand:en":"First Ukrainian International Bank","brand:wikidata":"Q4341156","brand:wikipedia":"en:First Ukrainian International Bank",name:"ПУМБ","name:en":"First Ukrainian International Bank"},matchScore:2,suggestion:true},"amenity/bank/Почта Банк":{name:"Почта Банк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q24930461"},addTags:{amenity:"bank",brand:"Почта Банк","brand:en":"Post Bank","brand:wikidata":"Q24930461","brand:wikipedia":"en:Post Bank (Russia)",name:"Почта Банк","name:en":"Post Bank"},removeTags:{amenity:"bank",brand:"Почта Банк","brand:en":"Post Bank","brand:wikidata":"Q24930461","brand:wikipedia":"en:Post Bank (Russia)",name:"Почта Банк","name:en":"Post Bank"},matchScore:2,suggestion:true},"amenity/bank/ПриватБанк":{name:"ПриватБанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1515015"},addTags:{amenity:"bank",brand:"ПриватБанк","brand:en":"PrivatBank","brand:wikidata":"Q1515015","brand:wikipedia":"uk:ПриватБанк",name:"ПриватБанк","name:en":"PrivatBank"},removeTags:{amenity:"bank",brand:"ПриватБанк","brand:en":"PrivatBank","brand:wikidata":"Q1515015","brand:wikipedia":"uk:ПриватБанк",name:"ПриватБанк","name:en":"PrivatBank"},matchScore:2,suggestion:true},"amenity/bank/Приорбанк":{name:"Приорбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3919658"},addTags:{amenity:"bank",brand:"Приорбанк","brand:en":"PriorBank","brand:wikidata":"Q3919658","brand:wikipedia":"be:Пріорбанк",name:"Приорбанк","name:en":"PriorBank"},removeTags:{amenity:"bank",brand:"Приорбанк","brand:en":"PriorBank","brand:wikidata":"Q3919658","brand:wikipedia":"be:Пріорбанк",name:"Приорбанк","name:en":"PriorBank"},matchScore:2,suggestion:true},"amenity/bank/Промсвязьбанк":{name:"Промсвязьбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q649100"},addTags:{amenity:"bank",brand:"Промсвязьбанк","brand:en":"Promsvyazbank","brand:wikidata":"Q649100","brand:wikipedia":"en:Promsvyazbank",name:"Промсвязьбанк","name:en":"Promsvyazbank"},removeTags:{amenity:"bank",brand:"Промсвязьбанк","brand:en":"Promsvyazbank","brand:wikidata":"Q649100","brand:wikipedia":"en:Promsvyazbank",name:"Промсвязьбанк","name:en":"Promsvyazbank"},matchScore:2,suggestion:true},"amenity/bank/РНКБ":{name:"РНКБ",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q16912944"},addTags:{amenity:"bank",brand:"РНКБ","brand:wikidata":"Q16912944","brand:wikipedia":"en:Russian National Commercial Bank",name:"РНКБ"},removeTags:{amenity:"bank",brand:"РНКБ","brand:wikidata":"Q16912944","brand:wikipedia":"en:Russian National Commercial Bank",name:"РНКБ"},matchScore:2,suggestion:true},"amenity/bank/Райффайзен":{name:"Райффайзен",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4389244"},addTags:{amenity:"bank",brand:"Райффайзен","brand:en":"Raiffeisenbank","brand:wikidata":"Q4389244","brand:wikipedia":"en:Raiffeisenbank (Russia)",name:"Райффайзен","name:en":"Raiffeisenbank"},removeTags:{amenity:"bank",brand:"Райффайзен","brand:en":"Raiffeisenbank","brand:wikidata":"Q4389244","brand:wikipedia":"en:Raiffeisenbank (Russia)",name:"Райффайзен","name:en":"Raiffeisenbank"},matchScore:2,suggestion:true},"amenity/bank/Райффайзен Банк Аваль":{name:"Райффайзен Банк Аваль",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4389243"},addTags:{amenity:"bank",brand:"Райффайзен Банк Аваль","brand:en":"Raiffeisen Bank Aval","brand:wikidata":"Q4389243","brand:wikipedia":"en:Raiffeisen Bank Aval",name:"Райффайзен Банк Аваль","name:en":"Raiffeisen Bank Aval"},removeTags:{amenity:"bank",brand:"Райффайзен Банк Аваль","brand:en":"Raiffeisen Bank Aval","brand:wikidata":"Q4389243","brand:wikipedia":"en:Raiffeisen Bank Aval",name:"Райффайзен Банк Аваль","name:en":"Raiffeisen Bank Aval"},matchScore:2,suggestion:true},"amenity/bank/Росбанк":{name:"Росбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1119857"},addTags:{amenity:"bank",brand:"Росбанк","brand:en":"Rosbank","brand:wikidata":"Q1119857","brand:wikipedia":"en:Rosbank",name:"Росбанк","name:en":"Rosbank"},removeTags:{amenity:"bank",brand:"Росбанк","brand:en":"Rosbank","brand:wikidata":"Q1119857","brand:wikipedia":"en:Rosbank",name:"Росбанк","name:en":"Rosbank"},matchScore:2,suggestion:true},"amenity/bank/Россельхозбанк":{name:"Россельхозбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3920226"},addTags:{amenity:"bank",brand:"Россельхозбанк","brand:en":"Rosselkhozbank","brand:wikidata":"Q3920226","brand:wikipedia":"en:Rosselkhozbank",name:"Россельхозбанк","name:en":"Rosselkhozbank"},removeTags:{amenity:"bank",brand:"Россельхозбанк","brand:en":"Rosselkhozbank","brand:wikidata":"Q3920226","brand:wikipedia":"en:Rosselkhozbank",name:"Россельхозбанк","name:en":"Rosselkhozbank"},matchScore:2,suggestion:true},"amenity/bank/Русский Стандарт":{name:"Русский Стандарт",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4400854"},addTags:{amenity:"bank",brand:"Русский Стандарт","brand:en":"Russian Standard Bank","brand:wikidata":"Q4400854","brand:wikipedia":"en:Russian Standard Bank",name:"Русский Стандарт","name:en":"Russian Standard Bank"},removeTags:{amenity:"bank",brand:"Русский Стандарт","brand:en":"Russian Standard Bank","brand:wikidata":"Q4400854","brand:wikipedia":"en:Russian Standard Bank",name:"Русский Стандарт","name:en":"Russian Standard Bank"},matchScore:2,suggestion:true},"amenity/bank/Сбербанк":{name:"Сбербанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4378147"},addTags:{amenity:"bank",brand:"Сбербанк","brand:en":"Prisbank","brand:wikidata":"Q4378147","brand:wikipedia":"ru:Приднестровский Сбербанк",name:"Сбербанк","name:en":"Prisbank"},removeTags:{amenity:"bank",brand:"Сбербанк","brand:en":"Prisbank","brand:wikidata":"Q4378147","brand:wikipedia":"ru:Приднестровский Сбербанк",name:"Сбербанк","name:en":"Prisbank"},matchScore:2,suggestion:true},"amenity/bank/Совкомбанк":{name:"Совкомбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4426566"},addTags:{amenity:"bank",brand:"Совкомбанк","brand:en":"Sovcom Bank","brand:wikidata":"Q4426566","brand:wikipedia":"ru:Совкомбанк",name:"Совкомбанк","name:en":"Sovcom Bank"},removeTags:{amenity:"bank",brand:"Совкомбанк","brand:en":"Sovcom Bank","brand:wikidata":"Q4426566","brand:wikipedia":"ru:Совкомбанк",name:"Совкомбанк","name:en":"Sovcom Bank"},matchScore:2,suggestion:true},"amenity/bank/УкрСиббанк":{name:"УкрСиббанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1976290"},addTags:{amenity:"bank",brand:"УкрСиббанк","brand:en":"UkrSibbank","brand:wikidata":"Q1976290","brand:wikipedia":"en:UkrSibbank",name:"УкрСиббанк","name:en":"UkrSibbank"},removeTags:{amenity:"bank",brand:"УкрСиббанк","brand:en":"UkrSibbank","brand:wikidata":"Q1976290","brand:wikipedia":"en:UkrSibbank",name:"УкрСиббанк","name:en":"UkrSibbank"},matchScore:2,suggestion:true},"amenity/bank/Укргазбанк":{name:"Укргазбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4470692"},addTags:{amenity:"bank",brand:"Укргазбанк","brand:en":"Ukrgasbank","brand:wikidata":"Q4470692","brand:wikipedia":"ru:Укргазбанк",name:"Укргазбанк","name:en":"Ukrgasbank"},removeTags:{amenity:"bank",brand:"Укргазбанк","brand:en":"Ukrgasbank","brand:wikidata":"Q4470692","brand:wikipedia":"ru:Укргазбанк",name:"Укргазбанк","name:en":"Ukrgasbank"},matchScore:2,suggestion:true},"amenity/bank/Укрсоцбанк":{name:"Укрсоцбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3547885"},addTags:{amenity:"bank",brand:"Укрсоцбанк","brand:en":"Ukrsotsbank","brand:wikidata":"Q3547885","brand:wikipedia":"en:Ukrsotsbank",name:"Укрсоцбанк","name:en":"Ukrsotsbank"},removeTags:{amenity:"bank",brand:"Укрсоцбанк","brand:en":"Ukrsotsbank","brand:wikidata":"Q3547885","brand:wikipedia":"en:Ukrsotsbank",name:"Укрсоцбанк","name:en":"Ukrsotsbank"},matchScore:2,suggestion:true},"amenity/bank/Уралсиб":{name:"Уралсиб",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4476693"},addTags:{amenity:"bank",brand:"Уралсиб","brand:en":"Uralsib bank","brand:wikidata":"Q4476693","brand:wikipedia":"ru:Уралсиб (банк)",name:"Уралсиб","name:en":"Uralsib bank"},removeTags:{amenity:"bank",brand:"Уралсиб","brand:en":"Uralsib bank","brand:wikidata":"Q4476693","brand:wikipedia":"ru:Уралсиб (банк)",name:"Уралсиб","name:en":"Uralsib bank"},matchScore:2,suggestion:true},"amenity/bank/Хаан банк":{name:"Хаан банк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q25632240"},addTags:{amenity:"bank",brand:"Хаан банк","brand:wikidata":"Q25632240","brand:wikipedia":"mn:ХААН банк",name:"Хаан банк"},removeTags:{amenity:"bank",brand:"Хаан банк","brand:wikidata":"Q25632240","brand:wikipedia":"mn:ХААН банк",name:"Хаан банк"},matchScore:2,suggestion:true},"amenity/bank/Хоум Кредит":{name:"Хоум Кредит",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4500466"},addTags:{amenity:"bank",brand:"Хоум Кредит","brand:en":"Home Credit & Finance Bank","brand:wikidata":"Q4500466","brand:wikipedia":"en:Home Credit & Finance Bank",name:"Хоум Кредит","name:en":"Home Credit & Finance Bank"},removeTags:{amenity:"bank",brand:"Хоум Кредит","brand:en":"Home Credit & Finance Bank","brand:wikidata":"Q4500466","brand:wikipedia":"en:Home Credit & Finance Bank",name:"Хоум Кредит","name:en":"Home Credit & Finance Bank"},matchScore:2,suggestion:true},"amenity/bank/בנק הפועלים":{name:"בנק הפועלים",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2666775"},addTags:{amenity:"bank",brand:"בנק הפועלים","brand:en":"Bank Hapoalim","brand:wikidata":"Q2666775","brand:wikipedia":"en:Bank Hapoalim",name:"בנק הפועלים","name:en":"Bank Hapoalim"},removeTags:{amenity:"bank",brand:"בנק הפועלים","brand:en":"Bank Hapoalim","brand:wikidata":"Q2666775","brand:wikipedia":"en:Bank Hapoalim",name:"בנק הפועלים","name:en":"Bank Hapoalim"},matchScore:2,suggestion:true},"amenity/bank/בנק לאומי":{name:"בנק לאומי",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806641"},addTags:{amenity:"bank",brand:"בנק לאומי","brand:en":"Bank Leumi","brand:wikidata":"Q806641","brand:wikipedia":"en:Bank Leumi",name:"בנק לאומי","name:en":"Bank Leumi"},removeTags:{amenity:"bank",brand:"בנק לאומי","brand:en":"Bank Leumi","brand:wikidata":"Q806641","brand:wikipedia":"en:Bank Leumi",name:"בנק לאומי","name:en":"Bank Leumi"},matchScore:2,suggestion:true},"amenity/bank/بانک آینده":{name:"بانک آینده",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5938144"},addTags:{amenity:"bank",brand:"بانک آینده","brand:en":"Ayandeh Bank","brand:wikidata":"Q5938144","brand:wikipedia":"en:Ayandeh Bank",name:"بانک آینده","name:en":"Ayandeh Bank"},removeTags:{amenity:"bank",brand:"بانک آینده","brand:en":"Ayandeh Bank","brand:wikidata":"Q5938144","brand:wikipedia":"en:Ayandeh Bank",name:"بانک آینده","name:en":"Ayandeh Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک اقتصاد نوین":{name:"بانک اقتصاد نوین",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5323768"},addTags:{amenity:"bank",brand:"بانک اقتصاد نوین","brand:en":"EN Bank","brand:wikidata":"Q5323768","brand:wikipedia":"en:EN Bank",name:"بانک اقتصاد نوین","name:en":"EN Bank"},removeTags:{amenity:"bank",brand:"بانک اقتصاد نوین","brand:en":"EN Bank","brand:wikidata":"Q5323768","brand:wikipedia":"en:EN Bank",name:"بانک اقتصاد نوین","name:en":"EN Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک ایران زمین":{name:"بانک ایران زمین",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5934423"},addTags:{amenity:"bank",brand:"بانک ایران زمین","brand:wikidata":"Q5934423","brand:wikipedia":"en:Iran Zamin Bank",name:"بانک ایران زمین"},removeTags:{amenity:"bank",brand:"بانک ایران زمین","brand:wikidata":"Q5934423","brand:wikipedia":"en:Iran Zamin Bank",name:"بانک ایران زمین"},matchScore:2,suggestion:true},"amenity/bank/بانک رفاه":{name:"بانک رفاه",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7307083"},addTags:{amenity:"bank",brand:"بانک رفاه","brand:en":"Refah Bank","brand:wikidata":"Q7307083","brand:wikipedia":"en:Refah Bank",name:"بانک رفاه","name:en":"Refah Bank"},removeTags:{amenity:"bank",brand:"بانک رفاه","brand:en":"Refah Bank","brand:wikidata":"Q7307083","brand:wikipedia":"en:Refah Bank",name:"بانک رفاه","name:en":"Refah Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک سامان":{name:"بانک سامان",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4117676"},addTags:{amenity:"bank",brand:"بانک سامان","brand:en":"Saman Bank","brand:wikidata":"Q4117676","brand:wikipedia":"en:Saman Bank",name:"بانک سامان","name:en":"Saman Bank"},removeTags:{amenity:"bank",brand:"بانک سامان","brand:en":"Saman Bank","brand:wikidata":"Q4117676","brand:wikipedia":"en:Saman Bank",name:"بانک سامان","name:en":"Saman Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک سرمایه":{name:"بانک سرمایه",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7424291"},addTags:{amenity:"bank",brand:"بانک سرمایه","brand:en":"Sarmayeh Bank","brand:wikidata":"Q7424291","brand:wikipedia":"en:Sarmayeh Bank",name:"بانک سرمایه","name:en":"Sarmayeh Bank"},removeTags:{amenity:"bank",brand:"بانک سرمایه","brand:en":"Sarmayeh Bank","brand:wikidata":"Q7424291","brand:wikipedia":"en:Sarmayeh Bank",name:"بانک سرمایه","name:en":"Sarmayeh Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک سپه":{name:"بانک سپه",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882624"},addTags:{amenity:"bank",brand:"بانک سپه","brand:en":"Bank Sepah","brand:wikidata":"Q2882624","brand:wikipedia":"en:Bank Sepah",name:"بانک سپه","name:en":"Bank Sepah"},removeTags:{amenity:"bank",brand:"بانک سپه","brand:en":"Bank Sepah","brand:wikidata":"Q2882624","brand:wikipedia":"en:Bank Sepah",name:"بانک سپه","name:en":"Bank Sepah"},matchScore:2,suggestion:true},"amenity/bank/بانک سینا":{name:"بانک سینا",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10860246"},addTags:{amenity:"bank",brand:"بانک سینا","brand:en":"Sina Bank","brand:wikidata":"Q10860246","brand:wikipedia":"en:Sina Bank",name:"بانک سینا","name:en":"Sina Bank"},removeTags:{amenity:"bank",brand:"بانک سینا","brand:en":"Sina Bank","brand:wikidata":"Q10860246","brand:wikipedia":"en:Sina Bank",name:"بانک سینا","name:en":"Sina Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک شهر":{name:"بانک شهر",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5941033"},addTags:{amenity:"bank",brand:"بانک شهر","brand:en":"Shahr Bank","brand:wikidata":"Q5941033","brand:wikipedia":"fa:بانک شهر",name:"بانک شهر","name:en":"Shahr Bank"},removeTags:{amenity:"bank",brand:"بانک شهر","brand:en":"Shahr Bank","brand:wikidata":"Q5941033","brand:wikipedia":"fa:بانک شهر",name:"بانک شهر","name:en":"Shahr Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک صادرات":{name:"بانک صادرات",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882608"},addTags:{amenity:"bank",brand:"بانک صادرات","brand:en":"Bank Saderat Iran","brand:wikidata":"Q2882608","brand:wikipedia":"en:Bank Saderat Iran",name:"بانک صادرات","name:en":"Bank Saderat Iran"},removeTags:{amenity:"bank",brand:"بانک صادرات","brand:en":"Bank Saderat Iran","brand:wikidata":"Q2882608","brand:wikipedia":"en:Bank Saderat Iran",name:"بانک صادرات","name:en":"Bank Saderat Iran"},matchScore:2,suggestion:true},"amenity/bank/بانک قوامین":{name:"بانک قوامین",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10860253"},addTags:{amenity:"bank",brand:"بانک قوامین","brand:en":"Ghavamin Bank","brand:wikidata":"Q10860253","brand:wikipedia":"en:Ghavamin Bank",name:"بانک قوامین","name:en":"Ghavamin Bank"},removeTags:{amenity:"bank",brand:"بانک قوامین","brand:en":"Ghavamin Bank","brand:wikidata":"Q10860253","brand:wikipedia":"en:Ghavamin Bank",name:"بانک قوامین","name:en":"Ghavamin Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک مسکن":{name:"بانک مسکن",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855942"},addTags:{amenity:"bank",brand:"بانک مسکن","brand:en":"Bank Maskan","brand:wikidata":"Q4855942","brand:wikipedia":"en:Bank Maskan",name:"بانک مسکن","name:en":"Bank Maskan"},removeTags:{amenity:"bank",brand:"بانک مسکن","brand:en":"Bank Maskan","brand:wikidata":"Q4855942","brand:wikipedia":"en:Bank Maskan",name:"بانک مسکن","name:en":"Bank Maskan"},matchScore:2,suggestion:true},"amenity/bank/بانک ملت":{name:"بانک ملت",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855944"},addTags:{amenity:"bank",brand:"بانک ملت","brand:en":"Bank Mellat","brand:wikidata":"Q4855944","brand:wikipedia":"en:Bank Mellat",name:"بانک ملت","name:en":"Bank Mellat"},removeTags:{amenity:"bank",brand:"بانک ملت","brand:en":"Bank Mellat","brand:wikidata":"Q4855944","brand:wikipedia":"en:Bank Mellat",name:"بانک ملت","name:en":"Bank Mellat"},matchScore:2,suggestion:true},"amenity/bank/بانک ملی ایران":{name:"بانک ملی ایران",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806640"},addTags:{amenity:"bank",brand:"بانک ملی ایران","brand:en":"Bank Melli Iran","brand:wikidata":"Q806640","brand:wikipedia":"en:Bank Melli Iran",name:"بانک ملی ایران","name:en":"Bank Melli Iran"},removeTags:{amenity:"bank",brand:"بانک ملی ایران","brand:en":"Bank Melli Iran","brand:wikidata":"Q806640","brand:wikipedia":"en:Bank Melli Iran",name:"بانک ملی ایران","name:en":"Bank Melli Iran"},matchScore:2,suggestion:true},"amenity/bank/بانک پارسیان":{name:"بانک پارسیان",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2410404"},addTags:{amenity:"bank",brand:"بانک پارسیان","brand:en":"Parsian Bank","brand:wikidata":"Q2410404","brand:wikipedia":"en:Parsian Bank",name:"بانک پارسیان","name:en":"Parsian Bank"},removeTags:{amenity:"bank",brand:"بانک پارسیان","brand:en":"Parsian Bank","brand:wikidata":"Q2410404","brand:wikipedia":"en:Parsian Bank",name:"بانک پارسیان","name:en":"Parsian Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک پاسارگاد":{name:"بانک پاسارگاد",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855962"},addTags:{amenity:"bank",brand:"بانک پاسارگاد","brand:en":"Bank Pasargad","brand:wikidata":"Q4855962","brand:wikipedia":"en:Bank Pasargad",name:"بانک پاسارگاد","name:en":"Bank Pasargad"},removeTags:{amenity:"bank",brand:"بانک پاسارگاد","brand:en":"Bank Pasargad","brand:wikidata":"Q4855962","brand:wikipedia":"en:Bank Pasargad",name:"بانک پاسارگاد","name:en":"Bank Pasargad"},matchScore:2,suggestion:true},"amenity/bank/بانک کشاورزی":{name:"بانک کشاورزی",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6395007"},addTags:{amenity:"bank",brand:"بانک کشاورزی","brand:en":"Bank Keshavarzi Iran","brand:wikidata":"Q6395007","brand:wikipedia":"en:Bank Keshavarzi Iran",name:"بانک کشاورزی","name:en":"Bank Keshavarzi Iran"},removeTags:{amenity:"bank",brand:"بانک کشاورزی","brand:en":"Bank Keshavarzi Iran","brand:wikidata":"Q6395007","brand:wikipedia":"en:Bank Keshavarzi Iran",name:"بانک کشاورزی","name:en":"Bank Keshavarzi Iran"},matchScore:2,suggestion:true},"amenity/bank/پست بانک":{name:"پست بانک",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7233625"},addTags:{amenity:"bank",brand:"پست بانک","brand:en":"Post Bank of Iran","brand:wikidata":"Q7233625","brand:wikipedia":"en:Post Bank of Iran",name:"پست بانک","name:en":"Post Bank of Iran"},removeTags:{amenity:"bank",brand:"پست بانک","brand:en":"Post Bank of Iran","brand:wikidata":"Q7233625","brand:wikipedia":"en:Post Bank of Iran",name:"پست بانک","name:en":"Post Bank of Iran"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารกรุงเทพ":{name:"ธนาคารกรุงเทพ",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806483"},addTags:{amenity:"bank",brand:"ธนาคารกรุงเทพ","brand:en":"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"ธนาคารกรุงเทพ","name:en":"Bangkok Bank"},removeTags:{amenity:"bank",brand:"ธนาคารกรุงเทพ","brand:en":"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"ธนาคารกรุงเทพ","name:en":"Bangkok Bank"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารกรุงไทย":{name:"ธนาคารกรุงไทย",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q962865"},addTags:{amenity:"bank",brand:"ธนาคารกรุงไทย","brand:en":"Krung Thai Bank","brand:wikidata":"Q962865","brand:wikipedia":"en:Krung Thai Bank",name:"ธนาคารกรุงไทย","name:en":"Krung Thai Bank"},removeTags:{amenity:"bank",brand:"ธนาคารกรุงไทย","brand:en":"Krung Thai Bank","brand:wikidata":"Q962865","brand:wikipedia":"en:Krung Thai Bank",name:"ธนาคารกรุงไทย","name:en":"Krung Thai Bank"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารกสิกรไทย":{name:"ธนาคารกสิกรไทย",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q276557"},addTags:{amenity:"bank",brand:"ธนาคารกสิกรไทย","brand:en":"en:Kasikornbank","brand:wikidata":"Q276557","brand:wikipedia":"en:Kasikornbank",name:"ธนาคารกสิกรไทย","name:en":"en:Kasikornbank"},removeTags:{amenity:"bank",brand:"ธนาคารกสิกรไทย","brand:en":"en:Kasikornbank","brand:wikidata":"Q276557","brand:wikipedia":"en:Kasikornbank",name:"ธนาคารกสิกรไทย","name:en":"en:Kasikornbank"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารออมสิน":{name:"ธนาคารออมสิน",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6579041"},addTags:{amenity:"bank",brand:"ธนาคารออมสิน","brand:en":"Government Savings Bank","brand:wikidata":"Q6579041","brand:wikipedia":"en:Government Savings Bank (Thailand)",name:"ธนาคารออมสิน","name:en":"Government Savings Bank"},removeTags:{amenity:"bank",brand:"ธนาคารออมสิน","brand:en":"Government Savings Bank","brand:wikidata":"Q6579041","brand:wikipedia":"en:Government Savings Bank (Thailand)",name:"ธนาคารออมสิน","name:en":"Government Savings Bank"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารไทยพาณิชย์":{name:"ธนาคารไทยพาณิชย์",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2038986"},addTags:{amenity:"bank",brand:"ธนาคารไทยพาณิชย์","brand:en":"Siam Commercial Bank","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"ธนาคารไทยพาณิชย์","name:en":"Siam Commercial Bank"},removeTags:{amenity:"bank",brand:"ธนาคารไทยพาณิชย์","brand:en":"Siam Commercial Bank","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"ธนาคารไทยพาณิชย์","name:en":"Siam Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/みずほ銀行":{name:"みずほ銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882956"},addTags:{amenity:"bank",brand:"みずほ銀行","brand:en":"Mizuho Bank","brand:wikidata":"Q2882956","brand:wikipedia":"en:Mizuho Bank",name:"みずほ銀行","name:en":"Mizuho Bank"},removeTags:{amenity:"bank",brand:"みずほ銀行","brand:en":"Mizuho Bank","brand:wikidata":"Q2882956","brand:wikipedia":"en:Mizuho Bank",name:"みずほ銀行","name:en":"Mizuho Bank"},matchScore:2,suggestion:true},"amenity/bank/りそな銀行":{name:"りそな銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11281447"},addTags:{amenity:"bank",brand:"りそな銀行","brand:wikidata":"Q11281447","brand:wikipedia":"ja:りそな銀行",name:"りそな銀行"},removeTags:{amenity:"bank",brand:"りそな銀行","brand:wikidata":"Q11281447","brand:wikipedia":"ja:りそな銀行",name:"りそな銀行"},matchScore:2,suggestion:true},"amenity/bank/三井住友銀行":{name:"三井住友銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2660418"},addTags:{amenity:"bank",brand:"三井住友銀行","brand:en":"Sumitomo Mitsui Banking Corporation","brand:wikidata":"Q2660418","brand:wikipedia":"en:Sumitomo Mitsui Banking Corporation",name:"三井住友銀行","name:en":"Sumitomo Mitsui Banking Corporation"},removeTags:{amenity:"bank",brand:"三井住友銀行","brand:en":"Sumitomo Mitsui Banking Corporation","brand:wikidata":"Q2660418","brand:wikipedia":"en:Sumitomo Mitsui Banking Corporation",name:"三井住友銀行","name:en":"Sumitomo Mitsui Banking Corporation"},matchScore:2,suggestion:true},"amenity/bank/三菱東京UFJ銀行":{name:"三菱東京UFJ銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q988284"},addTags:{amenity:"bank",brand:"三菱東京UFJ銀行","brand:en":"MUFG Bank","brand:wikidata":"Q988284","brand:wikipedia":"en:MUFG Bank",name:"三菱東京UFJ銀行","name:en":"MUFG Bank"},removeTags:{amenity:"bank",brand:"三菱東京UFJ銀行","brand:en":"MUFG Bank","brand:wikidata":"Q988284","brand:wikipedia":"en:MUFG Bank",name:"三菱東京UFJ銀行","name:en":"MUFG Bank"},matchScore:2,suggestion:true},"amenity/bank/上海商業儲蓄銀行":{name:"上海商業儲蓄銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4207208"},addTags:{amenity:"bank",brand:"上海商業儲蓄銀行","brand:en":"Shanghai Commercial and Savings Bank","brand:wikidata":"Q4207208","brand:wikipedia":"en:Shanghai Commercial and Savings Bank",name:"上海商業儲蓄銀行","name:en":"Shanghai Commercial and Savings Bank"},removeTags:{amenity:"bank",brand:"上海商業儲蓄銀行","brand:en":"Shanghai Commercial and Savings Bank","brand:wikidata":"Q4207208","brand:wikipedia":"en:Shanghai Commercial and Savings Bank",name:"上海商業儲蓄銀行","name:en":"Shanghai Commercial and Savings Bank"},matchScore:2,suggestion:true},"amenity/bank/中信银行":{name:"中信银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q38960"},addTags:{amenity:"bank",brand:"中信银行","brand:en":"China CITIC Bank","brand:wikidata":"Q38960","brand:wikipedia":"en:China CITIC Bank",name:"中信银行"},removeTags:{amenity:"bank",brand:"中信银行","brand:en":"China CITIC Bank","brand:wikidata":"Q38960","brand:wikipedia":"en:China CITIC Bank",name:"中信银行"},matchScore:2,suggestion:true},"amenity/bank/中国农业银行":{name:"中国农业银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26298"},addTags:{amenity:"bank",brand:"中国农业银行","brand:en":"Agricultural Bank of China","brand:wikidata":"Q26298","brand:wikipedia":"en:Agricultural Bank of China",name:"中国农业银行","name:en":"Agricultural Bank of China"},removeTags:{amenity:"bank",brand:"中国农业银行","brand:en":"Agricultural Bank of China","brand:wikidata":"Q26298","brand:wikipedia":"en:Agricultural Bank of China",name:"中国农业银行","name:en":"Agricultural Bank of China"},matchScore:2,suggestion:true},"amenity/bank/中国工商银行":{name:"中国工商银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26463"},addTags:{amenity:"bank",brand:"中国工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"中国工商银行","name:en":"Industrial and Commercial Bank of China"},removeTags:{amenity:"bank",brand:"中国工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"中国工商银行","name:en":"Industrial and Commercial Bank of China"},matchScore:2,suggestion:true},"amenity/bank/中国建设银行":{name:"中国建设银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26299"},addTags:{amenity:"bank",brand:"中国建设银行","brand:en":"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"中国建设银行","name:en":"China Construction Bank"},removeTags:{amenity:"bank",brand:"中国建设银行","brand:en":"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"中国建设银行","name:en":"China Construction Bank"},matchScore:2,suggestion:true},"amenity/bank/中国邮政储蓄银行":{name:"中国邮政储蓄银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q986744"},addTags:{amenity:"bank",brand:"中国邮政储蓄银行","brand:en":"Postal Savings Bank of China","brand:wikidata":"Q986744","brand:wikipedia":"en:Postal Savings Bank of China",name:"中国邮政储蓄银行","name:en":"Postal Savings Bank of China"},removeTags:{amenity:"bank",brand:"中国邮政储蓄银行","brand:en":"Postal Savings Bank of China","brand:wikidata":"Q986744","brand:wikipedia":"en:Postal Savings Bank of China",name:"中国邮政储蓄银行","name:en":"Postal Savings Bank of China"},matchScore:2,suggestion:true},"amenity/bank/中国银行":{name:"中国银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q790068"},addTags:{amenity:"bank",brand:"中国银行","brand:en":"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"中国银行","name:en":"Bank of China"},removeTags:{amenity:"bank",brand:"中国银行","brand:en":"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"中国银行","name:en":"Bank of China"},matchScore:2,suggestion:true},"amenity/bank/中國信託商業銀行":{name:"中國信託商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5100191"},addTags:{amenity:"bank",brand:"中國信託商業銀行","brand:en":"CTBC Bank","brand:wikidata":"Q5100191","brand:wikipedia":"en:CTBC Bank",name:"中國信託商業銀行","name:en":"CTBC Bank"},removeTags:{amenity:"bank",brand:"中國信託商業銀行","brand:en":"CTBC Bank","brand:wikidata":"Q5100191","brand:wikipedia":"en:CTBC Bank",name:"中國信託商業銀行","name:en":"CTBC Bank"},matchScore:2,suggestion:true},"amenity/bank/交通银行":{name:"交通银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806680"},addTags:{amenity:"bank",brand:"交通银行","brand:en":"Bank of Communications","brand:wikidata":"Q806680","brand:wikipedia":"en:Bank of Communications",name:"交通银行","name:en":"Bank of Communications"},removeTags:{amenity:"bank",brand:"交通银行","brand:en":"Bank of Communications","brand:wikidata":"Q806680","brand:wikipedia":"en:Bank of Communications",name:"交通银行","name:en":"Bank of Communications"},matchScore:2,suggestion:true},"amenity/bank/京城商業銀行":{name:"京城商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10883132"},addTags:{amenity:"bank",brand:"京城商業銀行","brand:wikidata":"Q10883132","brand:wikipedia":"zh:京城商業銀行",name:"京城商業銀行"},removeTags:{amenity:"bank",brand:"京城商業銀行","brand:wikidata":"Q10883132","brand:wikipedia":"zh:京城商業銀行",name:"京城商業銀行"},matchScore:2,suggestion:true},"amenity/bank/京都中央信用金庫":{name:"京都中央信用金庫",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11374844"},addTags:{amenity:"bank",brand:"京都中央信用金庫","brand:en":"Kyoto Chuo Shinkin Bank","brand:wikidata":"Q11374844","brand:wikipedia":"jp:京都中央信用金庫",name:"京都中央信用金庫","name:en":"Kyoto Chuo Shinkin Bank"},removeTags:{amenity:"bank",brand:"京都中央信用金庫","brand:en":"Kyoto Chuo Shinkin Bank","brand:wikidata":"Q11374844","brand:wikipedia":"jp:京都中央信用金庫",name:"京都中央信用金庫","name:en":"Kyoto Chuo Shinkin Bank"},matchScore:2,suggestion:true},"amenity/bank/京都銀行":{name:"京都銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11375713"},addTags:{amenity:"bank",brand:"京都銀行","brand:en":"Bank of Kyoto","brand:wikidata":"Q11375713","brand:wikipedia":"en:Bank of Kyoto",name:"京都銀行","name:en":"Bank of Kyoto"},removeTags:{amenity:"bank",brand:"京都銀行","brand:en":"Bank of Kyoto","brand:wikidata":"Q11375713","brand:wikipedia":"en:Bank of Kyoto",name:"京都銀行","name:en":"Bank of Kyoto"},matchScore:2,suggestion:true},"amenity/bank/元大商業銀行":{name:"元大商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10889602"},addTags:{amenity:"bank",brand:"元大商業銀行","brand:en":"Yuanta Commercial Bank","brand:wikidata":"Q10889602","brand:wikipedia":"zh:元大商業銀行",name:"元大商業銀行","name:en":"Yuanta Commercial Bank"},removeTags:{amenity:"bank",brand:"元大商業銀行","brand:en":"Yuanta Commercial Bank","brand:wikidata":"Q10889602","brand:wikipedia":"zh:元大商業銀行",name:"元大商業銀行","name:en":"Yuanta Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/兆豐國際商業銀行":{name:"兆豐國際商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q709757"},addTags:{amenity:"bank",brand:"兆豐國際商業銀行","brand:en":"Mega International Commercial Bank","brand:wikidata":"Q709757","brand:wikipedia":"en:Mega International Commercial Bank",name:"兆豐國際商業銀行","name:en":"Mega International Commercial Bank"},removeTags:{amenity:"bank",brand:"兆豐國際商業銀行","brand:en":"Mega International Commercial Bank","brand:wikidata":"Q709757","brand:wikipedia":"en:Mega International Commercial Bank",name:"兆豐國際商業銀行","name:en":"Mega International Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/农业银行":{name:"农业银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26298"},addTags:{amenity:"bank",brand:"农业银行","brand:wikidata":"Q26298","brand:wikipedia":"zh:中国农业银行",name:"农业银行"},removeTags:{amenity:"bank",brand:"农业银行","brand:wikidata":"Q26298","brand:wikipedia":"zh:中国农业银行",name:"农业银行"},matchScore:2,suggestion:true},"amenity/bank/北洋銀行":{name:"北洋銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11402354"},addTags:{amenity:"bank",brand:"北洋銀行","brand:en":"North Pacific Bank","brand:wikidata":"Q11402354","brand:wikipedia":"ja:北洋銀行",name:"北洋銀行","name:en":"North Pacific Bank"},removeTags:{amenity:"bank",brand:"北洋銀行","brand:en":"North Pacific Bank","brand:wikidata":"Q11402354","brand:wikipedia":"ja:北洋銀行",name:"北洋銀行","name:en":"North Pacific Bank"},matchScore:2,suggestion:true},"amenity/bank/北海道銀行":{name:"北海道銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5878076"},addTags:{amenity:"bank",brand:"北海道銀行","brand:en":"Hokkaido Bank","brand:wikidata":"Q5878076","brand:wikipedia":"en:Hokkaido Bank",name:"北海道銀行","name:en":"Hokkaido Bank"},removeTags:{amenity:"bank",brand:"北海道銀行","brand:en":"Hokkaido Bank","brand:wikidata":"Q5878076","brand:wikipedia":"en:Hokkaido Bank",name:"北海道銀行","name:en":"Hokkaido Bank"},matchScore:2,suggestion:true},"amenity/bank/台中商業銀行":{name:"台中商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6136958"},addTags:{amenity:"bank",brand:"台中商業銀行","brand:en":"Taichung Bank","brand:wikidata":"Q6136958","brand:wikipedia":"en:Taichung Bank",name:"台中商業銀行","name:en":"Taichung Bank"},removeTags:{amenity:"bank",brand:"台中商業銀行","brand:en":"Taichung Bank","brand:wikidata":"Q6136958","brand:wikipedia":"en:Taichung Bank",name:"台中商業銀行","name:en":"Taichung Bank"},matchScore:2,suggestion:true},"amenity/bank/台北富邦商業銀行":{name:"台北富邦商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q697293"},addTags:{amenity:"bank",brand:"台北富邦商業銀行","brand:en":"Taipei Fubon Bank","brand:wikidata":"Q697293","brand:wikipedia":"en:Taipei Fubon Bank",name:"台北富邦商業銀行","name:en":"Taipei Fubon Bank"},removeTags:{amenity:"bank",brand:"台北富邦商業銀行","brand:en":"Taipei Fubon Bank","brand:wikidata":"Q697293","brand:wikipedia":"en:Taipei Fubon Bank",name:"台北富邦商業銀行","name:en":"Taipei Fubon Bank"},matchScore:2,suggestion:true},"amenity/bank/台新國際商業銀行":{name:"台新國際商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7676420"},addTags:{amenity:"bank",brand:"台新國際商業銀行","brand:en":"Taishin International Bank","brand:wikidata":"Q7676420","brand:wikipedia":"en:Taishin International Bank",name:"台新國際商業銀行","name:en":"Taishin International Bank"},removeTags:{amenity:"bank",brand:"台新國際商業銀行","brand:en":"Taishin International Bank","brand:wikidata":"Q7676420","brand:wikipedia":"en:Taishin International Bank",name:"台新國際商業銀行","name:en":"Taishin International Bank"},matchScore:2,suggestion:true},"amenity/bank/合作金庫商業銀行":{name:"合作金庫商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q701540"},addTags:{amenity:"bank",brand:"合作金庫商業銀行","brand:en":"Taiwan Cooperative Bank","brand:wikidata":"Q701540","brand:wikipedia":"en:Taiwan Cooperative Bank",name:"合作金庫商業銀行","name:en":"Taiwan Cooperative Bank"},removeTags:{amenity:"bank",brand:"合作金庫商業銀行","brand:en":"Taiwan Cooperative Bank","brand:wikidata":"Q701540","brand:wikipedia":"en:Taiwan Cooperative Bank",name:"合作金庫商業銀行","name:en":"Taiwan Cooperative Bank"},matchScore:2,suggestion:true},"amenity/bank/國泰世華商業銀行":{name:"國泰世華商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q702656"},addTags:{amenity:"bank",brand:"國泰世華商業銀行","brand:en":"Cathay United Bank","brand:wikidata":"Q702656","brand:wikipedia":"en:Cathay United Bank",name:"國泰世華商業銀行","name:en":"Cathay United Bank"},removeTags:{amenity:"bank",brand:"國泰世華商業銀行","brand:en":"Cathay United Bank","brand:wikidata":"Q702656","brand:wikipedia":"en:Cathay United Bank",name:"國泰世華商業銀行","name:en":"Cathay United Bank"},matchScore:2,suggestion:true},"amenity/bank/大眾商業銀行":{name:"大眾商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10937047"},addTags:{amenity:"bank",brand:"大眾商業銀行","brand:en":"Ta Chong Commercial Bank","brand:wikidata":"Q10937047","brand:wikipedia":"zh:大眾商業銀行",name:"大眾商業銀行","name:en":"Ta Chong Commercial Bank"},removeTags:{amenity:"bank",brand:"大眾商業銀行","brand:en":"Ta Chong Commercial Bank","brand:wikidata":"Q10937047","brand:wikipedia":"zh:大眾商業銀行",name:"大眾商業銀行","name:en":"Ta Chong Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/安泰商業銀行":{name:"安泰商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10946952"},addTags:{amenity:"bank",brand:"安泰商業銀行","brand:en":"Entie Commercial Bank","brand:wikidata":"Q10946952","brand:wikipedia":"zh:安泰商業銀行",name:"安泰商業銀行","name:en":"Entie Commercial Bank"},removeTags:{amenity:"bank",brand:"安泰商業銀行","brand:en":"Entie Commercial Bank","brand:wikidata":"Q10946952","brand:wikipedia":"zh:安泰商業銀行",name:"安泰商業銀行","name:en":"Entie Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/工商银行":{name:"工商银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26463"},addTags:{amenity:"bank",brand:"工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"工商银行","name:en":"Industrial and Commercial Bank of China"},removeTags:{amenity:"bank",brand:"工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"工商银行","name:en":"Industrial and Commercial Bank of China"},matchScore:2,suggestion:true},"amenity/bank/建设银行":{name:"建设银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26299"},addTags:{amenity:"bank",brand:"建设银行","brand:wikidata":"Q26299","brand:wikipedia":"zh:中国建设银行",name:"建设银行"},removeTags:{amenity:"bank",brand:"建设银行","brand:wikidata":"Q26299","brand:wikipedia":"zh:中国建设银行",name:"建设银行"},matchScore:2,suggestion:true},"amenity/bank/彰化商業銀行":{name:"彰化商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5071627"},addTags:{amenity:"bank",brand:"彰化商業銀行","brand:en":"Chang Hwa Bank","brand:wikidata":"Q5071627","brand:wikipedia":"en:Chang Hwa Bank",name:"彰化商業銀行","name:en":"Chang Hwa Bank"},removeTags:{amenity:"bank",brand:"彰化商業銀行","brand:en":"Chang Hwa Bank","brand:wikidata":"Q5071627","brand:wikipedia":"en:Chang Hwa Bank",name:"彰化商業銀行","name:en":"Chang Hwa Bank"},matchScore:2,suggestion:true},"amenity/bank/招商银行":{name:"招商银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1073327"},addTags:{amenity:"bank",brand:"招商银行","brand:en":"China Merchants Bank","brand:wikidata":"Q1073327","brand:wikipedia":"en:China Merchants Bank",name:"招商银行","name:en":"China Merchants Bank"},removeTags:{amenity:"bank",brand:"招商银行","brand:en":"China Merchants Bank","brand:wikidata":"Q1073327","brand:wikipedia":"en:China Merchants Bank",name:"招商银行","name:en":"China Merchants Bank"},matchScore:2,suggestion:true},"amenity/bank/板信商業銀行":{name:"板信商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11104946"},addTags:{amenity:"bank",brand:"板信商業銀行","brand:en":"Bank of Panshin","brand:wikidata":"Q11104946","brand:wikipedia":"zh:板信商業銀行",name:"板信商業銀行","name:en":"Bank of Panshin"},removeTags:{amenity:"bank",brand:"板信商業銀行","brand:en":"Bank of Panshin","brand:wikidata":"Q11104946","brand:wikipedia":"zh:板信商業銀行",name:"板信商業銀行","name:en":"Bank of Panshin"},matchScore:2,suggestion:true},"amenity/bank/横浜銀行":{name:"横浜銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2744340"},addTags:{amenity:"bank",brand:"横浜銀行","brand:en":"Bank of Yokohama","brand:wikidata":"Q2744340","brand:wikipedia":"en:Bank of Yokohama",name:"横浜銀行","name:en":"Bank of Yokohama"},removeTags:{amenity:"bank",brand:"横浜銀行","brand:en":"Bank of Yokohama","brand:wikidata":"Q2744340","brand:wikipedia":"en:Bank of Yokohama",name:"横浜銀行","name:en":"Bank of Yokohama"},matchScore:2,suggestion:true},"amenity/bank/永豐商業銀行":{name:"永豐商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855976"},addTags:{amenity:"bank",brand:"永豐商業銀行","brand:en":"Bank SinoPac","brand:wikidata":"Q4855976","brand:wikipedia":"en:Bank SinoPac",name:"永豐商業銀行","name:en":"Bank SinoPac"},removeTags:{amenity:"bank",brand:"永豐商業銀行","brand:en":"Bank SinoPac","brand:wikidata":"Q4855976","brand:wikipedia":"en:Bank SinoPac",name:"永豐商業銀行","name:en":"Bank SinoPac"},matchScore:2,suggestion:true},"amenity/bank/玉山商業銀行":{name:"玉山商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5321663"},addTags:{amenity:"bank",brand:"玉山商業銀行","brand:en":"E.SUN Commercial Bank","brand:wikidata":"Q5321663","brand:wikipedia":"en:E.SUN Commercial Bank",name:"玉山商業銀行","name:en":"E.SUN Commercial Bank"},removeTags:{amenity:"bank",brand:"玉山商業銀行","brand:en":"E.SUN Commercial Bank","brand:wikidata":"Q5321663","brand:wikipedia":"en:E.SUN Commercial Bank",name:"玉山商業銀行","name:en":"E.SUN Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/第一商業銀行":{name:"第一商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11602128"},addTags:{amenity:"bank",brand:"第一商業銀行","brand:en":"First Commercial Bank","brand:wikidata":"Q11602128","brand:wikipedia":"zh:第一商業銀行",name:"第一商業銀行","name:en":"First Commercial Bank"},removeTags:{amenity:"bank",brand:"第一商業銀行","brand:en":"First Commercial Bank","brand:wikidata":"Q11602128","brand:wikipedia":"zh:第一商業銀行",name:"第一商業銀行","name:en":"First Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/聯邦商業銀行":{name:"聯邦商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15927195"},addTags:{amenity:"bank",brand:"聯邦商業銀行","brand:en":"Union Bank of Taiwan","brand:wikidata":"Q15927195","brand:wikipedia":"zh:聯邦商業銀行",name:"聯邦商業銀行","name:en":"Union Bank of Taiwan"},removeTags:{amenity:"bank",brand:"聯邦商業銀行","brand:en":"Union Bank of Taiwan","brand:wikidata":"Q15927195","brand:wikipedia":"zh:聯邦商業銀行",name:"聯邦商業銀行","name:en":"Union Bank of Taiwan"},matchScore:2,suggestion:true},"amenity/bank/臺灣中小企業銀行":{name:"臺灣中小企業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15913812"},addTags:{amenity:"bank",brand:"臺灣中小企業銀行","brand:en":"Taiwan Business Bank","brand:wikidata":"Q15913812","brand:wikipedia":"zh:臺灣中小企業銀行",name:"臺灣中小企業銀行","name:en":"Taiwan Business Bank"},removeTags:{amenity:"bank",brand:"臺灣中小企業銀行","brand:en":"Taiwan Business Bank","brand:wikidata":"Q15913812","brand:wikipedia":"zh:臺灣中小企業銀行",name:"臺灣中小企業銀行","name:en":"Taiwan Business Bank"},matchScore:2,suggestion:true},"amenity/bank/臺灣土地銀行":{name:"臺灣土地銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q717592"},addTags:{amenity:"bank",brand:"臺灣土地銀行","brand:en":"Land Bank of Taiwan","brand:wikidata":"Q717592","brand:wikipedia":"en:Land Bank of Taiwan",name:"臺灣土地銀行","name:en":"Land Bank of Taiwan"},removeTags:{amenity:"bank",brand:"臺灣土地銀行","brand:en":"Land Bank of Taiwan","brand:wikidata":"Q717592","brand:wikipedia":"en:Land Bank of Taiwan",name:"臺灣土地銀行","name:en":"Land Bank of Taiwan"},matchScore:2,suggestion:true},"amenity/bank/臺灣新光商業銀行":{name:"臺灣新光商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15909616"},addTags:{amenity:"bank",brand:"臺灣新光商業銀行","brand:en":"Shin Kong Commercial Bank","brand:wikidata":"Q15909616","brand:wikipedia":"zh:臺灣新光商業銀行",name:"臺灣新光商業銀行","name:en":"Shin Kong Commercial Bank"},removeTags:{amenity:"bank",brand:"臺灣新光商業銀行","brand:en":"Shin Kong Commercial Bank","brand:wikidata":"Q15909616","brand:wikipedia":"zh:臺灣新光商業銀行",name:"臺灣新光商業銀行","name:en":"Shin Kong Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/臺灣銀行":{name:"臺灣銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q706533"},addTags:{amenity:"bank",brand:"臺灣銀行","brand:en":"Bank of Taiwan","brand:wikidata":"Q706533","brand:wikipedia":"en:Bank of Taiwan",name:"臺灣銀行","name:en":"Bank of Taiwan"},removeTags:{amenity:"bank",brand:"臺灣銀行","brand:en":"Bank of Taiwan","brand:wikidata":"Q706533","brand:wikipedia":"en:Bank of Taiwan",name:"臺灣銀行","name:en":"Bank of Taiwan"},matchScore:2,suggestion:true},"amenity/bank/華南商業銀行":{name:"華南商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11620043"},addTags:{amenity:"bank",brand:"華南商業銀行","brand:en":"Hua Nan Commercial Bank","brand:wikidata":"Q11620043","brand:wikipedia":"zh:華南商業銀行",name:"華南商業銀行","name:en":"Hua Nan Commercial Bank"},removeTags:{amenity:"bank",brand:"華南商業銀行","brand:en":"Hua Nan Commercial Bank","brand:wikidata":"Q11620043","brand:wikipedia":"zh:華南商業銀行",name:"華南商業銀行","name:en":"Hua Nan Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/遠東國際商業銀行":{name:"遠東國際商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15911143"},addTags:{amenity:"bank",brand:"遠東國際商業銀行","brand:en":"Far Eastern International Bank","brand:wikidata":"Q15911143","brand:wikipedia":"zh:遠東國際商業銀行",name:"遠東國際商業銀行","name:en":"Far Eastern International Bank"},removeTags:{amenity:"bank",brand:"遠東國際商業銀行","brand:en":"Far Eastern International Bank","brand:wikidata":"Q15911143","brand:wikipedia":"zh:遠東國際商業銀行",name:"遠東國際商業銀行","name:en":"Far Eastern International Bank"},matchScore:2,suggestion:true},"amenity/bank/陽信商業銀行":{name:"陽信商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11658759"},addTags:{amenity:"bank",brand:"陽信商業銀行","brand:en":"Sunny Commercial Bank","brand:wikidata":"Q11658759","brand:wikipedia":"zh:陽信商業銀行",name:"陽信商業銀行","name:en":"Sunny Commercial Bank"},removeTags:{amenity:"bank",brand:"陽信商業銀行","brand:en":"Sunny Commercial Bank","brand:wikidata":"Q11658759","brand:wikipedia":"zh:陽信商業銀行",name:"陽信商業銀行","name:en":"Sunny Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/静岡銀行":{name:"静岡銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7499501"},addTags:{amenity:"bank",brand:"静岡銀行","brand:en":"Shizuoka Bank","brand:wikidata":"Q7499501","brand:wikipedia":"en:Shizuoka Bank",name:"静岡銀行","name:en":"Shizuoka Bank"},removeTags:{amenity:"bank",brand:"静岡銀行","brand:en":"Shizuoka Bank","brand:wikidata":"Q7499501","brand:wikipedia":"en:Shizuoka Bank",name:"静岡銀行","name:en":"Shizuoka Bank"},matchScore:2,suggestion:true},"amenity/bank/국민은행":{name:"국민은행",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q496606"},addTags:{amenity:"bank",brand:"국민은행","brand:en":"KB Kookmin Bank","brand:wikidata":"Q496606","brand:wikipedia":"en:KB Kookmin Bank",name:"국민은행","name:en":"KB Kookmin Bank"},removeTags:{amenity:"bank",brand:"국민은행","brand:en":"KB Kookmin Bank","brand:wikidata":"Q496606","brand:wikipedia":"en:KB Kookmin Bank",name:"국민은행","name:en":"KB Kookmin Bank"},matchScore:2,suggestion:true},"amenity/bank/기업은행":{name:"기업은행",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q483855"},addTags:{amenity:"bank",brand:"기업은행","brand:en":"Industrial Bank of Korea","brand:wikidata":"Q483855","brand:wikipedia":"en:Industrial Bank of Korea",name:"기업은행","name:en":"Industrial Bank of Korea"},removeTags:{amenity:"bank",brand:"기업은행","brand:en":"Industrial Bank of Korea","brand:wikidata":"Q483855","brand:wikipedia":"en:Industrial Bank of Korea",name:"기업은행","name:en":"Industrial Bank of Korea"},matchScore:2,suggestion:true},"amenity/bank/신한은행":{name:"신한은행",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q487230"},addTags:{amenity:"bank",brand:"신한은행","brand:en":"Sinhan Bank","brand:wikidata":"Q487230","brand:wikipedia":"en:Shinhan Bank",name:"신한은행","name:en":"Sinhan Bank"},removeTags:{amenity:"bank",brand:"신한은행","brand:en":"Sinhan Bank","brand:wikidata":"Q487230","brand:wikipedia":"en:Shinhan Bank",name:"신한은행","name:en":"Sinhan Bank"},matchScore:2,suggestion:true},"amenity/bank/우리은행":{name:"우리은행",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q494369"},addTags:{amenity:"bank",brand:"우리은행","brand:en":"Woori Bank","brand:wikidata":"Q494369","brand:wikipedia":"en:Woori Bank",name:"우리은행","name:en":"Woori Bank"},removeTags:{amenity:"bank",brand:"우리은행","brand:en":"Woori Bank","brand:wikidata":"Q494369","brand:wikipedia":"en:Woori Bank",name:"우리은행","name:en":"Woori Bank"},matchScore:2,suggestion:true},"amenity/bank/하나은행":{name:"하나은행",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q484047"},addTags:{amenity:"bank",brand:"하나은행","brand:en":"Korea Exchange Bank","brand:wikidata":"Q484047","brand:wikipedia":"en:Korea Exchange Bank",name:"하나은행","name:en":"Korea Exchange Bank"},removeTags:{amenity:"bank",brand:"하나은행","brand:en":"Korea Exchange Bank","brand:wikidata":"Q484047","brand:wikipedia":"en:Korea Exchange Bank",name:"하나은행","name:en":"Korea Exchange Bank"},matchScore:2,suggestion:true},"amenity/bicycle_rental/Call a Bike":{name:"Call a Bike",icon:"maki-bicycle",geometry:["point","vertex","area"],tags:{amenity:"bicycle_rental","brand:wikidata":"Q1060525"},addTags:{amenity:"bicycle_rental",brand:"Call a Bike","brand:wikidata":"Q1060525","brand:wikipedia":"en:Call a Bike",name:"Call a Bike"},removeTags:{amenity:"bicycle_rental",brand:"Call a Bike","brand:wikidata":"Q1060525","brand:wikipedia":"en:Call a Bike",name:"Call a Bike"},matchScore:2,suggestion:true},"amenity/bureau_de_change/Travelex":{name:"Travelex",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bureau_de_change","brand:wikidata":"Q2337964"},addTags:{amenity:"bureau_de_change",brand:"Travelex","brand:wikidata":"Q2337964","brand:wikipedia":"en:Travelex",name:"Travelex"},removeTags:{amenity:"bureau_de_change",brand:"Travelex","brand:wikidata":"Q2337964","brand:wikipedia":"en:Travelex",name:"Travelex"},matchScore:2,suggestion:true},"amenity/cafe/85度C":{name:"85度C",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q4644852"},addTags:{amenity:"cafe",brand:"85度C","brand:en":"85C Bakery Cafe","brand:wikidata":"Q4644852","brand:wikipedia":"en:85C Bakery Cafe",name:"85度C","name:en":"85C Bakery Cafe"},removeTags:{amenity:"cafe",brand:"85度C","brand:en":"85C Bakery Cafe","brand:wikidata":"Q4644852","brand:wikipedia":"en:85C Bakery Cafe",name:"85度C","name:en":"85C Bakery Cafe"},matchScore:2,suggestion:true},"amenity/cafe/Barista":{name:"Barista",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q644735"},addTags:{amenity:"cafe",brand:"Barista","brand:wikidata":"Q644735","brand:wikipedia":"en:Barista (company)",name:"Barista"},removeTags:{amenity:"cafe",brand:"Barista","brand:wikidata":"Q644735","brand:wikipedia":"en:Barista (company)",name:"Barista"},matchScore:2,suggestion:true},"amenity/cafe/Cafe Coffee Day":{name:"Cafe Coffee Day",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q5017235"},addTags:{amenity:"cafe",brand:"Cafe Coffee Day","brand:wikidata":"Q5017235","brand:wikipedia":"en:Café Coffee Day",name:"Cafe Coffee Day"},removeTags:{amenity:"cafe",brand:"Cafe Coffee Day","brand:wikidata":"Q5017235","brand:wikipedia":"en:Café Coffee Day",name:"Cafe Coffee Day"},matchScore:2,suggestion:true},"amenity/cafe/Caffè Nero":{name:"Caffè Nero",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q675808"},addTags:{amenity:"cafe",brand:"Caffè Nero","brand:wikidata":"Q675808","brand:wikipedia":"en:Caffè Nero",name:"Caffè Nero"},removeTags:{amenity:"cafe",brand:"Caffè Nero","brand:wikidata":"Q675808","brand:wikipedia":"en:Caffè Nero",name:"Caffè Nero"},matchScore:2,suggestion:true},"amenity/cafe/Café Amazon":{name:"Café Amazon",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q43247503"},addTags:{amenity:"cafe",brand:"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",name:"Café Amazon"},removeTags:{amenity:"cafe",brand:"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",name:"Café Amazon"},matchScore:2,suggestion:true},"amenity/cafe/Café Martínez":{name:"Café Martínez",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q16540032"},addTags:{amenity:"cafe",brand:"Café Martínez","brand:wikidata":"Q16540032","brand:wikipedia":"es:Café Martínez",name:"Café Martínez"},removeTags:{amenity:"cafe",brand:"Café Martínez","brand:wikidata":"Q16540032","brand:wikipedia":"es:Café Martínez",name:"Café Martínez"},matchScore:2,suggestion:true},"amenity/cafe/Caribou Coffee":{name:"Caribou Coffee",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q5039494"},addTags:{amenity:"cafe",brand:"Caribou Coffee","brand:wikidata":"Q5039494","brand:wikipedia":"en:Caribou Coffee",name:"Caribou Coffee"},removeTags:{amenity:"cafe",brand:"Caribou Coffee","brand:wikidata":"Q5039494","brand:wikipedia":"en:Caribou Coffee",name:"Caribou Coffee"},matchScore:2,suggestion:true},"amenity/cafe/Chatime":{name:"Chatime",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q16829306"},addTags:{amenity:"cafe",brand:"Chatime","brand:wikidata":"Q16829306","brand:wikipedia":"en:Chatime",name:"Chatime"},removeTags:{amenity:"cafe",brand:"Chatime","brand:wikidata":"Q16829306","brand:wikipedia":"en:Chatime",name:"Chatime"},matchScore:2,suggestion:true},"amenity/cafe/Coffee Fellows":{name:"Coffee Fellows",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q23461429"},addTags:{amenity:"cafe",brand:"Coffee Fellows","brand:wikidata":"Q23461429","brand:wikipedia":"en:Coffee Fellows",name:"Coffee Fellows"},removeTags:{amenity:"cafe",brand:"Coffee Fellows","brand:wikidata":"Q23461429","brand:wikipedia":"en:Coffee Fellows",name:"Coffee Fellows"},matchScore:2,suggestion:true},"amenity/cafe/Coffee House":{name:"Coffee House",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11855430"},addTags:{amenity:"cafe",brand:"Coffee House","brand:wikidata":"Q11855430","brand:wikipedia":"fi:Coffee House",name:"Coffee House"},removeTags:{amenity:"cafe",brand:"Coffee House","brand:wikidata":"Q11855430","brand:wikipedia":"fi:Coffee House",name:"Coffee House"},matchScore:2,suggestion:true},"amenity/cafe/Coffee Island":{name:"Coffee Island",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q60867333"},addTags:{amenity:"cafe",brand:"Coffee Island","brand:wikidata":"Q60867333","brand:wikipedia":"en:Coffee Island",name:"Coffee Island"},removeTags:{amenity:"cafe",brand:"Coffee Island","brand:wikidata":"Q60867333","brand:wikipedia":"en:Coffee Island",name:"Coffee Island"},matchScore:2,suggestion:true},"amenity/cafe/Coffee Time":{name:"Coffee Time",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q5140932"},addTags:{amenity:"cafe",brand:"Coffee Time","brand:wikidata":"Q5140932","brand:wikipedia":"en:Coffee Time",name:"Coffee Time"},removeTags:{amenity:"cafe",brand:"Coffee Time","brand:wikidata":"Q5140932","brand:wikipedia":"en:Coffee Time",name:"Coffee Time"},matchScore:2,suggestion:true},"amenity/cafe/Costa":{name:"Costa",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q608845"},addTags:{amenity:"cafe",brand:"Costa","brand:wikidata":"Q608845","brand:wikipedia":"en:Costa Coffee",name:"Costa"},removeTags:{amenity:"cafe",brand:"Costa","brand:wikidata":"Q608845","brand:wikipedia":"en:Costa Coffee",name:"Costa"},matchScore:2,suggestion:true},"amenity/cafe/Country Style":{name:"Country Style",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q5177435"},addTags:{amenity:"cafe",brand:"Country Style","brand:wikidata":"Q5177435","brand:wikipedia":"en:Country Style",name:"Country Style"},removeTags:{amenity:"cafe",brand:"Country Style","brand:wikidata":"Q5177435","brand:wikipedia":"en:Country Style",name:"Country Style"},matchScore:2,suggestion:true},"amenity/cafe/Espresso House":{name:"Espresso House",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q10489162"},addTags:{amenity:"cafe",brand:"Espresso House","brand:wikidata":"Q10489162","brand:wikipedia":"en:Espresso House",name:"Espresso House"},removeTags:{amenity:"cafe",brand:"Espresso House","brand:wikidata":"Q10489162","brand:wikipedia":"en:Espresso House",name:"Espresso House"},matchScore:2,suggestion:true},"amenity/cafe/Havanna":{name:"Havanna",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2900869"},addTags:{amenity:"cafe",brand:"Havanna","brand:wikidata":"Q2900869","brand:wikipedia":"es:Havanna",name:"Havanna"},removeTags:{amenity:"cafe",brand:"Havanna","brand:wikidata":"Q2900869","brand:wikipedia":"es:Havanna",name:"Havanna"},matchScore:2,suggestion:true},"amenity/cafe/Insomnia":{name:"Insomnia",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q6038271"},addTags:{amenity:"cafe",brand:"Insomnia","brand:wikidata":"Q6038271","brand:wikipedia":"en:Insomnia Coffee Company",name:"Insomnia"},removeTags:{amenity:"cafe",brand:"Insomnia","brand:wikidata":"Q6038271","brand:wikipedia":"en:Insomnia Coffee Company",name:"Insomnia"},matchScore:2,suggestion:true},"amenity/cafe/Joe & The Juice":{name:"Joe & The Juice",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q26221514"},addTags:{amenity:"cafe",brand:"Joe & The Juice","brand:wikidata":"Q26221514","brand:wikipedia":"en:Joe & The Juice",name:"Joe & The Juice"},removeTags:{amenity:"cafe",brand:"Joe & The Juice","brand:wikidata":"Q26221514","brand:wikipedia":"en:Joe & The Juice",name:"Joe & The Juice"},matchScore:2,suggestion:true},"amenity/cafe/Le Pain Quotidien":{name:"Le Pain Quotidien",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2046903"},addTags:{amenity:"cafe",brand:"Le Pain Quotidien","brand:wikidata":"Q2046903","brand:wikipedia":"en:Le Pain Quotidien",name:"Le Pain Quotidien"},removeTags:{amenity:"cafe",brand:"Le Pain Quotidien","brand:wikidata":"Q2046903","brand:wikipedia":"en:Le Pain Quotidien",name:"Le Pain Quotidien"},matchScore:2,suggestion:true},"amenity/cafe/Mado":{name:"Mado",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q17116336"},addTags:{amenity:"cafe",brand:"Mado","brand:wikidata":"Q17116336","brand:wikipedia":"en:Mado (food company)",name:"Mado"},removeTags:{amenity:"cafe",brand:"Mado","brand:wikidata":"Q17116336","brand:wikipedia":"en:Mado (food company)",name:"Mado"},matchScore:2,suggestion:true},"amenity/cafe/McCafé":{name:"McCafé",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q3114287"},addTags:{amenity:"cafe",brand:"McCafé","brand:wikidata":"Q3114287","brand:wikipedia":"en:McCafé",cuisine:"coffee_shop",name:"McCafé"},removeTags:{amenity:"cafe",brand:"McCafé","brand:wikidata":"Q3114287","brand:wikipedia":"en:McCafé",cuisine:"coffee_shop",name:"McCafé"},matchScore:2,suggestion:true},"amenity/cafe/Patisserie Valerie":{name:"Patisserie Valerie",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q22101966"},addTags:{amenity:"cafe",brand:"Patisserie Valerie","brand:wikidata":"Q22101966","brand:wikipedia":"en:Patisserie Valerie",cuisine:"cake",name:"Patisserie Valerie"},removeTags:{amenity:"cafe",brand:"Patisserie Valerie","brand:wikidata":"Q22101966","brand:wikipedia":"en:Patisserie Valerie",cuisine:"cake",name:"Patisserie Valerie"},matchScore:2,suggestion:true},"amenity/cafe/Peet's Coffee":{name:"Peet's Coffee",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q1094101"},addTags:{amenity:"cafe",brand:"Peet's Coffee","brand:wikidata":"Q1094101","brand:wikipedia":"en:Peet's Coffee",name:"Peet's Coffee"},removeTags:{amenity:"cafe",brand:"Peet's Coffee","brand:wikidata":"Q1094101","brand:wikipedia":"en:Peet's Coffee",name:"Peet's Coffee"},matchScore:2,suggestion:true},"amenity/cafe/Pret A Manger":{name:"Pret A Manger",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2109109"},addTags:{amenity:"cafe",brand:"Pret A Manger","brand:wikidata":"Q2109109","brand:wikipedia":"en:Pret a Manger",name:"Pret A Manger"},removeTags:{amenity:"cafe",brand:"Pret A Manger","brand:wikidata":"Q2109109","brand:wikipedia":"en:Pret a Manger",name:"Pret A Manger"},matchScore:2,suggestion:true},"amenity/cafe/Pumpkin":{name:"Pumpkin",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q27825961"},addTags:{amenity:"cafe",brand:"Pumpkin","brand:wikidata":"Q27825961","brand:wikipedia":"en:Pumpkin Café Shop",name:"Pumpkin"},removeTags:{amenity:"cafe",brand:"Pumpkin","brand:wikidata":"Q27825961","brand:wikipedia":"en:Pumpkin Café Shop",name:"Pumpkin"},matchScore:2,suggestion:true},"amenity/cafe/Second Cup":{name:"Second Cup",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q862180"},addTags:{amenity:"cafe",brand:"Second Cup","brand:wikidata":"Q862180","brand:wikipedia":"en:Second Cup",name:"Second Cup"},removeTags:{amenity:"cafe",brand:"Second Cup","brand:wikidata":"Q862180","brand:wikipedia":"en:Second Cup",name:"Second Cup"},matchScore:2,suggestion:true},"amenity/cafe/Segafredo":{name:"Segafredo",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q21282762"},addTags:{amenity:"cafe",brand:"Segafredo","brand:wikidata":"Q21282762","brand:wikipedia":"it:Segafredo Zanetti",name:"Segafredo"},removeTags:{amenity:"cafe",brand:"Segafredo","brand:wikidata":"Q21282762","brand:wikipedia":"it:Segafredo Zanetti",name:"Segafredo"},matchScore:2,suggestion:true},"amenity/cafe/Starbucks":{name:"Starbucks",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Starbucks"},removeTags:{amenity:"cafe",brand:"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Starbucks"},matchScore:2,suggestion:true},"amenity/cafe/The Coffee Bean & Tea Leaf":{name:"The Coffee Bean & Tea Leaf",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q1141384"},addTags:{amenity:"cafe",brand:"The Coffee Bean & Tea Leaf","brand:wikidata":"Q1141384","brand:wikipedia":"en:The Coffee Bean & Tea Leaf",name:"The Coffee Bean & Tea Leaf"},removeTags:{amenity:"cafe",brand:"The Coffee Bean & Tea Leaf","brand:wikidata":"Q1141384","brand:wikipedia":"en:The Coffee Bean & Tea Leaf",name:"The Coffee Bean & Tea Leaf"},matchScore:2,suggestion:true},"amenity/cafe/The Coffee Club":{name:"The Coffee Club",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q7726599"},addTags:{amenity:"cafe",brand:"The Coffee Club","brand:wikidata":"Q7726599","brand:wikipedia":"en:The Coffee Club",name:"The Coffee Club"},removeTags:{amenity:"cafe",brand:"The Coffee Club","brand:wikidata":"Q7726599","brand:wikipedia":"en:The Coffee Club",name:"The Coffee Club"},matchScore:2,suggestion:true},"amenity/cafe/Tim Hortons":{name:"Tim Hortons",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q175106"},addTags:{amenity:"cafe",brand:"Tim Hortons","brand:wikidata":"Q175106","brand:wikipedia":"en:Tim Hortons",name:"Tim Hortons"},removeTags:{amenity:"cafe",brand:"Tim Hortons","brand:wikidata":"Q175106","brand:wikipedia":"en:Tim Hortons",name:"Tim Hortons"},matchScore:2,suggestion:true},"amenity/cafe/Traveler's Coffee":{name:"Traveler's Coffee",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q4051716"},addTags:{amenity:"cafe",brand:"Traveler's Coffee","brand:wikidata":"Q4051716","brand:wikipedia":"ru:Traveler’s Coffee",name:"Traveler's Coffee"},removeTags:{amenity:"cafe",brand:"Traveler's Coffee","brand:wikidata":"Q4051716","brand:wikipedia":"ru:Traveler’s Coffee",name:"Traveler's Coffee"},matchScore:2,suggestion:true},"amenity/cafe/Wayne's Coffee":{name:"Wayne's Coffee",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2637272"},addTags:{amenity:"cafe",brand:"Wayne's Coffee","brand:wikidata":"Q2637272","brand:wikipedia":"en:Wayne's Coffee",name:"Wayne's Coffee"},removeTags:{amenity:"cafe",brand:"Wayne's Coffee","brand:wikidata":"Q2637272","brand:wikipedia":"en:Wayne's Coffee",name:"Wayne's Coffee"},matchScore:2,suggestion:true},"amenity/cafe/Старбакс":{name:"Старбакс",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"Старбакс","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",name:"Старбакс","name:en":"Starbucks"},removeTags:{amenity:"cafe",brand:"Старбакс","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",name:"Старбакс","name:en":"Starbucks"},matchScore:2,suggestion:true},"amenity/cafe/Шоколадница":{name:"Шоколадница",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q30891188"},addTags:{amenity:"cafe",brand:"Шоколадница","brand:en":"Chocolate","brand:wikidata":"Q30891188","brand:wikipedia":"ru:Шоколадница (сеть кофеен)",name:"Шоколадница","name:en":"Chocolate"},removeTags:{amenity:"cafe",brand:"Шоколадница","brand:en":"Chocolate","brand:wikidata":"Q30891188","brand:wikipedia":"ru:Шоколадница (сеть кофеен)",name:"Шоколадница","name:en":"Chocolate"},matchScore:2,suggestion:true},"amenity/cafe/ארומה":{name:"ארומה",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2909872"},addTags:{amenity:"cafe",brand:"ארומה","brand:en":"Aroma Espresso Bar","brand:wikidata":"Q2909872","brand:wikipedia":"en:Aroma Espresso Bar",name:"ארומה","name:en":"Aroma Espresso Bar"},removeTags:{amenity:"cafe",brand:"ארומה","brand:en":"Aroma Espresso Bar","brand:wikidata":"Q2909872","brand:wikipedia":"en:Aroma Espresso Bar",name:"ארומה","name:en":"Aroma Espresso Bar"},matchScore:2,suggestion:true},"amenity/cafe/คาเฟ่ อเมซอน":{name:"คาเฟ่ อเมซอน",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q43247503"},addTags:{amenity:"cafe",brand:"คาเฟ่ อเมซอน","brand:en":"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",name:"คาเฟ่ อเมซอน","name:en":"Café Amazon"},removeTags:{amenity:"cafe",brand:"คาเฟ่ อเมซอน","brand:en":"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",name:"คาเฟ่ อเมซอน","name:en":"Café Amazon"},matchScore:2,suggestion:true},"amenity/cafe/エクセルシオール カフェ":{name:"エクセルシオール カフェ",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11289828"},addTags:{amenity:"cafe",brand:"エクセルシオール カフェ","brand:en":"EXCELSIOR CAFFÉ","brand:wikidata":"Q11289828","brand:wikipedia":"ja:エクセルシオール カフェ",cuisine:"coffee_shop",name:"エクセルシオール カフェ"},removeTags:{amenity:"cafe",brand:"エクセルシオール カフェ","brand:en":"EXCELSIOR CAFFÉ","brand:wikidata":"Q11289828","brand:wikipedia":"ja:エクセルシオール カフェ",cuisine:"coffee_shop",name:"エクセルシオール カフェ"},matchScore:2,suggestion:true},"amenity/cafe/カフェ・ド・クリエ":{name:"カフェ・ド・クリエ",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q17219077"},addTags:{amenity:"cafe",brand:"カフェ・ド・クリエ","brand:en":"Cafe de CRIE","brand:wikidata":"Q17219077","brand:wikipedia":"ja:ポッカクリエイト",name:"カフェ・ド・クリエ","name:en":"Cafe de CRIE"},removeTags:{amenity:"cafe",brand:"カフェ・ド・クリエ","brand:en":"Cafe de CRIE","brand:wikidata":"Q17219077","brand:wikipedia":"ja:ポッカクリエイト",name:"カフェ・ド・クリエ","name:en":"Cafe de CRIE"},matchScore:2,suggestion:true},"amenity/cafe/カフェ・ベローチェ":{name:"カフェ・ベローチェ",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11294597"},addTags:{amenity:"cafe",brand:"カフェ・ベローチェ","brand:en":"CAFFÈ VELOCE","brand:wikidata":"Q11294597","brand:wikipedia":"ja:カフェ・ベローチェ",cuisine:"coffee_shop",name:"カフェ・ベローチェ","name:en":"CAFFÈ VELOCE"},removeTags:{amenity:"cafe",brand:"カフェ・ベローチェ","brand:en":"CAFFÈ VELOCE","brand:wikidata":"Q11294597","brand:wikipedia":"ja:カフェ・ベローチェ",cuisine:"coffee_shop",name:"カフェ・ベローチェ","name:en":"CAFFÈ VELOCE"},matchScore:2,suggestion:true},"amenity/cafe/コメダ珈琲店":{name:"コメダ珈琲店",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11302679"},addTags:{amenity:"cafe",brand:"コメダ珈琲店","brand:en":"Komeda Coffee Shop","brand:wikidata":"Q11302679","brand:wikipedia":"ja:コメダ",cuisine:"coffee_shop",name:"コメダ珈琲店","name:en":"Komeda Coffee Shop"},removeTags:{amenity:"cafe",brand:"コメダ珈琲店","brand:en":"Komeda Coffee Shop","brand:wikidata":"Q11302679","brand:wikipedia":"ja:コメダ",cuisine:"coffee_shop",name:"コメダ珈琲店","name:en":"Komeda Coffee Shop"},matchScore:2,suggestion:true},"amenity/cafe/サンマルクカフェ":{name:"サンマルクカフェ",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11305989"},addTags:{amenity:"cafe",brand:"サンマルクカフェ","brand:en":"ST.MARC CAFÉ","brand:wikidata":"Q11305989","brand:wikipedia":"ja:サンマルクホールディングス",cuisine:"coffee_shop",name:"サンマルクカフェ","name:en":"ST.MARC CAFÉ"},removeTags:{amenity:"cafe",brand:"サンマルクカフェ","brand:en":"ST.MARC CAFÉ","brand:wikidata":"Q11305989","brand:wikipedia":"ja:サンマルクホールディングス",cuisine:"coffee_shop",name:"サンマルクカフェ","name:en":"ST.MARC CAFÉ"},matchScore:2,suggestion:true},"amenity/cafe/スターバックス":{name:"スターバックス",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"スターバックス","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"ja:スターバックス",cuisine:"coffee_shop",name:"スターバックス","name:en":"Starbucks"},removeTags:{amenity:"cafe",brand:"スターバックス","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"ja:スターバックス",cuisine:"coffee_shop",name:"スターバックス","name:en":"Starbucks"},matchScore:2,suggestion:true},"amenity/cafe/タリーズコーヒー":{name:"タリーズコーヒー",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q3541983"},addTags:{amenity:"cafe",brand:"タリーズコーヒー","brand:en":"Tully's Coffee","brand:wikidata":"Q3541983","brand:wikipedia":"en:Tully's Coffee",name:"タリーズコーヒー","name:en":"Tully's Coffee"},removeTags:{amenity:"cafe",brand:"タリーズコーヒー","brand:en":"Tully's Coffee","brand:wikidata":"Q3541983","brand:wikipedia":"en:Tully's Coffee",name:"タリーズコーヒー","name:en":"Tully's Coffee"},matchScore:2,suggestion:true},"amenity/cafe/ドトールコーヒーショップ":{name:"ドトールコーヒーショップ",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11322732"},addTags:{amenity:"cafe",brand:"ドトールコーヒーショップ","brand:en":"Doutor","brand:wikidata":"Q11322732","brand:wikipedia":"ja:ドトールコーヒーショップ",cuisine:"coffee_shop",name:"ドトールコーヒーショップ","name:en":"Doutor Coffee Shop"},removeTags:{amenity:"cafe",brand:"ドトールコーヒーショップ","brand:en":"Doutor","brand:wikidata":"Q11322732","brand:wikipedia":"ja:ドトールコーヒーショップ",cuisine:"coffee_shop",name:"ドトールコーヒーショップ","name:en":"Doutor Coffee Shop"},matchScore:2,suggestion:true},"amenity/cafe/星巴克":{name:"星巴克",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"星巴克","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"zh:星巴克",cuisine:"coffee_shop",name:"星巴克","name:en":"Starbucks"},removeTags:{amenity:"cafe",brand:"星巴克","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"zh:星巴克",cuisine:"coffee_shop",name:"星巴克","name:en":"Starbucks"},matchScore:2,suggestion:true},"amenity/cafe/스타벅스":{name:"스타벅스",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"스타벅스","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"ko:스타벅스",cuisine:"coffee_shop",name:"스타벅스","name:en":"Starbucks"},removeTags:{amenity:"cafe",brand:"스타벅스","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"ko:스타벅스",cuisine:"coffee_shop",name:"스타벅스","name:en":"Starbucks"},matchScore:2,suggestion:true},"amenity/car_rental/Alamo":{name:"Alamo",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1429287"},addTags:{amenity:"car_rental",brand:"Alamo","brand:wikidata":"Q1429287","brand:wikipedia":"en:Alamo Rent a Car",name:"Alamo"},removeTags:{amenity:"car_rental",brand:"Alamo","brand:wikidata":"Q1429287","brand:wikipedia":"en:Alamo Rent a Car",name:"Alamo"},matchScore:2,suggestion:true},"amenity/car_rental/Avis":{name:"Avis",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q791136"},addTags:{amenity:"car_rental",brand:"Avis","brand:wikidata":"Q791136","brand:wikipedia":"en:Avis Rent a Car",name:"Avis"},removeTags:{amenity:"car_rental",brand:"Avis","brand:wikidata":"Q791136","brand:wikipedia":"en:Avis Rent a Car",name:"Avis"},matchScore:2,suggestion:true},"amenity/car_rental/Budget":{name:"Budget",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1001437"},addTags:{amenity:"car_rental",brand:"Budget","brand:wikidata":"Q1001437","brand:wikipedia":"en:Budget Rent a Car",name:"Budget"},removeTags:{amenity:"car_rental",brand:"Budget","brand:wikidata":"Q1001437","brand:wikipedia":"en:Budget Rent a Car",name:"Budget"},matchScore:2,suggestion:true},"amenity/car_rental/Dollar":{name:"Dollar",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1235661"},addTags:{amenity:"car_rental",brand:"Dollar","brand:wikidata":"Q1235661","brand:wikipedia":"en:Dollar Rent A Car",name:"Dollar"},removeTags:{amenity:"car_rental",brand:"Dollar","brand:wikidata":"Q1235661","brand:wikipedia":"en:Dollar Rent A Car",name:"Dollar"},matchScore:2,suggestion:true},"amenity/car_rental/Enterprise":{name:"Enterprise",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q17085454"},addTags:{amenity:"car_rental",brand:"Enterprise","brand:wikidata":"Q17085454","brand:wikipedia":"en:Enterprise Rent-A-Car",name:"Enterprise"},removeTags:{amenity:"car_rental",brand:"Enterprise","brand:wikidata":"Q17085454","brand:wikipedia":"en:Enterprise Rent-A-Car",name:"Enterprise"},matchScore:2,suggestion:true},"amenity/car_rental/Europcar":{name:"Europcar",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1376256"},addTags:{amenity:"car_rental",brand:"Europcar","brand:wikidata":"Q1376256","brand:wikipedia":"en:Europcar",name:"Europcar"},removeTags:{amenity:"car_rental",brand:"Europcar","brand:wikidata":"Q1376256","brand:wikipedia":"en:Europcar",name:"Europcar"},matchScore:2,suggestion:true},"amenity/car_rental/Hertz":{name:"Hertz",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1543874"},addTags:{amenity:"car_rental",brand:"Hertz","brand:wikidata":"Q1543874","brand:wikipedia":"en:The Hertz Corporation",name:"Hertz"},removeTags:{amenity:"car_rental",brand:"Hertz","brand:wikidata":"Q1543874","brand:wikipedia":"en:The Hertz Corporation",name:"Hertz"},matchScore:2,suggestion:true},"amenity/car_rental/Localiza":{name:"Localiza",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q10319490"},addTags:{amenity:"car_rental",brand:"Localiza","brand:wikidata":"Q10319490","brand:wikipedia":"en:Localiza",name:"Localiza"},removeTags:{amenity:"car_rental",brand:"Localiza","brand:wikidata":"Q10319490","brand:wikipedia":"en:Localiza",name:"Localiza"},matchScore:2,suggestion:true},"amenity/car_rental/Sixt":{name:"Sixt",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q705664"},addTags:{amenity:"car_rental",brand:"Sixt","brand:wikidata":"Q705664","brand:wikipedia":"en:Sixt",name:"Sixt"},removeTags:{amenity:"car_rental",brand:"Sixt","brand:wikidata":"Q705664","brand:wikipedia":"en:Sixt",name:"Sixt"},matchScore:2,suggestion:true},"amenity/car_rental/Thrifty":{name:"Thrifty",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q2429546"},addTags:{amenity:"car_rental",brand:"Thrifty","brand:wikidata":"Q2429546","brand:wikipedia":"en:Thrifty Car Rental",name:"Thrifty"},removeTags:{amenity:"car_rental",brand:"Thrifty","brand:wikidata":"Q2429546","brand:wikipedia":"en:Thrifty Car Rental",name:"Thrifty"},matchScore:2,suggestion:true},"amenity/car_rental/U-Haul":{name:"U-Haul",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q7862902"},addTags:{amenity:"car_rental",brand:"U-Haul","brand:wikidata":"Q7862902","brand:wikipedia":"en:U-Haul",name:"U-Haul"},removeTags:{amenity:"car_rental",brand:"U-Haul","brand:wikidata":"Q7862902","brand:wikipedia":"en:U-Haul",name:"U-Haul"},matchScore:2,suggestion:true},"amenity/car_rental/オリックスレンタカー":{name:"オリックスレンタカー",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q11123021"},addTags:{amenity:"car_rental",brand:"オリックスレンタカー","brand:en":"ORIX Car Rental","brand:wikidata":"Q11123021","brand:wikipedia":"ja:オリックスレンタカー",name:"オリックスレンタカー","name:en":"ORIX Car Rental"},removeTags:{amenity:"car_rental",brand:"オリックスレンタカー","brand:en":"ORIX Car Rental","brand:wikidata":"Q11123021","brand:wikipedia":"ja:オリックスレンタカー",name:"オリックスレンタカー","name:en":"ORIX Car Rental"},matchScore:2,suggestion:true},"amenity/car_rental/トヨタレンタカー":{name:"トヨタレンタカー",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q11321580"},addTags:{amenity:"car_rental",brand:"トヨタレンタカー","brand:en":"Toyota Rental Car","brand:wikidata":"Q11321580","brand:wikipedia":"ja:トヨタレンタリース",name:"トヨタレンタカー","name:en":"Toyota Rental Car"},removeTags:{amenity:"car_rental",brand:"トヨタレンタカー","brand:en":"Toyota Rental Car","brand:wikidata":"Q11321580","brand:wikipedia":"ja:トヨタレンタリース",name:"トヨタレンタカー","name:en":"Toyota Rental Car"},matchScore:2,suggestion:true},"amenity/car_rental/ニッポンレンタカー":{name:"ニッポンレンタカー",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q11086533"},addTags:{amenity:"car_rental",brand:"ニッポンレンタカー","brand:en":"Nippon Car Rental","brand:wikidata":"Q11086533","brand:wikipedia":"ja:ニッポンレンタカー",name:"ニッポンレンタカー","name:en":"Nippon Car Rental"},removeTags:{amenity:"car_rental",brand:"ニッポンレンタカー","brand:en":"Nippon Car Rental","brand:wikidata":"Q11086533","brand:wikipedia":"ja:ニッポンレンタカー",name:"ニッポンレンタカー","name:en":"Nippon Car Rental"},matchScore:2,suggestion:true},"amenity/car_rental/日産レンタカー":{name:"日産レンタカー",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q11086838"},addTags:{amenity:"car_rental",brand:"日産レンタカー","brand:en":"Nissan Car Rental","brand:wikidata":"Q11086838","brand:wikipedia":"ja:日産レンタカー",name:"日産レンタカー","name:en":"Nissan Car Rental"},removeTags:{amenity:"car_rental",brand:"日産レンタカー","brand:en":"Nissan Car Rental","brand:wikidata":"Q11086838","brand:wikipedia":"ja:日産レンタカー",name:"日産レンタカー","name:en":"Nissan Car Rental"},matchScore:2,suggestion:true},"amenity/charging_station/ChargePoint":{name:"ChargePoint",icon:"fas-charging-station",geometry:["point"],tags:{amenity:"charging_station","brand:wikidata":"Q5176149"},addTags:{amenity:"charging_station",brand:"ChargePoint","brand:wikidata":"Q5176149","brand:wikipedia":"en:ChargePoint",name:"ChargePoint"},removeTags:{amenity:"charging_station",brand:"ChargePoint","brand:wikidata":"Q5176149","brand:wikipedia":"en:ChargePoint",name:"ChargePoint"},matchScore:2,suggestion:true},"amenity/charging_station/Enel - stazione di ricarica":{name:"Enel - stazione di ricarica",icon:"fas-charging-station",geometry:["point"],tags:{amenity:"charging_station","brand:wikidata":"Q651222"},addTags:{amenity:"charging_station",brand:"Enel - stazione di ricarica","brand:wikidata":"Q651222","brand:wikipedia":"en:Enel",name:"Enel - stazione di ricarica"},removeTags:{amenity:"charging_station",brand:"Enel - stazione di ricarica","brand:wikidata":"Q651222","brand:wikipedia":"en:Enel",name:"Enel - stazione di ricarica"},matchScore:2,suggestion:true},"amenity/charging_station/Tesla Supercharger":{name:"Tesla Supercharger",icon:"fas-charging-station",geometry:["point"],tags:{amenity:"charging_station","brand:wikidata":"Q17089620"},addTags:{amenity:"charging_station",brand:"Tesla Supercharger","brand:wikidata":"Q17089620","brand:wikipedia":"en:Tesla Supercharger",name:"Tesla Supercharger"},removeTags:{amenity:"charging_station",brand:"Tesla Supercharger","brand:wikidata":"Q17089620","brand:wikipedia":"en:Tesla Supercharger",name:"Tesla Supercharger"},matchScore:2,suggestion:true},"amenity/cinema/Cinema City":{name:"Cinema City",icon:"maki-cinema",geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q543651"},addTags:{amenity:"cinema",brand:"Cinema City","brand:wikidata":"Q543651","brand:wikipedia":"en:Cinema City International",name:"Cinema City"},removeTags:{amenity:"cinema",brand:"Cinema City","brand:wikidata":"Q543651","brand:wikipedia":"en:Cinema City International",name:"Cinema City"},matchScore:2,suggestion:true},"amenity/cinema/Cinemark":{name:"Cinemark",icon:"maki-cinema",geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q707530"},addTags:{amenity:"cinema",brand:"Cinemark","brand:wikidata":"Q707530","brand:wikipedia":"en:Cinemark Theatres",name:"Cinemark"},removeTags:{amenity:"cinema",brand:"Cinemark","brand:wikidata":"Q707530","brand:wikipedia":"en:Cinemark Theatres",name:"Cinemark"},matchScore:2,suggestion:true},"amenity/cinema/Cinemex":{name:"Cinemex",icon:"maki-cinema",geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q3333072"},addTags:{amenity:"cinema",brand:"Cinemex","brand:wikidata":"Q3333072","brand:wikipedia":"en:Cinemex",name:"Cinemex"},removeTags:{amenity:"cinema",brand:"Cinemex","brand:wikidata":"Q3333072","brand:wikipedia":"en:Cinemex",name:"Cinemex"},matchScore:2,suggestion:true},"amenity/cinema/Cinepolis":{name:"Cinepolis",icon:"maki-cinema",geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q5686673"},addTags:{amenity:"cinema",brand:"Cinepolis","brand:wikidata":"Q5686673","brand:wikipedia":"en:Cinépolis",name:"Cinepolis"},removeTags:{amenity:"cinema",brand:"Cinepolis","brand:wikidata":"Q5686673","brand:wikipedia":"en:Cinépolis",name:"Cinepolis"},matchScore:2,suggestion:true},"amenity/cinema/Cineworld":{name:"Cineworld",icon:"maki-cinema",geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q5120901"},addTags:{amenity:"cinema",brand:"Cineworld","brand:wikidata":"Q5120901","brand:wikipedia":"en:Cineworld",name:"Cineworld"},removeTags:{amenity:"cinema",brand:"Cineworld","brand:wikidata":"Q5120901","brand:wikipedia":"en:Cineworld",name:"Cineworld"},matchScore:2,suggestion:true},"amenity/cinema/Odeon":{name:"Odeon",icon:"maki-cinema",geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q6127470"},addTags:{amenity:"cinema",brand:"Odeon","brand:wikidata":"Q6127470","brand:wikipedia":"en:Odeon Cinemas",name:"Odeon"},removeTags:{amenity:"cinema",brand:"Odeon","brand:wikidata":"Q6127470","brand:wikipedia":"en:Odeon Cinemas",name:"Odeon"},matchScore:2,suggestion:true},"amenity/fast_food/burger/A&W (Canada)":{name:"A&W (Canada)",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q2818848"},addTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q2818848","brand:wikipedia":"en:A&W (Canada)",cuisine:"burger",name:"A&W"},removeTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q2818848","brand:wikipedia":"en:A&W (Canada)",cuisine:"burger",name:"A&W"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/A&W (USA)":{name:"A&W (USA)",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q277641"},addTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q277641","brand:wikipedia":"en:A&W Restaurants",cuisine:"burger",name:"A&W"},removeTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q277641","brand:wikipedia":"en:A&W Restaurants",cuisine:"burger",name:"A&W"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Arby's":{name:"Arby's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q630866"},addTags:{amenity:"fast_food",brand:"Arby's","brand:wikidata":"Q630866","brand:wikipedia":"en:Arby's",cuisine:"sandwich",name:"Arby's"},removeTags:{amenity:"fast_food",brand:"Arby's","brand:wikidata":"Q630866","brand:wikipedia":"en:Arby's",cuisine:"sandwich",name:"Arby's"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/Auntie Anne's":{name:"Auntie Anne's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4822010"},addTags:{amenity:"fast_food",brand:"Auntie Anne's","brand:wikidata":"Q4822010","brand:wikipedia":"en:Auntie Anne's",cuisine:"pretzel",name:"Auntie Anne's"},removeTags:{amenity:"fast_food",brand:"Auntie Anne's","brand:wikidata":"Q4822010","brand:wikipedia":"en:Auntie Anne's",cuisine:"pretzel",name:"Auntie Anne's"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Baja Fresh":{name:"Baja Fresh",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q2880019"},addTags:{amenity:"fast_food",brand:"Baja Fresh","brand:wikidata":"Q2880019","brand:wikipedia":"en:Baja Fresh",cuisine:"mexican",name:"Baja Fresh"},removeTags:{amenity:"fast_food",brand:"Baja Fresh","brand:wikidata":"Q2880019","brand:wikipedia":"en:Baja Fresh",cuisine:"mexican",name:"Baja Fresh"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Bob's":{name:"Bob's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1392113"},addTags:{amenity:"fast_food",brand:"Bob's","brand:wikidata":"Q1392113","brand:wikipedia":"en:Bob's",cuisine:"burger",name:"Bob's"},removeTags:{amenity:"fast_food",brand:"Bob's","brand:wikidata":"Q1392113","brand:wikipedia":"en:Bob's",cuisine:"burger",name:"Bob's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Bojangles'":{name:"Bojangles'",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q891163"},addTags:{amenity:"fast_food",brand:"Bojangles'","brand:wikidata":"Q891163","brand:wikipedia":"en:Bojangles' Famous Chicken 'n Biscuits",cuisine:"chicken",name:"Bojangles'"},removeTags:{amenity:"fast_food",brand:"Bojangles'","brand:wikidata":"Q891163","brand:wikipedia":"en:Bojangles' Famous Chicken 'n Biscuits",cuisine:"chicken",name:"Bojangles'"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/Booster Juice":{name:"Booster Juice",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4943796"},addTags:{amenity:"fast_food",brand:"Booster Juice","brand:wikidata":"Q4943796","brand:wikipedia":"en:Booster Juice",cuisine:"juice",name:"Booster Juice"},removeTags:{amenity:"fast_food",brand:"Booster Juice","brand:wikidata":"Q4943796","brand:wikipedia":"en:Booster Juice",cuisine:"juice",name:"Booster Juice"},matchScore:2,suggestion:true},"amenity/fast_food/Boston Market":{name:"Boston Market",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q603617"},addTags:{amenity:"fast_food",brand:"Boston Market","brand:wikidata":"Q603617","brand:wikipedia":"en:Boston Market",cuisine:"american",name:"Boston Market"},removeTags:{amenity:"fast_food",brand:"Boston Market","brand:wikidata":"Q603617","brand:wikipedia":"en:Boston Market",cuisine:"american",name:"Boston Market"},matchScore:2,suggestion:true},"amenity/fast_food/Braum's":{name:"Braum's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4958263"},addTags:{amenity:"fast_food",brand:"Braum's","brand:wikidata":"Q4958263","brand:wikipedia":"en:Braum's",cuisine:"american",name:"Braum's"},removeTags:{amenity:"fast_food",brand:"Braum's","brand:wikidata":"Q4958263","brand:wikipedia":"en:Braum's",cuisine:"american",name:"Braum's"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Burger King":{name:"Burger King",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q177054"},addTags:{amenity:"fast_food",brand:"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Burger King"},removeTags:{amenity:"fast_food",brand:"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Burger King"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Burger Machine":{name:"Burger Machine",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q4998549"},addTags:{amenity:"fast_food",brand:"Burger Machine","brand:wikidata":"Q4998549","brand:wikipedia":"en:Burger Machine",cuisine:"burger",name:"Burger Machine"},removeTags:{amenity:"fast_food",brand:"Burger Machine","brand:wikidata":"Q4998549","brand:wikipedia":"en:Burger Machine",cuisine:"burger",name:"Burger Machine"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/BurgerFi":{name:"BurgerFi",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q39045496"},addTags:{amenity:"fast_food",brand:"BurgerFi","brand:wikidata":"Q39045496","brand:wikipedia":"en:BurgerFi",cuisine:"burger",name:"BurgerFi"},removeTags:{amenity:"fast_food",brand:"BurgerFi","brand:wikidata":"Q39045496","brand:wikipedia":"en:BurgerFi",cuisine:"burger",name:"BurgerFi"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Captain D's":{name:"Captain D's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5036616"},addTags:{amenity:"fast_food",brand:"Captain D's","brand:wikidata":"Q5036616","brand:wikipedia":"en:Captain D's",cuisine:"seafood",name:"Captain D's"},removeTags:{amenity:"fast_food",brand:"Captain D's","brand:wikidata":"Q5036616","brand:wikipedia":"en:Captain D's",cuisine:"seafood",name:"Captain D's"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Carl's Jr.":{name:"Carl's Jr.",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1043486"},addTags:{amenity:"fast_food",brand:"Carl's Jr.","brand:wikidata":"Q1043486","brand:wikipedia":"en:Carl's Jr.",cuisine:"burger",name:"Carl's Jr."},removeTags:{amenity:"fast_food",brand:"Carl's Jr.","brand:wikidata":"Q1043486","brand:wikipedia":"en:Carl's Jr.",cuisine:"burger",name:"Carl's Jr."},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Checkers":{name:"Checkers",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q3419341"},addTags:{amenity:"fast_food",brand:"Checkers","brand:wikidata":"Q3419341","brand:wikipedia":"en:Checkers and Rally's",cuisine:"burger",name:"Checkers"},removeTags:{amenity:"fast_food",brand:"Checkers","brand:wikidata":"Q3419341","brand:wikipedia":"en:Checkers and Rally's",cuisine:"burger",name:"Checkers"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Chick-fil-A":{name:"Chick-fil-A",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q491516"},addTags:{amenity:"fast_food",brand:"Chick-fil-A","brand:wikidata":"Q491516","brand:wikipedia":"en:Chick-fil-A",cuisine:"chicken",name:"Chick-fil-A"},removeTags:{amenity:"fast_food",brand:"Chick-fil-A","brand:wikidata":"Q491516","brand:wikipedia":"en:Chick-fil-A",cuisine:"chicken",name:"Chick-fil-A"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Chicken Express":{name:"Chicken Express",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q5096235"},addTags:{amenity:"fast_food",brand:"Chicken Express","brand:wikidata":"Q5096235","brand:wikipedia":"en:Chicken Express",cuisine:"chicken",name:"Chicken Express"},removeTags:{amenity:"fast_food",brand:"Chicken Express","brand:wikidata":"Q5096235","brand:wikipedia":"en:Chicken Express",cuisine:"chicken",name:"Chicken Express"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Chipotle":{name:"Chipotle",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q465751"},addTags:{amenity:"fast_food",brand:"Chipotle","brand:wikidata":"Q465751","brand:wikipedia":"en:Chipotle Mexican Grill",cuisine:"mexican",name:"Chipotle"},removeTags:{amenity:"fast_food",brand:"Chipotle","brand:wikidata":"Q465751","brand:wikipedia":"en:Chipotle Mexican Grill",cuisine:"mexican",name:"Chipotle"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/Chowking":{name:"Chowking",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1076816"},addTags:{amenity:"fast_food",brand:"Chowking","brand:wikidata":"Q1076816","brand:wikipedia":"en:Chowking",cuisine:"asian",name:"Chowking"},removeTags:{amenity:"fast_food",brand:"Chowking","brand:wikidata":"Q1076816","brand:wikipedia":"en:Chowking",cuisine:"asian",name:"Chowking"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Church's Chicken":{name:"Church's Chicken",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q1089932"},addTags:{amenity:"fast_food",brand:"Church's Chicken","brand:wikidata":"Q1089932","brand:wikipedia":"en:Church's Chicken",cuisine:"chicken",name:"Church's Chicken"},removeTags:{amenity:"fast_food",brand:"Church's Chicken","brand:wikidata":"Q1089932","brand:wikipedia":"en:Church's Chicken",cuisine:"chicken",name:"Church's Chicken"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/Cinnabon":{name:"Cinnabon",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1092539"},addTags:{brand:"Cinnabon","brand:website":"https://www.cinnabon.com/","brand:wikidata":"Q1092539","brand:wikipedia":"en:Cinnabon",name:"Cinnabon",amenity:"fast_food",cuisine:"dessert"},removeTags:{brand:"Cinnabon","brand:website":"https://www.cinnabon.com/","brand:wikidata":"Q1092539","brand:wikipedia":"en:Cinnabon",name:"Cinnabon",amenity:"fast_food",cuisine:"dessert"},matchScore:2,suggestion:true},"amenity/fast_food/CoCo壱番屋":{name:"CoCo壱番屋",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5986105"},addTags:{amenity:"fast_food",brand:"CoCo壱番屋","brand:en":"Ichibanya","brand:wikidata":"Q5986105","brand:wikipedia":"en:Ichibanya",cuisine:"japanese",name:"CoCo壱番屋","name:en":"Ichibanya"},removeTags:{amenity:"fast_food",brand:"CoCo壱番屋","brand:en":"Ichibanya","brand:wikidata":"Q5986105","brand:wikipedia":"en:Ichibanya",cuisine:"japanese",name:"CoCo壱番屋","name:en":"Ichibanya"},matchScore:2,suggestion:true},"amenity/fast_food/Cook Out":{name:"Cook Out",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5166992"},addTags:{amenity:"fast_food",brand:"Cook Out","brand:wikidata":"Q5166992","brand:wikipedia":"en:Cook Out (restaurant)",cuisine:"american",name:"Cook Out"},removeTags:{amenity:"fast_food",brand:"Cook Out","brand:wikidata":"Q5166992","brand:wikipedia":"en:Cook Out (restaurant)",cuisine:"american",name:"Cook Out"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Culver's":{name:"Culver's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1143589"},addTags:{amenity:"fast_food",brand:"Culver's","brand:wikidata":"Q1143589","brand:wikipedia":"en:Culver's",cuisine:"burger",name:"Culver's"},removeTags:{amenity:"fast_food",brand:"Culver's","brand:wikidata":"Q1143589","brand:wikipedia":"en:Culver's",cuisine:"burger",name:"Culver's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/DQ Grill & Chill":{name:"DQ Grill & Chill",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1141226"},addTags:{amenity:"fast_food",brand:"DQ Grill & Chill","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"burger",name:"DQ Grill & Chill",operator:"Dairy Queen"},removeTags:{amenity:"fast_food",brand:"DQ Grill & Chill","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"burger",name:"DQ Grill & Chill",operator:"Dairy Queen"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Dairy Queen":{name:"Dairy Queen",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1141226"},addTags:{amenity:"fast_food",brand:"Dairy Queen","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream",name:"Dairy Queen"},removeTags:{amenity:"fast_food",brand:"Dairy Queen","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream",name:"Dairy Queen"},matchScore:2,suggestion:true},"amenity/fast_food/Daylight Donuts":{name:"Daylight Donuts",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q48970508"},addTags:{amenity:"fast_food",brand:"Daylight Donuts","brand:wikidata":"Q48970508","brand:wikipedia":"en:Daylight Donuts",cuisine:"donut",name:"Daylight Donuts"},removeTags:{amenity:"fast_food",brand:"Daylight Donuts","brand:wikidata":"Q48970508","brand:wikipedia":"en:Daylight Donuts",cuisine:"donut",name:"Daylight Donuts"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Del Taco":{name:"Del Taco",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q1183818"},addTags:{amenity:"fast_food",brand:"Del Taco","brand:wikidata":"Q1183818","brand:wikipedia":"en:Del Taco",cuisine:"mexican",name:"Del Taco"},removeTags:{amenity:"fast_food",brand:"Del Taco","brand:wikidata":"Q1183818","brand:wikipedia":"en:Del Taco",cuisine:"mexican",name:"Del Taco"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Domino's Pizza":{name:"Domino's Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q839466"},addTags:{amenity:"fast_food",brand:"Domino's Pizza","brand:wikidata":"Q839466","brand:wikipedia":"en:Domino's Pizza",cuisine:"pizza",name:"Domino's Pizza"},removeTags:{amenity:"fast_food",brand:"Domino's Pizza","brand:wikidata":"Q839466","brand:wikipedia":"en:Domino's Pizza",cuisine:"pizza",name:"Domino's Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Dunkin' Donuts":{name:"Dunkin' Donuts",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q847743"},addTags:{amenity:"fast_food",brand:"Dunkin' Donuts","brand:wikidata":"Q847743","brand:wikipedia":"en:Dunkin' Donuts",cuisine:"donut",name:"Dunkin' Donuts"},removeTags:{amenity:"fast_food",brand:"Dunkin' Donuts","brand:wikidata":"Q847743","brand:wikipedia":"en:Dunkin' Donuts",cuisine:"donut",name:"Dunkin' Donuts"},matchScore:2,suggestion:true},"amenity/fast_food/Einstein Bros. Bagels":{name:"Einstein Bros. Bagels",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5349788"},addTags:{amenity:"fast_food",brand:"Einstein Bros. Bagels","brand:wikidata":"Q5349788","brand:wikipedia":"en:Einstein Bros. Bagels",cuisine:"bagel",name:"Einstein Bros. Bagels"},removeTags:{amenity:"fast_food",brand:"Einstein Bros. Bagels","brand:wikidata":"Q5349788","brand:wikipedia":"en:Einstein Bros. Bagels",cuisine:"bagel",name:"Einstein Bros. Bagels"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/El Pollo Loco":{name:"El Pollo Loco",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q2353849"},addTags:{amenity:"fast_food",brand:"El Pollo Loco","brand:wikidata":"Q2353849","brand:wikipedia":"en:El Pollo Loco",cuisine:"mexican",name:"El Pollo Loco"},removeTags:{amenity:"fast_food",brand:"El Pollo Loco","brand:wikidata":"Q2353849","brand:wikipedia":"en:El Pollo Loco",cuisine:"mexican",name:"El Pollo Loco"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/Extreme Pita":{name:"Extreme Pita",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5422367"},addTags:{amenity:"fast_food",brand:"Extreme Pita","brand:wikidata":"Q5422367","brand:wikipedia":"en:Extreme Pita",cuisine:"pita",name:"Extreme Pita"},removeTags:{amenity:"fast_food",brand:"Extreme Pita","brand:wikidata":"Q5422367","brand:wikipedia":"en:Extreme Pita",cuisine:"pita",name:"Extreme Pita"},matchScore:2,suggestion:true},"amenity/fast_food/Fazoli's":{name:"Fazoli's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1399195"},addTags:{amenity:"fast_food",brand:"Fazoli's","brand:wikidata":"Q1399195","brand:wikipedia":"en:Fazoli's",cuisine:"italian",name:"Fazoli's"},removeTags:{amenity:"fast_food",brand:"Fazoli's","brand:wikidata":"Q1399195","brand:wikipedia":"en:Fazoli's",cuisine:"italian",name:"Fazoli's"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Firehouse Subs":{name:"Firehouse Subs",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q5451873"},addTags:{amenity:"fast_food",brand:"Firehouse Subs","brand:wikidata":"Q5451873","brand:wikipedia":"en:Firehouse Subs",cuisine:"sandwich",name:"Firehouse Subs"},removeTags:{amenity:"fast_food",brand:"Firehouse Subs","brand:wikidata":"Q5451873","brand:wikipedia":"en:Firehouse Subs",cuisine:"sandwich",name:"Firehouse Subs"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Five Guys":{name:"Five Guys",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1131810"},addTags:{amenity:"fast_food",brand:"Five Guys","brand:wikidata":"Q1131810","brand:wikipedia":"en:Five Guys",cuisine:"burger",name:"Five Guys"},removeTags:{amenity:"fast_food",brand:"Five Guys","brand:wikidata":"Q1131810","brand:wikipedia":"en:Five Guys",cuisine:"burger",name:"Five Guys"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Freddy's":{name:"Freddy's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q5496837"},addTags:{amenity:"fast_food",brand:"Freddy's","brand:wikidata":"Q5496837","brand:wikipedia":"en:Freddy's Frozen Custard & Steakburgers",cuisine:"burger",name:"Freddy's"},removeTags:{amenity:"fast_food",brand:"Freddy's","brand:wikidata":"Q5496837","brand:wikipedia":"en:Freddy's Frozen Custard & Steakburgers",cuisine:"burger",name:"Freddy's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Freebirds":{name:"Freebirds",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q5500367"},addTags:{amenity:"fast_food",brand:"Freebirds","brand:wikidata":"Q5500367","brand:wikipedia":"en:Freebirds World Burrito",cuisine:"mexican",name:"Freebirds"},removeTags:{amenity:"fast_food",brand:"Freebirds","brand:wikidata":"Q5500367","brand:wikipedia":"en:Freebirds World Burrito",cuisine:"mexican",name:"Freebirds"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Greenwich":{name:"Greenwich",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q2691308"},addTags:{amenity:"fast_food",brand:"Greenwich","brand:wikidata":"Q2691308","brand:wikipedia":"en:Greenwich Pizza",cuisine:"pizza",name:"Greenwich"},removeTags:{amenity:"fast_food",brand:"Greenwich","brand:wikidata":"Q2691308","brand:wikipedia":"en:Greenwich Pizza",cuisine:"pizza",name:"Greenwich"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Habib's":{name:"Habib's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q2504930"},addTags:{amenity:"fast_food",brand:"Habib's","brand:wikidata":"Q2504930","brand:wikipedia":"en:Habib's",cuisine:"middle_eastern",name:"Habib's"},removeTags:{amenity:"fast_food",brand:"Habib's","brand:wikidata":"Q2504930","brand:wikipedia":"en:Habib's",cuisine:"middle_eastern",name:"Habib's"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Hallo Pizza":{name:"Hallo Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q1571798"},addTags:{amenity:"fast_food",brand:"Hallo Pizza","brand:wikidata":"Q1571798","brand:wikipedia":"de:Hallo Pizza",cuisine:"pizza",name:"Hallo Pizza"},removeTags:{amenity:"fast_food",brand:"Hallo Pizza","brand:wikidata":"Q1571798","brand:wikipedia":"de:Hallo Pizza",cuisine:"pizza",name:"Hallo Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Hardee's":{name:"Hardee's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1585088"},addTags:{amenity:"fast_food",brand:"Hardee's","brand:wikidata":"Q1585088","brand:wikipedia":"en:Hardee's",cuisine:"burger",name:"Hardee's"},removeTags:{amenity:"fast_food",brand:"Hardee's","brand:wikidata":"Q1585088","brand:wikipedia":"en:Hardee's",cuisine:"burger",name:"Hardee's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Harvey's":{name:"Harvey's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1466184"},addTags:{amenity:"fast_food",brand:"Harvey's","brand:wikidata":"Q1466184","brand:wikipedia":"en:Harvey's",cuisine:"burger",name:"Harvey's"},removeTags:{amenity:"fast_food",brand:"Harvey's","brand:wikidata":"Q1466184","brand:wikipedia":"en:Harvey's",cuisine:"burger",name:"Harvey's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Hesburger":{name:"Hesburger",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1276832"},addTags:{amenity:"fast_food",brand:"Hesburger","brand:wikidata":"Q1276832","brand:wikipedia":"en:Hesburger",cuisine:"burger",name:"Hesburger"},removeTags:{amenity:"fast_food",brand:"Hesburger","brand:wikidata":"Q1276832","brand:wikipedia":"en:Hesburger",cuisine:"burger",name:"Hesburger"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Hungry Jacks":{name:"Hungry Jacks",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q3036373"},addTags:{amenity:"fast_food",brand:"Hungry Jacks","brand:wikidata":"Q3036373","brand:wikipedia":"en:Hungry Jack's",cuisine:"burger",name:"Hungry Jacks"},removeTags:{amenity:"fast_food",brand:"Hungry Jacks","brand:wikidata":"Q3036373","brand:wikipedia":"en:Hungry Jack's",cuisine:"burger",name:"Hungry Jacks"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/In-N-Out Burger":{name:"In-N-Out Burger",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1205312"},addTags:{amenity:"fast_food",brand:"In-N-Out Burger","brand:wikidata":"Q1205312","brand:wikipedia":"en:In-N-Out Burger",cuisine:"burger",name:"In-N-Out Burger"},removeTags:{amenity:"fast_food",brand:"In-N-Out Burger","brand:wikidata":"Q1205312","brand:wikipedia":"en:In-N-Out Burger",cuisine:"burger",name:"In-N-Out Burger"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Jack in the Box":{name:"Jack in the Box",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1538507"},addTags:{amenity:"fast_food",brand:"Jack in the Box","brand:wikidata":"Q1538507","brand:wikipedia":"en:Jack in the Box",cuisine:"burger",name:"Jack in the Box"},removeTags:{amenity:"fast_food",brand:"Jack in the Box","brand:wikidata":"Q1538507","brand:wikipedia":"en:Jack in the Box",cuisine:"burger",name:"Jack in the Box"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Jamba Juice":{name:"Jamba Juice",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q3088784"},addTags:{amenity:"fast_food",brand:"Jamba Juice","brand:wikidata":"Q3088784","brand:wikipedia":"en:Jamba Juice",cuisine:"juice",name:"Jamba Juice"},removeTags:{amenity:"fast_food",brand:"Jamba Juice","brand:wikidata":"Q3088784","brand:wikipedia":"en:Jamba Juice",cuisine:"juice",name:"Jamba Juice"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Jersey Mike's Subs":{name:"Jersey Mike's Subs",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q6184897"},addTags:{amenity:"fast_food",brand:"Jersey Mike's Subs","brand:wikidata":"Q6184897","brand:wikipedia":"en:Jersey Mike's Subs",cuisine:"sandwich",name:"Jersey Mike's Subs"},removeTags:{amenity:"fast_food",brand:"Jersey Mike's Subs","brand:wikidata":"Q6184897","brand:wikipedia":"en:Jersey Mike's Subs",cuisine:"sandwich",name:"Jersey Mike's Subs"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Jimmy John's":{name:"Jimmy John's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q1689380"},addTags:{amenity:"fast_food",brand:"Jimmy John's","brand:wikidata":"Q1689380","brand:wikipedia":"en:Jimmy John's",cuisine:"sandwich",name:"Jimmy John's"},removeTags:{amenity:"fast_food",brand:"Jimmy John's","brand:wikidata":"Q1689380","brand:wikipedia":"en:Jimmy John's",cuisine:"sandwich",name:"Jimmy John's"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Jollibee":{name:"Jollibee",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q37614"},addTags:{amenity:"fast_food",brand:"Jollibee","brand:wikidata":"Q37614","brand:wikipedia":"en:Jollibee",cuisine:"burger",name:"Jollibee"},removeTags:{amenity:"fast_food",brand:"Jollibee","brand:wikidata":"Q37614","brand:wikipedia":"en:Jollibee",cuisine:"burger",name:"Jollibee"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/KFC":{name:"KFC",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q524757"},addTags:{amenity:"fast_food",brand:"KFC","brand:wikidata":"Q524757","brand:wikipedia":"en:KFC",cuisine:"chicken",name:"KFC"},removeTags:{amenity:"fast_food",brand:"KFC","brand:wikidata":"Q524757","brand:wikipedia":"en:KFC",cuisine:"chicken",name:"KFC"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Kochlöffel":{name:"Kochlöffel",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q315539"},addTags:{amenity:"fast_food",brand:"Kochlöffel","brand:wikidata":"Q315539","brand:wikipedia":"en:Kochlöffel",cuisine:"burger",name:"Kochlöffel"},removeTags:{amenity:"fast_food",brand:"Kochlöffel","brand:wikidata":"Q315539","brand:wikipedia":"en:Kochlöffel",cuisine:"burger",name:"Kochlöffel"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Kotipizza":{name:"Kotipizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q1628625"},addTags:{amenity:"fast_food",brand:"Kotipizza","brand:wikidata":"Q1628625","brand:wikipedia":"en:Kotipizza",cuisine:"pizza",name:"Kotipizza"},removeTags:{amenity:"fast_food",brand:"Kotipizza","brand:wikidata":"Q1628625","brand:wikipedia":"en:Kotipizza",cuisine:"pizza",name:"Kotipizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Krispy Kreme":{name:"Krispy Kreme",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1192805"},addTags:{amenity:"fast_food",brand:"Krispy Kreme","brand:wikidata":"Q1192805","brand:wikipedia":"en:Krispy Kreme",cuisine:"donut",name:"Krispy Kreme"},removeTags:{amenity:"fast_food",brand:"Krispy Kreme","brand:wikidata":"Q1192805","brand:wikipedia":"en:Krispy Kreme",cuisine:"donut",name:"Krispy Kreme"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Krystal":{name:"Krystal",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q472195"},addTags:{amenity:"fast_food",brand:"Krystal","brand:wikidata":"Q472195","brand:wikipedia":"en:Krystal (restaurant)",cuisine:"burger",name:"Krystal"},removeTags:{amenity:"fast_food",brand:"Krystal","brand:wikidata":"Q472195","brand:wikipedia":"en:Krystal (restaurant)",cuisine:"burger",name:"Krystal"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Little Caesars":{name:"Little Caesars",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q1393809"},addTags:{amenity:"fast_food",brand:"Little Caesars","brand:wikidata":"Q1393809","brand:wikipedia":"en:Little Caesars",cuisine:"pizza",name:"Little Caesars"},removeTags:{amenity:"fast_food",brand:"Little Caesars","brand:wikidata":"Q1393809","brand:wikipedia":"en:Little Caesars",cuisine:"pizza",name:"Little Caesars"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Long John Silver's":{name:"Long John Silver's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1535221"},addTags:{amenity:"fast_food",brand:"Long John Silver's","brand:wikidata":"Q1535221","brand:wikipedia":"en:Long John Silver's",cuisine:"seafood",name:"Long John Silver's"},removeTags:{amenity:"fast_food",brand:"Long John Silver's","brand:wikidata":"Q1535221","brand:wikipedia":"en:Long John Silver's",cuisine:"seafood",name:"Long John Silver's"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Lotteria":{name:"Lotteria",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q249525"},addTags:{amenity:"fast_food",brand:"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"en:Lotteria",cuisine:"burger",name:"Lotteria"},removeTags:{amenity:"fast_food",brand:"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"en:Lotteria",cuisine:"burger",name:"Lotteria"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Mang Inasal":{name:"Mang Inasal",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q6748573"},addTags:{amenity:"fast_food",brand:"Mang Inasal","brand:wikidata":"Q6748573","brand:wikipedia":"en:Mang Inasal",cuisine:"barbecue",name:"Mang Inasal"},removeTags:{amenity:"fast_food",brand:"Mang Inasal","brand:wikidata":"Q6748573","brand:wikipedia":"en:Mang Inasal",cuisine:"barbecue",name:"Mang Inasal"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Max":{name:"Max",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1912172"},addTags:{amenity:"fast_food",brand:"Max","brand:wikidata":"Q1912172","brand:wikipedia":"en:Max Hamburgers",cuisine:"burger",name:"Max"},removeTags:{amenity:"fast_food",brand:"Max","brand:wikidata":"Q1912172","brand:wikipedia":"en:Max Hamburgers",cuisine:"burger",name:"Max"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/McDonald's":{name:"McDonald's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"McDonald's"},removeTags:{amenity:"fast_food",brand:"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"McDonald's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Moe's Southwest Grill":{name:"Moe's Southwest Grill",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q6889938"},addTags:{amenity:"fast_food",brand:"Moe's Southwest Grill","brand:wikidata":"Q6889938","brand:wikipedia":"en:Moe's Southwest Grill",cuisine:"mexican",name:"Moe's Southwest Grill"},removeTags:{amenity:"fast_food",brand:"Moe's Southwest Grill","brand:wikidata":"Q6889938","brand:wikipedia":"en:Moe's Southwest Grill",cuisine:"mexican",name:"Moe's Southwest Grill"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Mr. Sub":{name:"Mr. Sub",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q6929225"},addTags:{amenity:"fast_food",brand:"Mr. Sub","brand:wikidata":"Q6929225","brand:wikipedia":"en:Mr. Sub",cuisine:"sandwich",name:"Mr. Sub"},removeTags:{amenity:"fast_food",brand:"Mr. Sub","brand:wikidata":"Q6929225","brand:wikipedia":"en:Mr. Sub",cuisine:"sandwich",name:"Mr. Sub"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/New York Pizza":{name:"New York Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q2639128"},addTags:{amenity:"fast_food",brand:"New York Pizza","brand:wikidata":"Q2639128","brand:wikipedia":"nl:New York Pizza",cuisine:"pizza",name:"New York Pizza"},removeTags:{amenity:"fast_food",brand:"New York Pizza","brand:wikidata":"Q2639128","brand:wikipedia":"nl:New York Pizza",cuisine:"pizza",name:"New York Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Nordsee":{name:"Nordsee",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q74866"},addTags:{amenity:"fast_food",brand:"Nordsee","brand:wikidata":"Q74866","brand:wikipedia":"en:Nordsee",cuisine:"seafood",name:"Nordsee"},removeTags:{amenity:"fast_food",brand:"Nordsee","brand:wikidata":"Q74866","brand:wikipedia":"en:Nordsee",cuisine:"seafood",name:"Nordsee"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/O'Tacos":{name:"O'Tacos",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q28494040"},addTags:{amenity:"fast_food",brand:"O'Tacos","brand:wikidata":"Q28494040","brand:wikipedia":"en:O'Tacos",cuisine:"mexican",name:"O'Tacos"},removeTags:{amenity:"fast_food",brand:"O'Tacos","brand:wikidata":"Q28494040","brand:wikipedia":"en:O'Tacos",cuisine:"mexican",name:"O'Tacos"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Pal's":{name:"Pal's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q7126094"},addTags:{amenity:"fast_food",brand:"Pal's","brand:wikidata":"Q7126094","brand:wikipedia":"en:Pal's",cuisine:"burger",name:"Pal's"},removeTags:{amenity:"fast_food",brand:"Pal's","brand:wikidata":"Q7126094","brand:wikipedia":"en:Pal's",cuisine:"burger",name:"Pal's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Panago":{name:"Panago",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q17111672"},addTags:{amenity:"fast_food",brand:"Panago","brand:wikidata":"Q17111672","brand:wikipedia":"en:Panago",cuisine:"pizza",name:"Panago"},removeTags:{amenity:"fast_food",brand:"Panago","brand:wikidata":"Q17111672","brand:wikipedia":"en:Panago",cuisine:"pizza",name:"Panago"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Panda Express":{name:"Panda Express",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1358690"},addTags:{amenity:"fast_food",brand:"Panda Express","brand:wikidata":"Q1358690","brand:wikipedia":"en:Panda Express",cuisine:"chinese",name:"Panda Express"},removeTags:{amenity:"fast_food",brand:"Panda Express","brand:wikidata":"Q1358690","brand:wikipedia":"en:Panda Express",cuisine:"chinese",name:"Panda Express"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Panera Bread":{name:"Panera Bread",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q7130852"},addTags:{amenity:"fast_food",brand:"Panera Bread","brand:wikidata":"Q7130852","brand:wikipedia":"en:Panera Bread",cuisine:"sandwich",name:"Panera Bread"},removeTags:{amenity:"fast_food",brand:"Panera Bread","brand:wikidata":"Q7130852","brand:wikipedia":"en:Panera Bread",cuisine:"sandwich",name:"Panera Bread"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Papa John's":{name:"Papa John's",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q2759586"},addTags:{amenity:"fast_food",brand:"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"en:Papa John's Pizza",cuisine:"pizza",name:"Papa John's"},removeTags:{amenity:"fast_food",brand:"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"en:Papa John's Pizza",cuisine:"pizza",name:"Papa John's"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Papa Murphy's":{name:"Papa Murphy's",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q7132349"},addTags:{amenity:"fast_food",brand:"Papa Murphy's","brand:wikidata":"Q7132349","brand:wikipedia":"en:Papa Murphy's",cuisine:"pizza",name:"Papa Murphy's"},removeTags:{amenity:"fast_food",brand:"Papa Murphy's","brand:wikidata":"Q7132349","brand:wikipedia":"en:Papa Murphy's",cuisine:"pizza",name:"Papa Murphy's"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Philly Pretzel Factory":{name:"Philly Pretzel Factory",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q60097339"},addTags:{amenity:"fast_food",brand:"Philly Pretzel Factory","brand:wikidata":"Q60097339",cuisine:"pretzel",name:"Philly Pretzel Factory"},removeTags:{amenity:"fast_food",brand:"Philly Pretzel Factory","brand:wikidata":"Q60097339",cuisine:"pretzel",name:"Philly Pretzel Factory"},matchScore:2,suggestion:true},"amenity/fast_food/Pita Pit":{name:"Pita Pit",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q7757289"},addTags:{amenity:"fast_food",brand:"Pita Pit","brand:wikidata":"Q7757289","brand:wikipedia":"en:Pita Pit",cuisine:"pita",name:"Pita Pit"},removeTags:{amenity:"fast_food",brand:"Pita Pit","brand:wikidata":"Q7757289","brand:wikipedia":"en:Pita Pit",cuisine:"pita",name:"Pita Pit"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Hut Delivery":{name:"Pizza Hut Delivery",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q191615"},addTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Delivery"},removeTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Delivery"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Hut Express":{name:"Pizza Hut Express",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q191615"},addTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikipedia":"en:Pizza Hut","brand:wikidata":"Q191615",cuisine:"pizza",name:"Pizza Hut Express"},removeTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikipedia":"en:Pizza Hut","brand:wikidata":"Q191615",cuisine:"pizza",name:"Pizza Hut Express"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Nova":{name:"Pizza Nova",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q7199971"},addTags:{amenity:"fast_food",brand:"Pizza Nova","brand:wikidata":"Q7199971","brand:wikipedia":"en:Pizza Nova",cuisine:"pizza",name:"Pizza Nova"},removeTags:{amenity:"fast_food",brand:"Pizza Nova","brand:wikidata":"Q7199971","brand:wikipedia":"en:Pizza Nova",cuisine:"pizza",name:"Pizza Nova"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Pizza":{name:"Pizza Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q1194143"},addTags:{amenity:"fast_food",brand:"Pizza Pizza","brand:wikidata":"Q1194143","brand:wikipedia":"en:Pizza Pizza",cuisine:"pizza",name:"Pizza Pizza"},removeTags:{amenity:"fast_food",brand:"Pizza Pizza","brand:wikidata":"Q1194143","brand:wikipedia":"en:Pizza Pizza",cuisine:"pizza",name:"Pizza Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Pollo Campero":{name:"Pollo Campero",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q942741"},addTags:{amenity:"fast_food",brand:"Pollo Campero","brand:wikidata":"Q942741","brand:wikipedia":"en:Pollo Campero",cuisine:"chicken",name:"Pollo Campero"},removeTags:{amenity:"fast_food",brand:"Pollo Campero","brand:wikidata":"Q942741","brand:wikipedia":"en:Pollo Campero",cuisine:"chicken",name:"Pollo Campero"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Popeye's":{name:"Popeye's",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q1330910"},addTags:{amenity:"fast_food",brand:"Popeye's","brand:wikidata":"Q1330910","brand:wikipedia":"en:Popeyes",cuisine:"chicken",name:"Popeye's"},removeTags:{amenity:"fast_food",brand:"Popeye's","brand:wikidata":"Q1330910","brand:wikipedia":"en:Popeyes",cuisine:"chicken",name:"Popeye's"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Potbelly":{name:"Potbelly",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q7234777"},addTags:{amenity:"fast_food",brand:"Potbelly","brand:wikidata":"Q7234777","brand:wikipedia":"en:Potbelly Sandwich Works",cuisine:"sandwich",name:"Potbelly"},removeTags:{amenity:"fast_food",brand:"Potbelly","brand:wikidata":"Q7234777","brand:wikipedia":"en:Potbelly Sandwich Works",cuisine:"sandwich",name:"Potbelly"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Qdoba":{name:"Qdoba",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q1363885"},addTags:{amenity:"fast_food",brand:"Qdoba","brand:wikidata":"Q1363885","brand:wikipedia":"en:Qdoba",cuisine:"mexican",name:"Qdoba"},removeTags:{amenity:"fast_food",brand:"Qdoba","brand:wikidata":"Q1363885","brand:wikipedia":"en:Qdoba",cuisine:"mexican",name:"Qdoba"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Quick":{name:"Quick",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q286494"},addTags:{amenity:"fast_food",brand:"Quick","brand:wikidata":"Q286494","brand:wikipedia":"en:Quick (restaurant)",cuisine:"burger",name:"Quick"},removeTags:{amenity:"fast_food",brand:"Quick","brand:wikidata":"Q286494","brand:wikipedia":"en:Quick (restaurant)",cuisine:"burger",name:"Quick"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Quiznos":{name:"Quiznos",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q1936229"},addTags:{amenity:"fast_food",brand:"Quiznos","brand:wikidata":"Q1936229","brand:wikipedia":"en:Quiznos",cuisine:"sandwich",name:"Quiznos"},removeTags:{amenity:"fast_food",brand:"Quiznos","brand:wikidata":"Q1936229","brand:wikipedia":"en:Quiznos",cuisine:"sandwich",name:"Quiznos"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Raising Cane's":{name:"Raising Cane's",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q7285144"},addTags:{amenity:"fast_food",brand:"Raising Cane's","brand:wikidata":"Q7285144","brand:wikipedia":"en:Raising Cane's Chicken Fingers",cuisine:"chicken",name:"Raising Cane's"},removeTags:{amenity:"fast_food",brand:"Raising Cane's","brand:wikidata":"Q7285144","brand:wikipedia":"en:Raising Cane's Chicken Fingers",cuisine:"chicken",name:"Raising Cane's"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Rally's":{name:"Rally's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q3419341"},addTags:{amenity:"fast_food",brand:"Rally's","brand:wikidata":"Q3419341","brand:wikipedia":"en:Checkers and Rally's",cuisine:"burger",name:"Rally's"},removeTags:{amenity:"fast_food",brand:"Rally's","brand:wikidata":"Q3419341","brand:wikipedia":"en:Checkers and Rally's",cuisine:"burger",name:"Rally's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Red Rooster":{name:"Red Rooster",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q376466"},addTags:{amenity:"fast_food",brand:"Red Rooster","brand:wikidata":"Q376466","brand:wikipedia":"en:Red Rooster",cuisine:"chicken",name:"Red Rooster"},removeTags:{amenity:"fast_food",brand:"Red Rooster","brand:wikidata":"Q376466","brand:wikipedia":"en:Red Rooster",cuisine:"chicken",name:"Red Rooster"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Sbarro":{name:"Sbarro",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q2589409"},addTags:{amenity:"fast_food",brand:"Sbarro","brand:wikidata":"Q2589409","brand:wikipedia":"en:Sbarro",cuisine:"pizza",name:"Sbarro"},removeTags:{amenity:"fast_food",brand:"Sbarro","brand:wikidata":"Q2589409","brand:wikipedia":"en:Sbarro",cuisine:"pizza",name:"Sbarro"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Schlotzsky's":{name:"Schlotzsky's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q2244796"},addTags:{amenity:"fast_food",brand:"Schlotzsky's","brand:wikidata":"Q2244796","brand:wikipedia":"en:Schlotzsky's",cuisine:"sandwich",name:"Schlotzsky's"},removeTags:{amenity:"fast_food",brand:"Schlotzsky's","brand:wikidata":"Q2244796","brand:wikipedia":"en:Schlotzsky's",cuisine:"sandwich",name:"Schlotzsky's"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Shake Shack":{name:"Shake Shack",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1058722"},addTags:{amenity:"fast_food",brand:"Shake Shack","brand:wikidata":"Q1058722","brand:wikipedia":"en:Shake Shack",cuisine:"burger",name:"Shake Shack"},removeTags:{amenity:"fast_food",brand:"Shake Shack","brand:wikidata":"Q1058722","brand:wikipedia":"en:Shake Shack",cuisine:"burger",name:"Shake Shack"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Sibylla":{name:"Sibylla",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q488643"},addTags:{amenity:"fast_food",brand:"Sibylla","brand:wikidata":"Q488643","brand:wikipedia":"en:Sibylla (fast food)",cuisine:"burger",name:"Sibylla"},removeTags:{amenity:"fast_food",brand:"Sibylla","brand:wikidata":"Q488643","brand:wikipedia":"en:Sibylla (fast food)",cuisine:"burger",name:"Sibylla"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Smashburger":{name:"Smashburger",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q17061332"},addTags:{amenity:"fast_food",brand:"Smashburger","brand:wikidata":"Q17061332","brand:wikipedia":"en:Smashburger",cuisine:"burger",name:"Smashburger"},removeTags:{amenity:"fast_food",brand:"Smashburger","brand:wikidata":"Q17061332","brand:wikipedia":"en:Smashburger",cuisine:"burger",name:"Smashburger"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Smoothie King":{name:"Smoothie King",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5491421"},addTags:{amenity:"fast_food",brand:"Smoothie King","brand:wikidata":"Q5491421","brand:wikipedia":"en:Smoothie King",cuisine:"juice",name:"Smoothie King"},removeTags:{amenity:"fast_food",brand:"Smoothie King","brand:wikidata":"Q5491421","brand:wikipedia":"en:Smoothie King",cuisine:"juice",name:"Smoothie King"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Sonic":{name:"Sonic",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q7561808"},addTags:{amenity:"fast_food",brand:"Sonic","brand:wikidata":"Q7561808","brand:wikipedia":"en:Sonic Drive-In",cuisine:"burger",name:"Sonic"},removeTags:{amenity:"fast_food",brand:"Sonic","brand:wikidata":"Q7561808","brand:wikipedia":"en:Sonic Drive-In",cuisine:"burger",name:"Sonic"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Steers":{name:"Steers",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q56599145"},addTags:{amenity:"fast_food",brand:"Steers","brand:wikidata":"Q56599145","brand:wikipedia":"en:Steers",cuisine:"burger",name:"Steers"},removeTags:{amenity:"fast_food",brand:"Steers","brand:wikidata":"Q56599145","brand:wikipedia":"en:Steers",cuisine:"burger",name:"Steers"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Subway":{name:"Subway",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q244457"},addTags:{amenity:"fast_food",brand:"Subway","brand:wikidata":"Q244457","brand:wikipedia":"en:Subway (restaurant)",cuisine:"sandwich",name:"Subway"},removeTags:{amenity:"fast_food",brand:"Subway","brand:wikidata":"Q244457","brand:wikipedia":"en:Subway (restaurant)",cuisine:"sandwich",name:"Subway"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Supermac's":{name:"Supermac's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q7643750"},addTags:{amenity:"fast_food",brand:"Supermac's","brand:wikidata":"Q7643750","brand:wikipedia":"en:Supermac's",cuisine:"burger",name:"Supermac's"},removeTags:{amenity:"fast_food",brand:"Supermac's","brand:wikidata":"Q7643750","brand:wikipedia":"en:Supermac's",cuisine:"burger",name:"Supermac's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/TCBY":{name:"TCBY",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q7669631"},addTags:{amenity:"fast_food",brand:"TCBY","brand:wikidata":"Q7669631","brand:wikipedia":"en:TCBY",cuisine:"frozen_yogurt",name:"TCBY"},removeTags:{amenity:"fast_food",brand:"TCBY","brand:wikidata":"Q7669631","brand:wikipedia":"en:TCBY",cuisine:"frozen_yogurt",name:"TCBY"},matchScore:2,suggestion:true},"amenity/fast_food/Taco Bell":{name:"Taco Bell",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q752941"},addTags:{amenity:"fast_food",brand:"Taco Bell","brand:wikidata":"Q752941","brand:wikipedia":"en:Taco Bell",cuisine:"tex-mex",name:"Taco Bell"},removeTags:{amenity:"fast_food",brand:"Taco Bell","brand:wikidata":"Q752941","brand:wikipedia":"en:Taco Bell",cuisine:"tex-mex",name:"Taco Bell"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Bueno":{name:"Taco Bueno",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q7673958"},addTags:{amenity:"fast_food",brand:"Taco Bueno","brand:wikidata":"Q7673958","brand:wikipedia":"en:Taco Bueno",cuisine:"mexican",name:"Taco Bueno"},removeTags:{amenity:"fast_food",brand:"Taco Bueno","brand:wikidata":"Q7673958","brand:wikipedia":"en:Taco Bueno",cuisine:"mexican",name:"Taco Bueno"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Cabana":{name:"Taco Cabana",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q12070488"},addTags:{amenity:"fast_food",brand:"Taco Cabana","brand:wikidata":"Q12070488","brand:wikipedia":"en:Taco Cabana",cuisine:"mexican",name:"Taco Cabana"},removeTags:{amenity:"fast_food",brand:"Taco Cabana","brand:wikidata":"Q12070488","brand:wikipedia":"en:Taco Cabana",cuisine:"mexican",name:"Taco Cabana"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Del Mar":{name:"Taco Del Mar",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q7673972"},addTags:{amenity:"fast_food",brand:"Taco Del Mar","brand:wikidata":"Q7673972","brand:wikipedia":"en:Taco del Mar",cuisine:"mexican",name:"Taco Del Mar"},removeTags:{amenity:"fast_food",brand:"Taco Del Mar","brand:wikidata":"Q7673972","brand:wikipedia":"en:Taco del Mar",cuisine:"mexican",name:"Taco Del Mar"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco John's":{name:"Taco John's",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q7673962"},addTags:{amenity:"fast_food",brand:"Taco John's","brand:wikidata":"Q7673962","brand:wikipedia":"en:Taco John's",cuisine:"mexican",name:"Taco John's"},removeTags:{amenity:"fast_food",brand:"Taco John's","brand:wikidata":"Q7673962","brand:wikipedia":"en:Taco John's",cuisine:"mexican",name:"Taco John's"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Time":{name:"Taco Time",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q7673969"},addTags:{amenity:"fast_food",brand:"Taco Time","brand:wikidata":"Q7673969","brand:wikipedia":"en:Taco Time",cuisine:"mexican",name:"Taco Time"},removeTags:{amenity:"fast_food",brand:"Taco Time","brand:wikidata":"Q7673969","brand:wikipedia":"en:Taco Time",cuisine:"mexican",name:"Taco Time"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Telepizza":{name:"Telepizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q2699863"},addTags:{amenity:"fast_food",brand:"Telepizza","brand:wikidata":"Q2699863","brand:wikipedia":"en:Telepizza",cuisine:"pizza",name:"Telepizza"},removeTags:{amenity:"fast_food",brand:"Telepizza","brand:wikidata":"Q2699863","brand:wikipedia":"en:Telepizza",cuisine:"pizza",name:"Telepizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Thai Express":{name:"Thai Express",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q7709119"},addTags:{amenity:"fast_food",brand:"Thai Express","brand:wikidata":"Q7709119","brand:wikipedia":"en:Thai Express",cuisine:"thai",name:"Thai Express"},removeTags:{amenity:"fast_food",brand:"Thai Express","brand:wikidata":"Q7709119","brand:wikipedia":"en:Thai Express",cuisine:"thai",name:"Thai Express"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/The Pizza Company":{name:"The Pizza Company",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q2413520"},addTags:{amenity:"fast_food",brand:"The Pizza Company","brand:wikidata":"Q2413520","brand:wikipedia":"en:The Pizza Company",cuisine:"pizza",name:"The Pizza Company"},removeTags:{amenity:"fast_food",brand:"The Pizza Company","brand:wikidata":"Q2413520","brand:wikipedia":"en:The Pizza Company",cuisine:"pizza",name:"The Pizza Company"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Veggie Grill":{name:"Veggie Grill",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q18636427"},addTags:{amenity:"fast_food",brand:"Veggie Grill","brand:wikidata":"Q18636427","brand:wikipedia":"en:Veggie Grill","diet:vegan":"only",cuisine:"american",name:"Veggie Grill"},removeTags:{amenity:"fast_food",brand:"Veggie Grill","brand:wikidata":"Q18636427","brand:wikipedia":"en:Veggie Grill","diet:vegan":"only",cuisine:"american",name:"Veggie Grill"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Wendy's":{name:"Wendy's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q550258"},addTags:{amenity:"fast_food",brand:"Wendy's","brand:wikidata":"Q550258","brand:wikipedia":"en:Wendy's",cuisine:"burger",name:"Wendy's"},removeTags:{amenity:"fast_food",brand:"Wendy's","brand:wikidata":"Q550258","brand:wikipedia":"en:Wendy's",cuisine:"burger",name:"Wendy's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Whataburger":{name:"Whataburger",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q376627"},addTags:{amenity:"fast_food",brand:"Whataburger","brand:wikidata":"Q376627","brand:wikipedia":"en:Whataburger",cuisine:"burger",name:"Whataburger"},removeTags:{amenity:"fast_food",brand:"Whataburger","brand:wikidata":"Q376627","brand:wikipedia":"en:Whataburger",cuisine:"burger",name:"Whataburger"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/White Castle":{name:"White Castle",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1244034"},addTags:{amenity:"fast_food",brand:"White Castle","brand:wikidata":"Q1244034","brand:wikipedia":"en:White Castle (restaurant)",cuisine:"burger",name:"White Castle"},removeTags:{amenity:"fast_food",brand:"White Castle","brand:wikidata":"Q1244034","brand:wikipedia":"en:White Castle (restaurant)",cuisine:"burger",name:"White Castle"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Wienerschnitzel":{name:"Wienerschnitzel",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q324679"},addTags:{amenity:"fast_food",brand:"Wienerschnitzel","brand:wikidata":"Q324679","brand:wikipedia":"en:Wienerschnitzel",cuisine:"hot_dog",name:"Wienerschnitzel"},removeTags:{amenity:"fast_food",brand:"Wienerschnitzel","brand:wikidata":"Q324679","brand:wikipedia":"en:Wienerschnitzel",cuisine:"hot_dog",name:"Wienerschnitzel"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Wimpy":{name:"Wimpy",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q2811992"},addTags:{amenity:"fast_food",brand:"Wimpy","brand:wikidata":"Q2811992","brand:wikipedia":"en:Wimpy (restaurant)",cuisine:"burger",name:"Wimpy"},removeTags:{amenity:"fast_food",brand:"Wimpy","brand:wikidata":"Q2811992","brand:wikipedia":"en:Wimpy (restaurant)",cuisine:"burger",name:"Wimpy"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Zaxby's":{name:"Zaxby's",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q8067525"},addTags:{amenity:"fast_food",brand:"Zaxby's","brand:wikidata":"Q8067525","brand:wikipedia":"en:Zaxby's",cuisine:"chicken",name:"Zaxby's"},removeTags:{amenity:"fast_food",brand:"Zaxby's","brand:wikidata":"Q8067525","brand:wikipedia":"en:Zaxby's",cuisine:"chicken",name:"Zaxby's"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Бургер Кинг":{name:"Бургер Кинг",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q177054"},addTags:{amenity:"fast_food",brand:"Бургер Кинг","brand:en":"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Бургер Кинг","name:en":"Burger King"},removeTags:{amenity:"fast_food",brand:"Бургер Кинг","brand:en":"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Бургер Кинг","name:en":"Burger King"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Крошка Картошка":{name:"Крошка Картошка",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4241838"},addTags:{amenity:"fast_food",brand:"Крошка Картошка","brand:wikidata":"Q4241838","brand:wikipedia":"ru:Крошка Картошка",name:"Крошка Картошка"},removeTags:{amenity:"fast_food",brand:"Крошка Картошка","brand:wikidata":"Q4241838","brand:wikipedia":"ru:Крошка Картошка",name:"Крошка Картошка"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Макдоналдс":{name:"Макдоналдс",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"Макдоналдс","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"Макдоналдс","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"Макдоналдс","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"Макдоналдс","name:en":"McDonald's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Папа Джонс":{name:"Папа Джонс",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q2759586"},addTags:{amenity:"fast_food",brand:"Папа Джонс","brand:en":"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"ru:Papa John’s",cuisine:"pizza",name:"Папа Джонс","name:en":"Papa John's"},removeTags:{amenity:"fast_food",brand:"Папа Джонс","brand:en":"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"ru:Papa John’s",cuisine:"pizza",name:"Папа Джонс","name:en":"Papa John's"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Стардог!s":{name:"Стардог!s",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4439856"},addTags:{amenity:"fast_food",brand:"Стардог!s","brand:en":"Stardog!s","brand:wikidata":"Q4439856","brand:wikipedia":"ru:Стардогс",cuisine:"sausage",name:"Стардог!s","name:en":"Stardog!s"},removeTags:{amenity:"fast_food",brand:"Стардог!s","brand:en":"Stardog!s","brand:wikidata":"Q4439856","brand:wikipedia":"ru:Стардогс",cuisine:"sausage",name:"Стардог!s","name:en":"Stardog!s"},matchScore:2,suggestion:true},"amenity/fast_food/Суши Wok":{name:"Суши Wok",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q25444754"},addTags:{amenity:"fast_food",brand:"Суши Wok","brand:en":"Sushi Wok","brand:wikidata":"Q25444754","brand:wikipedia":"uk:Суши Wok (мережа магазинів)",cuisine:"asian",name:"Суши Wok","name:en":"Sushi Wok"},removeTags:{amenity:"fast_food",brand:"Суши Wok","brand:en":"Sushi Wok","brand:wikidata":"Q25444754","brand:wikipedia":"uk:Суши Wok (мережа магазинів)",cuisine:"asian",name:"Суши Wok","name:en":"Sushi Wok"},matchScore:2,suggestion:true},"amenity/fast_food/Теремок":{name:"Теремок",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4455593"},addTags:{amenity:"fast_food",brand:"Теремок","brand:en":"Teremok","brand:wikidata":"Q4455593","brand:wikipedia":"ru:Теремок (сеть быстрого питания)",name:"Теремок","name:en":"Teremok"},removeTags:{amenity:"fast_food",brand:"Теремок","brand:en":"Teremok","brand:wikidata":"Q4455593","brand:wikipedia":"ru:Теремок (сеть быстрого питания)",name:"Теремок","name:en":"Teremok"},matchScore:2,suggestion:true},"amenity/fast_food/burger/מקדונלד'ס":{name:"מקדונלד'ס",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q12061542"},addTags:{amenity:"fast_food",brand:"מקדונלד'ס","brand:en":"McDonald's","brand:wikidata":"Q12061542","brand:wikipedia":"en:McDonald's Israel",cuisine:"burger",name:"מקדונלד'ס","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"מקדונלד'ס","brand:en":"McDonald's","brand:wikidata":"Q12061542","brand:wikipedia":"en:McDonald's Israel",cuisine:"burger",name:"מקדונלד'ס","name:en":"McDonald's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/かっぱ寿司":{name:"かっぱ寿司",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q11263916"},addTags:{amenity:"fast_food",brand:"かっぱ寿司","brand:en":"Kappazushi","brand:wikidata":"Q11263916","brand:wikipedia":"ja:かっぱ寿司",cuisine:"sushi",name:"かっぱ寿司","name:en":"Kappazushi"},removeTags:{amenity:"fast_food",brand:"かっぱ寿司","brand:en":"Kappazushi","brand:wikidata":"Q11263916","brand:wikipedia":"ja:かっぱ寿司",cuisine:"sushi",name:"かっぱ寿司","name:en":"Kappazushi"},matchScore:2,suggestion:true},"amenity/fast_food/かつや":{name:"かつや",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q2855257"},addTags:{amenity:"fast_food",brand:"かつや","brand:en":"Katsuya","brand:wikidata":"Q2855257","brand:wikipedia":"ja:かつや",cuisine:"fried_food",name:"かつや","name:en":"Katsuya","name:ko":"카쯔야","name:zh":"吉豚屋"},removeTags:{amenity:"fast_food",brand:"かつや","brand:en":"Katsuya","brand:wikidata":"Q2855257","brand:wikipedia":"ja:かつや",cuisine:"fried_food",name:"かつや","name:en":"Katsuya","name:ko":"카쯔야","name:zh":"吉豚屋"},matchScore:2,suggestion:true},"amenity/fast_food/くら寿司":{name:"くら寿司",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q6445491"},addTags:{amenity:"fast_food",brand:"くら寿司","brand:en":"Kurazushi","brand:wikidata":"Q6445491","brand:wikipedia":"ja:くらコーポレーション",cuisine:"sushi",name:"くら寿司","name:en":"Kurazushi"},removeTags:{amenity:"fast_food",brand:"くら寿司","brand:en":"Kurazushi","brand:wikidata":"Q6445491","brand:wikipedia":"ja:くらコーポレーション",cuisine:"sushi",name:"くら寿司","name:en":"Kurazushi"},matchScore:2,suggestion:true},"amenity/fast_food/すき家":{name:"すき家",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q6137375"},addTags:{amenity:"fast_food",brand:"すき家","brand:en":"Sukiya","brand:wikidata":"Q6137375","brand:wikipedia":"ja:すき家",name:"すき家","name:en":"Sukiya"},removeTags:{amenity:"fast_food",brand:"すき家","brand:en":"Sukiya","brand:wikidata":"Q6137375","brand:wikipedia":"ja:すき家",name:"すき家","name:en":"Sukiya"},matchScore:2,suggestion:true},"amenity/fast_food/なか卯":{name:"なか卯",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q11274132"},addTags:{amenity:"fast_food",brand:"なか卯","brand:en":"Nakau","brand:wikidata":"Q11274132","brand:wikipedia":"ja:なか卯",name:"なか卯","name:en":"Nakau"},removeTags:{amenity:"fast_food",brand:"なか卯","brand:en":"Nakau","brand:wikidata":"Q11274132","brand:wikipedia":"ja:なか卯",name:"なか卯","name:en":"Nakau"},matchScore:2,suggestion:true},"amenity/fast_food/はま寿司":{name:"はま寿司",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q17220385"},addTags:{amenity:"fast_food",brand:"はま寿司","brand:en":"Hamazushi","brand:wikidata":"Q17220385","brand:wikipedia":"ja:はま寿司",name:"はま寿司","name:en":"Hamazushi"},removeTags:{amenity:"fast_food",brand:"はま寿司","brand:en":"Hamazushi","brand:wikidata":"Q17220385","brand:wikipedia":"ja:はま寿司",name:"はま寿司","name:en":"Hamazushi"},matchScore:2,suggestion:true},"amenity/fast_food/ほっかほっか亭":{name:"ほっかほっか亭",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5878035"},addTags:{amenity:"fast_food",brand:"ほっかほっか亭","brand:en":"Hokka Hokka Tei","brand:wikidata":"Q5878035","brand:wikipedia":"ja:ほっかほっか亭",name:"ほっかほっか亭","name:en":"Hokka Hokka Tei"},removeTags:{amenity:"fast_food",brand:"ほっかほっか亭","brand:en":"Hokka Hokka Tei","brand:wikidata":"Q5878035","brand:wikipedia":"ja:ほっかほっか亭",name:"ほっかほっか亭","name:en":"Hokka Hokka Tei"},matchScore:2,suggestion:true},"amenity/fast_food/ほっともっと":{name:"ほっともっと",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q10850949"},addTags:{amenity:"fast_food",brand:"ほっともっと","brand:en":"Hotto Motto","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",name:"ほっともっと","name:en":"Hotto Motto"},removeTags:{amenity:"fast_food",brand:"ほっともっと","brand:en":"Hotto Motto","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",name:"ほっともっと","name:en":"Hotto Motto"},matchScore:2,suggestion:true},"amenity/fast_food/オリジン弁当":{name:"オリジン弁当",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q11292632"},addTags:{amenity:"fast_food",brand:"オリジン弁当","brand:en":"Origin Bentō","brand:wikidata":"Q11292632","brand:wikipedia":"ja:オリジン東秀",name:"オリジン弁当","name:en":"Origin Bentō"},removeTags:{amenity:"fast_food",brand:"オリジン弁当","brand:en":"Origin Bentō","brand:wikidata":"Q11292632","brand:wikipedia":"ja:オリジン東秀",name:"オリジン弁当","name:en":"Origin Bentō"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/ケンタッキーフライドチキン":{name:"ケンタッキーフライドチキン",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q524757"},addTags:{amenity:"fast_food",brand:"ケンタッキーフライドチキン","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"ja:KFCコーポレーション",cuisine:"chicken",name:"ケンタッキーフライドチキン","name:en":"KFC"},removeTags:{amenity:"fast_food",brand:"ケンタッキーフライドチキン","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"ja:KFCコーポレーション",cuisine:"chicken",name:"ケンタッキーフライドチキン","name:en":"KFC"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/サブウェイ":{name:"サブウェイ",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q244457"},addTags:{amenity:"fast_food",brand:"サブウェイ","brand:en":"Subway","brand:wikidata":"Q244457","brand:wikipedia":"ja:サブウェイ",cuisine:"sandwich",name:"サブウェイ","name:en":"Subway"},removeTags:{amenity:"fast_food",brand:"サブウェイ","brand:en":"Subway","brand:wikidata":"Q244457","brand:wikipedia":"ja:サブウェイ",cuisine:"sandwich",name:"サブウェイ","name:en":"Subway"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/スシロー":{name:"スシロー",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q11257037"},addTags:{amenity:"fast_food",brand:"スシロー","brand:en":"Sushiro","brand:wikidata":"Q11257037","brand:wikipedia":"ja:あきんどスシロー",cuisine:"sushi",name:"スシロー","name:en":"Sushiro","name:zh":"壽司郎"},removeTags:{amenity:"fast_food",brand:"スシロー","brand:en":"Sushiro","brand:wikidata":"Q11257037","brand:wikipedia":"ja:あきんどスシロー",cuisine:"sushi",name:"スシロー","name:en":"Sushiro","name:zh":"壽司郎"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/ピザハット":{name:"ピザハット",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q191615"},addTags:{amenity:"fast_food",brand:"ピザハット","brand:en":"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"ja:ピザハット",cuisine:"pizza",name:"ピザハット","name:en":"Pizza Hut"},removeTags:{amenity:"fast_food",brand:"ピザハット","brand:en":"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"ja:ピザハット",cuisine:"pizza",name:"ピザハット","name:en":"Pizza Hut"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/burger/マクドナルド":{name:"マクドナルド",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"マクドナルド","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"ja:マクドナルド",cuisine:"burger",name:"マクドナルド","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"マクドナルド","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"ja:マクドナルド",cuisine:"burger",name:"マクドナルド","name:en":"McDonald's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/ミスタードーナツ":{name:"ミスタードーナツ",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1065819"},addTags:{amenity:"fast_food",brand:"ミスタードーナツ","brand:en":"Mister Donut","brand:wikidata":"Q1065819","brand:wikipedia":"en:Mister Donut",cuisine:"donut",name:"ミスタードーナツ","name:en":"Mister Donut"},removeTags:{amenity:"fast_food",brand:"ミスタードーナツ","brand:en":"Mister Donut","brand:wikidata":"Q1065819","brand:wikipedia":"en:Mister Donut",cuisine:"donut",name:"ミスタードーナツ","name:en":"Mister Donut"},matchScore:2,suggestion:true},"amenity/fast_food/burger/モスバーガー":{name:"モスバーガー",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1204169"},addTags:{amenity:"fast_food",brand:"モスバーガー","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"ja:モスバーガー",cuisine:"burger",name:"モスバーガー","name:en":"MOS Burger"},removeTags:{amenity:"fast_food",brand:"モスバーガー","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"ja:モスバーガー",cuisine:"burger",name:"モスバーガー","name:en":"MOS Burger"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/ロッテリア":{name:"ロッテリア",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q249525"},addTags:{amenity:"fast_food",brand:"ロッテリア","brand:en":"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"ja:ロッテリア",cuisine:"burger",name:"ロッテリア","name:en":"Lotteria"},removeTags:{amenity:"fast_food",brand:"ロッテリア","brand:en":"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"ja:ロッテリア",cuisine:"burger",name:"ロッテリア","name:en":"Lotteria"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/吉野家":{name:"吉野家",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q776272"},addTags:{amenity:"fast_food",brand:"吉野家","brand:en":"Yoshinoya","brand:wikidata":"Q776272","brand:wikipedia":"ja:吉野家",name:"吉野家","name:en":"Yoshinoya"},removeTags:{amenity:"fast_food",brand:"吉野家","brand:en":"Yoshinoya","brand:wikidata":"Q776272","brand:wikipedia":"ja:吉野家",name:"吉野家","name:en":"Yoshinoya"},matchScore:2,suggestion:true},"amenity/fast_food/富士そば":{name:"富士そば",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q11414722"},addTags:{amenity:"fast_food",brand:"富士そば","brand:en":"Fuji Soba","brand:wikidata":"Q11414722","brand:wikipedia":"ja:名代富士そば",name:"富士そば","name:en":"Fuji Soba"},removeTags:{amenity:"fast_food",brand:"富士そば","brand:en":"Fuji Soba","brand:wikidata":"Q11414722","brand:wikipedia":"ja:名代富士そば",name:"富士そば","name:en":"Fuji Soba"},matchScore:2,suggestion:true},"amenity/fast_food/幸楽苑":{name:"幸楽苑",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q11484003"},addTags:{amenity:"fast_food",brand:"幸楽苑","brand:en":"Kourakuen","brand:wikidata":"Q11484003","brand:wikipedia":"ja:幸楽苑",name:"幸楽苑","name:en":"Kourakuen"},removeTags:{amenity:"fast_food",brand:"幸楽苑","brand:en":"Kourakuen","brand:wikidata":"Q11484003","brand:wikipedia":"ja:幸楽苑",name:"幸楽苑","name:en":"Kourakuen"},matchScore:2,suggestion:true},"amenity/fast_food/burger/摩斯漢堡":{name:"摩斯漢堡",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1204169"},addTags:{amenity:"fast_food",brand:"摩斯漢堡","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"zh:摩斯漢堡",cuisine:"burger",name:"摩斯漢堡","name:en":"MOS Burger"},removeTags:{amenity:"fast_food",brand:"摩斯漢堡","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"zh:摩斯漢堡",cuisine:"burger",name:"摩斯漢堡","name:en":"MOS Burger"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/松屋":{name:"松屋",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q848773"},addTags:{amenity:"fast_food",brand:"松屋","brand:en":"Matsuya Foods","brand:wikidata":"Q848773","brand:wikipedia":"zh:松屋食品",name:"松屋","name:en":"Matsuya Foods"},removeTags:{amenity:"fast_food",brand:"松屋","brand:en":"Matsuya Foods","brand:wikidata":"Q848773","brand:wikipedia":"zh:松屋食品",name:"松屋","name:en":"Matsuya Foods"},matchScore:2,suggestion:true},"amenity/fast_food/肯德基":{name:"肯德基",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q524757"},addTags:{amenity:"fast_food",brand:"肯德基","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"zh:肯德基",name:"肯德基","name:en":"KFC"},removeTags:{amenity:"fast_food",brand:"肯德基","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"zh:肯德基",name:"肯德基","name:en":"KFC"},matchScore:2,suggestion:true},"amenity/fast_food/burger/麥當勞":{name:"麥當勞",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"麥當勞","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh_classical:麥當勞",cuisine:"burger",name:"麥當勞","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"麥當勞","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh_classical:麥當勞",cuisine:"burger",name:"麥當勞","name:en":"McDonald's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/麦当劳":{name:"麦当劳",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"麦当劳","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh:麦当劳",cuisine:"burger",name:"麦当劳","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"麦当劳","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh:麦当劳",cuisine:"burger",name:"麦当劳","name:en":"McDonald's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/롯데리아":{name:"롯데리아",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q249525"},addTags:{amenity:"fast_food",brand:"롯데리아","brand:en":"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"ko:롯데리아",cuisine:"burger",name:"롯데리아","name:en":"Lotteria"},removeTags:{amenity:"fast_food",brand:"롯데리아","brand:en":"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"ko:롯데리아",cuisine:"burger",name:"롯데리아","name:en":"Lotteria"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fuel/1-2-3":{name:"1-2-3",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4545742"},addTags:{amenity:"fuel",brand:"1-2-3","brand:wikidata":"Q4545742","brand:wikipedia":"en:1-2-3 (fuel station)",name:"1-2-3"},removeTags:{amenity:"fuel",brand:"1-2-3","brand:wikidata":"Q4545742","brand:wikipedia":"en:1-2-3 (fuel station)",name:"1-2-3"},matchScore:2,suggestion:true},"amenity/fuel/7-Eleven":{name:"7-Eleven",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q259340"},addTags:{amenity:"fuel",brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven"},removeTags:{amenity:"fuel",brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven"},matchScore:2,suggestion:true},"amenity/fuel/ABC":{name:"ABC",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q10397504"},addTags:{amenity:"fuel",brand:"ABC","brand:wikidata":"Q10397504","brand:wikipedia":"fi:ABC-ketju",name:"ABC"},removeTags:{amenity:"fuel",brand:"ABC","brand:wikidata":"Q10397504","brand:wikipedia":"fi:ABC-ketju",name:"ABC"},matchScore:2,suggestion:true},"amenity/fuel/ADNOC":{name:"ADNOC",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q166729"},addTags:{amenity:"fuel",brand:"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ADNOC"},removeTags:{amenity:"fuel",brand:"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ADNOC"},matchScore:2,suggestion:true},"amenity/fuel/Afriquia":{name:"Afriquia",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2829178"},addTags:{amenity:"fuel",brand:"Afriquia","brand:wikidata":"Q2829178","brand:wikipedia":"en:Akwa Group",name:"Afriquia"},removeTags:{amenity:"fuel",brand:"Afriquia","brand:wikidata":"Q2829178","brand:wikipedia":"en:Akwa Group",name:"Afriquia"},matchScore:2,suggestion:true},"amenity/fuel/Agip":{name:"Agip",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q377915"},addTags:{amenity:"fuel",brand:"Agip","brand:wikidata":"Q377915","brand:wikipedia":"en:Agip",name:"Agip"},removeTags:{amenity:"fuel",brand:"Agip","brand:wikidata":"Q377915","brand:wikipedia":"en:Agip",name:"Agip"},matchScore:2,suggestion:true},"amenity/fuel/Agrola":{name:"Agrola",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q397351"},addTags:{amenity:"fuel",brand:"Agrola","brand:wikidata":"Q397351","brand:wikipedia":"de:Agrola",name:"Agrola"},removeTags:{amenity:"fuel",brand:"Agrola","brand:wikidata":"Q397351","brand:wikipedia":"de:Agrola",name:"Agrola"},matchScore:2,suggestion:true},"amenity/fuel/Api":{name:"Api",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q466043"},addTags:{amenity:"fuel",brand:"Api","brand:wikidata":"Q466043","brand:wikipedia":"en:American Petroleum Institute",name:"Api"},removeTags:{amenity:"fuel",brand:"Api","brand:wikidata":"Q466043","brand:wikipedia":"en:American Petroleum Institute",name:"Api"},matchScore:2,suggestion:true},"amenity/fuel/Aral":{name:"Aral",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q565734"},addTags:{amenity:"fuel",brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral"},removeTags:{amenity:"fuel",brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral"},matchScore:2,suggestion:true},"amenity/fuel/Arco":{name:"Arco",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q304769"},addTags:{amenity:"fuel",brand:"Arco","brand:wikidata":"Q304769","brand:wikipedia":"en:ARCO",name:"Arco"},removeTags:{amenity:"fuel",brand:"Arco","brand:wikidata":"Q304769","brand:wikipedia":"en:ARCO",name:"Arco"},matchScore:2,suggestion:true},"amenity/fuel/Asda":{name:"Asda",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q297410"},addTags:{amenity:"fuel",brand:"Asda","brand:wikidata":"Q297410","brand:wikipedia":"en:Asda",name:"Asda"},removeTags:{amenity:"fuel",brand:"Asda","brand:wikidata":"Q297410","brand:wikipedia":"en:Asda",name:"Asda"},matchScore:2,suggestion:true},"amenity/fuel/Auchan":{name:"Auchan",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q758603"},addTags:{amenity:"fuel",brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan"},removeTags:{amenity:"fuel",brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan"},matchScore:2,suggestion:true},"amenity/fuel/Avanti":{name:"Avanti",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q168238"},addTags:{amenity:"fuel",brand:"Avanti","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"Avanti"},removeTags:{amenity:"fuel",brand:"Avanti","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"Avanti"},matchScore:2,suggestion:true},"amenity/fuel/Avia":{name:"Avia",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q300147"},addTags:{amenity:"fuel",brand:"Avia","brand:wikidata":"Q300147","brand:wikipedia":"de:Avia International",name:"Avia"},removeTags:{amenity:"fuel",brand:"Avia","brand:wikidata":"Q300147","brand:wikipedia":"de:Avia International",name:"Avia"},matchScore:2,suggestion:true},"amenity/fuel/Avin":{name:"Avin",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q19903165"},addTags:{amenity:"fuel",brand:"Avin","brand:wikidata":"Q19903165","brand:wikipedia":"en:Avin International",name:"Avin"},removeTags:{amenity:"fuel",brand:"Avin","brand:wikidata":"Q19903165","brand:wikipedia":"en:Avin International",name:"Avin"},matchScore:2,suggestion:true},"amenity/fuel/BP":{name:"BP",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q152057"},addTags:{amenity:"fuel",brand:"BP","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP"},removeTags:{amenity:"fuel",brand:"BP","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP"},matchScore:2,suggestion:true},"amenity/fuel/Bangchak":{name:"Bangchak",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q6579719"},addTags:{amenity:"fuel",brand:"Bangchak","brand:wikidata":"Q6579719","brand:wikipedia":"zh:曼差石油股份",name:"Bangchak"},removeTags:{amenity:"fuel",brand:"Bangchak","brand:wikidata":"Q6579719","brand:wikipedia":"zh:曼差石油股份",name:"Bangchak"},matchScore:2,suggestion:true},"amenity/fuel/Bharat Petroleum":{name:"Bharat Petroleum",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q854826"},addTags:{amenity:"fuel",brand:"Bharat Petroleum","brand:wikidata":"Q854826","brand:wikipedia":"en:Bharat Petroleum",name:"Bharat Petroleum"},removeTags:{amenity:"fuel",brand:"Bharat Petroleum","brand:wikidata":"Q854826","brand:wikipedia":"en:Bharat Petroleum",name:"Bharat Petroleum"},matchScore:2,suggestion:true},"amenity/fuel/Bliska":{name:"Bliska",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4016378"},addTags:{amenity:"fuel",brand:"Bliska","brand:wikidata":"Q4016378","brand:wikipedia":"pl:Bliska",name:"Bliska"},removeTags:{amenity:"fuel",brand:"Bliska","brand:wikidata":"Q4016378","brand:wikipedia":"pl:Bliska",name:"Bliska"},matchScore:2,suggestion:true},"amenity/fuel/CAMPSA":{name:"CAMPSA",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1031623"},addTags:{amenity:"fuel",brand:"CAMPSA","brand:wikidata":"Q1031623","brand:wikipedia":"en:Campsa",name:"CAMPSA"},removeTags:{amenity:"fuel",brand:"CAMPSA","brand:wikidata":"Q1031623","brand:wikipedia":"en:Campsa",name:"CAMPSA"},matchScore:2,suggestion:true},"amenity/fuel/CEPSA":{name:"CEPSA",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q608819"},addTags:{amenity:"fuel",brand:"CEPSA","brand:wikidata":"Q608819","brand:wikipedia":"en:Compañía Española de Petróleos",name:"CEPSA"},removeTags:{amenity:"fuel",brand:"CEPSA","brand:wikidata":"Q608819","brand:wikipedia":"en:Compañía Española de Petróleos",name:"CEPSA"},matchScore:2,suggestion:true},"amenity/fuel/Caltex":{name:"Caltex",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q277470"},addTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q277470","brand:wikipedia":"en:Caltex",name:"Caltex"},removeTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q277470","brand:wikipedia":"en:Caltex",name:"Caltex"},matchScore:2,suggestion:true},"amenity/fuel/Canadian Tire Gas+":{name:"Canadian Tire Gas+",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1032400"},addTags:{amenity:"fuel",brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire"},removeTags:{amenity:"fuel",brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire"},matchScore:2,suggestion:true},"amenity/fuel/Carrefour Market":{name:"Carrefour Market",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q217599"},addTags:{amenity:"fuel",brand:"Carrefour Market","brand:wikidata":"Q217599","brand:wikipedia":"en:Carrefour",name:"Carrefour Market"},removeTags:{amenity:"fuel",brand:"Carrefour Market","brand:wikidata":"Q217599","brand:wikipedia":"en:Carrefour",name:"Carrefour Market"},matchScore:2,suggestion:true},"amenity/fuel/Casey's General Store":{name:"Casey's General Store",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2940968"},addTags:{amenity:"fuel",brand:"Casey's General Store","brand:wikidata":"Q2940968","brand:wikipedia":"en:Casey's General Stores",name:"Casey's General Store"},removeTags:{amenity:"fuel",brand:"Casey's General Store","brand:wikidata":"Q2940968","brand:wikipedia":"en:Casey's General Stores",name:"Casey's General Store"},matchScore:2,suggestion:true},"amenity/fuel/Cenex":{name:"Cenex",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5011381"},addTags:{amenity:"fuel",brand:"Cenex","brand:wikidata":"Q5011381","brand:wikipedia":"en:CHS Inc.",name:"Cenex"},removeTags:{amenity:"fuel",brand:"Cenex","brand:wikidata":"Q5011381","brand:wikipedia":"en:CHS Inc.",name:"Cenex"},matchScore:2,suggestion:true},"amenity/fuel/Ceypetco":{name:"Ceypetco",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5065795"},addTags:{amenity:"fuel",brand:"Ceypetco","brand:wikidata":"Q5065795","brand:wikipedia":"en:Ceylon Petroleum Corporation",name:"Ceypetco"},removeTags:{amenity:"fuel",brand:"Ceypetco","brand:wikidata":"Q5065795","brand:wikipedia":"en:Ceylon Petroleum Corporation",name:"Ceypetco"},matchScore:2,suggestion:true},"amenity/fuel/Chevron":{name:"Chevron",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q319642"},addTags:{amenity:"fuel",brand:"Chevron","brand:wikidata":"Q319642","brand:wikipedia":"en:Chevron Corporation",name:"Chevron"},removeTags:{amenity:"fuel",brand:"Chevron","brand:wikidata":"Q319642","brand:wikipedia":"en:Chevron Corporation",name:"Chevron"},matchScore:2,suggestion:true},"amenity/fuel/Circle K":{name:"Circle K",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3268010"},addTags:{amenity:"fuel",brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K"},removeTags:{amenity:"fuel",brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K"},matchScore:2,suggestion:true},"amenity/fuel/Citgo":{name:"Citgo",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2974437"},addTags:{amenity:"fuel",brand:"Citgo","brand:wikidata":"Q2974437","brand:wikipedia":"en:Citgo",name:"Citgo"},removeTags:{amenity:"fuel",brand:"Citgo","brand:wikidata":"Q2974437","brand:wikipedia":"en:Citgo",name:"Citgo"},matchScore:2,suggestion:true},"amenity/fuel/Clark":{name:"Clark",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5127157"},addTags:{amenity:"fuel",brand:"Clark","brand:wikidata":"Q5127157","brand:wikipedia":"en:Clark Brands",name:"Clark"},removeTags:{amenity:"fuel",brand:"Clark","brand:wikidata":"Q5127157","brand:wikipedia":"en:Clark Brands",name:"Clark"},matchScore:2,suggestion:true},"amenity/fuel/Co-op":{name:"Co-op",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5440676"},addTags:{amenity:"fuel",brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op"},removeTags:{amenity:"fuel",brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op"},matchScore:2,suggestion:true},"amenity/fuel/Coles Express":{name:"Coles Express",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5144653"},addTags:{amenity:"fuel",brand:"Coles Express","brand:wikidata":"Q5144653","brand:wikipedia":"en:Coles Express",name:"Coles Express"},removeTags:{amenity:"fuel",brand:"Coles Express","brand:wikidata":"Q5144653","brand:wikipedia":"en:Coles Express",name:"Coles Express"},matchScore:2,suggestion:true},"amenity/fuel/Conoco":{name:"Conoco",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1126518"},addTags:{amenity:"fuel",brand:"Conoco","brand:wikidata":"Q1126518","brand:wikipedia":"en:Conoco",name:"Conoco"},removeTags:{amenity:"fuel",brand:"Conoco","brand:wikidata":"Q1126518","brand:wikipedia":"en:Conoco",name:"Conoco"},matchScore:2,suggestion:true},"amenity/fuel/Copec":{name:"Copec",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q11681461"},addTags:{amenity:"fuel",brand:"Copec","brand:wikidata":"Q11681461","brand:wikipedia":"en:Empresas Copec",name:"Copec"},removeTags:{amenity:"fuel",brand:"Copec","brand:wikidata":"Q11681461","brand:wikipedia":"en:Empresas Copec",name:"Copec"},matchScore:2,suggestion:true},"amenity/fuel/Cosmo":{name:"Cosmo",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2498318"},addTags:{amenity:"fuel",brand:"Cosmo","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"Cosmo"},removeTags:{amenity:"fuel",brand:"Cosmo","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"Cosmo"},matchScore:2,suggestion:true},"amenity/fuel/Costco Gasoline":{name:"Costco Gasoline",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q715583"},addTags:{amenity:"fuel",brand:"Costco Gasoline","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Gasoline"},removeTags:{amenity:"fuel",brand:"Costco Gasoline","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Gasoline"},matchScore:2,suggestion:true},"amenity/fuel/Couche-Tard":{name:"Couche-Tard",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2836957"},addTags:{amenity:"fuel",brand:"Couche-Tard","brand:wikidata":"Q2836957","brand:wikipedia":"en:Alimentation Couche-Tard",name:"Couche-Tard"},removeTags:{amenity:"fuel",brand:"Couche-Tard","brand:wikidata":"Q2836957","brand:wikipedia":"en:Alimentation Couche-Tard",name:"Couche-Tard"},matchScore:2,suggestion:true},"amenity/fuel/Crevier":{name:"Crevier",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q61743451"},addTags:{amenity:"fuel",brand:"Crevier","brand:wikidata":"Q61743451",name:"Crevier"},removeTags:{amenity:"fuel",brand:"Crevier","brand:wikidata":"Q61743451",name:"Crevier"},matchScore:2,suggestion:true},"amenity/fuel/Cumberland Farms":{name:"Cumberland Farms",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1143685"},addTags:{amenity:"fuel",brand:"Cumberland Farms","brand:wikidata":"Q1143685","brand:wikipedia":"en:Cumberland Farms",name:"Cumberland Farms"},removeTags:{amenity:"fuel",brand:"Cumberland Farms","brand:wikidata":"Q1143685","brand:wikipedia":"en:Cumberland Farms",name:"Cumberland Farms"},matchScore:2,suggestion:true},"amenity/fuel/Diamond Shamrock":{name:"Diamond Shamrock",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q16973722"},addTags:{amenity:"fuel",brand:"Diamond Shamrock","brand:wikidata":"Q16973722","brand:wikipedia":"en:Diamond Shamrock",name:"Diamond Shamrock"},removeTags:{amenity:"fuel",brand:"Diamond Shamrock","brand:wikidata":"Q16973722","brand:wikipedia":"en:Diamond Shamrock",name:"Diamond Shamrock"},matchScore:2,suggestion:true},"amenity/fuel/Domo":{name:"Domo",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5291326"},addTags:{amenity:"fuel",brand:"Domo","brand:wikidata":"Q5291326","brand:wikipedia":"en:Domo Gasoline",name:"Domo"},removeTags:{amenity:"fuel",brand:"Domo","brand:wikidata":"Q5291326","brand:wikipedia":"en:Domo Gasoline",name:"Domo"},matchScore:2,suggestion:true},"amenity/fuel/EKO (Canada)":{name:"EKO (Canada)",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3045934"},addTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q3045934","brand:wikipedia":"fr:EKO",name:"EKO"},removeTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q3045934","brand:wikipedia":"fr:EKO",name:"EKO"},matchScore:2,suggestion:true},"amenity/fuel/EKO (Greece)":{name:"EKO (Greece)",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q903198"},addTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q903198","brand:wikipedia":"el:Ελληνικά Πετρέλαια",name:"EKO"},removeTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q903198","brand:wikipedia":"el:Ελληνικά Πετρέλαια",name:"EKO"},matchScore:2,suggestion:true},"amenity/fuel/ENEOS":{name:"ENEOS",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1640290"},addTags:{amenity:"fuel",brand:"ENEOS","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"ENEOS"},removeTags:{amenity:"fuel",brand:"ENEOS","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"ENEOS"},matchScore:2,suggestion:true},"amenity/fuel/Elan":{name:"Elan",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q57980752"},addTags:{amenity:"fuel",brand:"Elan","brand:wikidata":"Q57980752",name:"Elan"},removeTags:{amenity:"fuel",brand:"Elan","brand:wikidata":"Q57980752",name:"Elan"},matchScore:2,suggestion:true},"amenity/fuel/Engen":{name:"Engen",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3054251"},addTags:{amenity:"fuel",brand:"Engen","brand:wikidata":"Q3054251","brand:wikipedia":"en:Engen Petroleum",name:"Engen"},removeTags:{amenity:"fuel",brand:"Engen","brand:wikidata":"Q3054251","brand:wikipedia":"en:Engen Petroleum",name:"Engen"},matchScore:2,suggestion:true},"amenity/fuel/Eni":{name:"Eni",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q565594"},addTags:{amenity:"fuel",brand:"Eni","brand:wikidata":"Q565594","brand:wikipedia":"en:Eni",name:"Eni"},removeTags:{amenity:"fuel",brand:"Eni","brand:wikidata":"Q565594","brand:wikipedia":"en:Eni",name:"Eni"},matchScore:2,suggestion:true},"amenity/fuel/Erg":{name:"Erg",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q739503"},addTags:{amenity:"fuel",brand:"Erg","brand:wikidata":"Q739503","brand:wikipedia":"it:ERG (azienda)",name:"Erg"},removeTags:{amenity:"fuel",brand:"Erg","brand:wikidata":"Q739503","brand:wikipedia":"it:ERG (azienda)",name:"Erg"},matchScore:2,suggestion:true},"amenity/fuel/Esso":{name:"Esso",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q867662"},addTags:{amenity:"fuel",brand:"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"Esso"},removeTags:{amenity:"fuel",brand:"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"Esso"},matchScore:2,suggestion:true},"amenity/fuel/Esso Express":{name:"Esso Express",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2350336"},addTags:{amenity:"fuel",brand:"Esso Express","brand:wikidata":"Q2350336","brand:wikipedia":"nl:Esso Express",name:"Esso Express"},removeTags:{amenity:"fuel",brand:"Esso Express","brand:wikidata":"Q2350336","brand:wikipedia":"nl:Esso Express",name:"Esso Express"},matchScore:2,suggestion:true},"amenity/fuel/Exxon":{name:"Exxon",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4781944"},addTags:{amenity:"fuel",brand:"Exxon","brand:wikidata":"Q4781944","brand:wikipedia":"en:Exxon",name:"Exxon"},removeTags:{amenity:"fuel",brand:"Exxon","brand:wikidata":"Q4781944","brand:wikipedia":"en:Exxon",name:"Exxon"},matchScore:2,suggestion:true},"amenity/fuel/Fas Gas":{name:"Fas Gas",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q61743505"},addTags:{amenity:"fuel",brand:"Fas Gas","brand:wikidata":"Q61743505","brand:wikipedia":"en:Parkland Fuel",name:"Fas Gas"},removeTags:{amenity:"fuel",brand:"Fas Gas","brand:wikidata":"Q61743505","brand:wikipedia":"en:Parkland Fuel",name:"Fas Gas"},matchScore:2,suggestion:true},"amenity/fuel/Firezone":{name:"Firezone",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q14628080"},addTags:{amenity:"fuel",brand:"Firezone","brand:wikidata":"Q14628080","brand:wikipedia":"nl:Firezone",name:"Firezone"},removeTags:{amenity:"fuel",brand:"Firezone","brand:wikidata":"Q14628080","brand:wikipedia":"nl:Firezone",name:"Firezone"},matchScore:2,suggestion:true},"amenity/fuel/Flying J":{name:"Flying J",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1434601"},addTags:{amenity:"fuel",brand:"Flying J","brand:wikidata":"Q1434601","brand:wikipedia":"en:Pilot Flying J",name:"Flying J"},removeTags:{amenity:"fuel",brand:"Flying J","brand:wikidata":"Q1434601","brand:wikipedia":"en:Pilot Flying J",name:"Flying J"},matchScore:2,suggestion:true},"amenity/fuel/Freie Tankstelle":{name:"Freie Tankstelle",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1009104"},addTags:{amenity:"fuel",brand:"Freie Tankstelle","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"Freie Tankstelle"},removeTags:{amenity:"fuel",brand:"Freie Tankstelle","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"Freie Tankstelle"},matchScore:2,suggestion:true},"amenity/fuel/GALP":{name:"GALP",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1492739"},addTags:{amenity:"fuel",brand:"GALP","brand:wikidata":"Q1492739","brand:wikipedia":"en:Galp Energia",name:"GALP"},removeTags:{amenity:"fuel",brand:"GALP","brand:wikidata":"Q1492739","brand:wikipedia":"en:Galp Energia",name:"GALP"},matchScore:2,suggestion:true},"amenity/fuel/Gazprom":{name:"Gazprom",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q102673"},addTags:{amenity:"fuel",brand:"Gazprom","brand:wikidata":"Q102673","brand:wikipedia":"en:Gazprom",name:"Gazprom"},removeTags:{amenity:"fuel",brand:"Gazprom","brand:wikidata":"Q102673","brand:wikipedia":"en:Gazprom",name:"Gazprom"},matchScore:2,suggestion:true},"amenity/fuel/GetGo":{name:"GetGo",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5553766"},addTags:{amenity:"fuel",brand:"GetGo","brand:wikidata":"Q5553766","brand:wikipedia":"en:GetGo",name:"GetGo"},removeTags:{amenity:"fuel",brand:"GetGo","brand:wikidata":"Q5553766","brand:wikipedia":"en:GetGo",name:"GetGo"},matchScore:2,suggestion:true},"amenity/fuel/Goil":{name:"Goil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5555383"},addTags:{amenity:"fuel",brand:"Goil","brand:wikidata":"Q5555383","brand:wikipedia":"en:Ghana Oil Company",name:"Goil"},removeTags:{amenity:"fuel",brand:"Goil","brand:wikidata":"Q5555383","brand:wikipedia":"en:Ghana Oil Company",name:"Goil"},matchScore:2,suggestion:true},"amenity/fuel/Gulf":{name:"Gulf",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1296860"},addTags:{amenity:"fuel",brand:"Gulf","brand:wikidata":"Q1296860","brand:wikipedia":"en:Gulf Oil",name:"Gulf"},removeTags:{amenity:"fuel",brand:"Gulf","brand:wikidata":"Q1296860","brand:wikipedia":"en:Gulf Oil",name:"Gulf"},matchScore:2,suggestion:true},"amenity/fuel/Gull":{name:"Gull",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5617739"},addTags:{amenity:"fuel",brand:"Gull","brand:wikidata":"Q5617739","brand:wikipedia":"en:Gull Petroleum",name:"Gull"},removeTags:{amenity:"fuel",brand:"Gull","brand:wikidata":"Q5617739","brand:wikipedia":"en:Gull Petroleum",name:"Gull"},matchScore:2,suggestion:true},"amenity/fuel/H-E-B Fuel":{name:"H-E-B Fuel",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q830621"},addTags:{amenity:"fuel",brand:"H-E-B Fuel","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B Fuel"},removeTags:{amenity:"fuel",brand:"H-E-B Fuel","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B Fuel"},matchScore:2,suggestion:true},"amenity/fuel/HEM":{name:"HEM",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1563517"},addTags:{amenity:"fuel",brand:"HEM","brand:wikidata":"Q1563517","brand:wikipedia":"de:Deutsche Tamoil",name:"HEM"},removeTags:{amenity:"fuel",brand:"HEM","brand:wikidata":"Q1563517","brand:wikipedia":"de:Deutsche Tamoil",name:"HEM"},matchScore:2,suggestion:true},"amenity/fuel/Harnois":{name:"Harnois",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q61743558"},addTags:{amenity:"fuel",brand:"Harnois","brand:wikidata":"Q61743558",name:"Harnois"},removeTags:{amenity:"fuel",brand:"Harnois","brand:wikidata":"Q61743558",name:"Harnois"},matchScore:2,suggestion:true},"amenity/fuel/Hess":{name:"Hess",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1615684"},addTags:{amenity:"fuel",brand:"Hess","brand:wikidata":"Q1615684","brand:wikipedia":"en:Hess Corporation",name:"Hess"},removeTags:{amenity:"fuel",brand:"Hess","brand:wikidata":"Q1615684","brand:wikipedia":"en:Hess Corporation",name:"Hess"},matchScore:2,suggestion:true},"amenity/fuel/Hindustan Petroleum":{name:"Hindustan Petroleum",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1619375"},addTags:{amenity:"fuel",brand:"Hindustan Petroleum","brand:wikidata":"Q1619375","brand:wikipedia":"en:Hindustan Petroleum",name:"Hindustan Petroleum"},removeTags:{amenity:"fuel",brand:"Hindustan Petroleum","brand:wikidata":"Q1619375","brand:wikipedia":"en:Hindustan Petroleum",name:"Hindustan Petroleum"},matchScore:2,suggestion:true},"amenity/fuel/Hofer":{name:"Hofer",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q15815751"},addTags:{amenity:"fuel",brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer"},removeTags:{amenity:"fuel",brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer"},matchScore:2,suggestion:true},"amenity/fuel/Holiday":{name:"Holiday",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5880490"},addTags:{amenity:"fuel",brand:"Holiday","brand:wikidata":"Q5880490","brand:wikipedia":"en:Holiday Stationstores",name:"Holiday"},removeTags:{amenity:"fuel",brand:"Holiday","brand:wikidata":"Q5880490","brand:wikipedia":"en:Holiday Stationstores",name:"Holiday"},matchScore:2,suggestion:true},"amenity/fuel/IP":{name:"IP",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q646807"},addTags:{amenity:"fuel",brand:"IP","brand:wikidata":"Q646807","brand:wikipedia":"en:Anonima Petroli Italiana",name:"IP"},removeTags:{amenity:"fuel",brand:"IP","brand:wikidata":"Q646807","brand:wikipedia":"en:Anonima Petroli Italiana",name:"IP"},matchScore:2,suggestion:true},"amenity/fuel/Indian Oil":{name:"Indian Oil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1289348"},addTags:{amenity:"fuel",brand:"Indian Oil","brand:wikidata":"Q1289348","brand:wikipedia":"en:Indian Oil Corporation",name:"Indian Oil"},removeTags:{amenity:"fuel",brand:"Indian Oil","brand:wikidata":"Q1289348","brand:wikipedia":"en:Indian Oil Corporation",name:"Indian Oil"},matchScore:2,suggestion:true},"amenity/fuel/Ingo":{name:"Ingo",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q17048617"},addTags:{amenity:"fuel",brand:"Ingo","brand:wikidata":"Q17048617","brand:wikipedia":"en:Ingo (brand)",name:"Ingo"},removeTags:{amenity:"fuel",brand:"Ingo","brand:wikidata":"Q17048617","brand:wikipedia":"en:Ingo (brand)",name:"Ingo"},matchScore:2,suggestion:true},"amenity/fuel/Intermarché":{name:"Intermarché",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3153200"},addTags:{amenity:"fuel",brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché"},removeTags:{amenity:"fuel",brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché"},matchScore:2,suggestion:true},"amenity/fuel/Ipiranga":{name:"Ipiranga",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2081136"},addTags:{amenity:"fuel",brand:"Ipiranga","brand:wikidata":"Q2081136","brand:wikipedia":"pt:Ipiranga (empresa)",name:"Ipiranga"},removeTags:{amenity:"fuel",brand:"Ipiranga","brand:wikidata":"Q2081136","brand:wikipedia":"pt:Ipiranga (empresa)",name:"Ipiranga"},matchScore:2,suggestion:true},"amenity/fuel/Irving":{name:"Irving",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1673286"},addTags:{amenity:"fuel",brand:"Irving","brand:wikidata":"Q1673286","brand:wikipedia":"en:Irving Oil",name:"Irving"},removeTags:{amenity:"fuel",brand:"Irving","brand:wikidata":"Q1673286","brand:wikipedia":"en:Irving Oil",name:"Irving"},matchScore:2,suggestion:true},"amenity/fuel/JA-SS":{name:"JA-SS",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q11225213"},addTags:{amenity:"fuel",brand:"JA-SS","brand:wikidata":"Q11225213","brand:wikipedia":"ja:JA-SS",name:"JA-SS"},removeTags:{amenity:"fuel",brand:"JA-SS","brand:wikidata":"Q11225213","brand:wikipedia":"ja:JA-SS",name:"JA-SS"},matchScore:2,suggestion:true},"amenity/fuel/Jet":{name:"Jet",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q568940"},addTags:{amenity:"fuel",brand:"Jet","brand:wikidata":"Q568940","brand:wikipedia":"en:Jet (brand)",name:"Jet"},removeTags:{amenity:"fuel",brand:"Jet","brand:wikidata":"Q568940","brand:wikipedia":"en:Jet (brand)",name:"Jet"},matchScore:2,suggestion:true},"amenity/fuel/Kobil":{name:"Kobil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q22906119"},addTags:{amenity:"fuel",brand:"Kobil","brand:wikidata":"Q22906119","brand:wikipedia":"en:KenolKobil",name:"Kobil"},removeTags:{amenity:"fuel",brand:"Kobil","brand:wikidata":"Q22906119","brand:wikipedia":"en:KenolKobil",name:"Kobil"},matchScore:2,suggestion:true},"amenity/fuel/Kroger":{name:"Kroger",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q153417"},addTags:{amenity:"fuel",brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger"},removeTags:{amenity:"fuel",brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger"},matchScore:2,suggestion:true},"amenity/fuel/Kum & Go":{name:"Kum & Go",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q6443340"},addTags:{amenity:"fuel",brand:"Kum & Go","brand:wikidata":"Q6443340","brand:wikipedia":"en:Kum & Go",name:"Kum & Go"},removeTags:{amenity:"fuel",brand:"Kum & Go","brand:wikidata":"Q6443340","brand:wikipedia":"en:Kum & Go",name:"Kum & Go"},matchScore:2,suggestion:true},"amenity/fuel/Kwik Trip":{name:"Kwik Trip",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q6450420"},addTags:{amenity:"fuel",brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip"},removeTags:{amenity:"fuel",brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip"},matchScore:2,suggestion:true},"amenity/fuel/Lotos":{name:"Lotos",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1256909"},addTags:{amenity:"fuel",brand:"Lotos","brand:wikidata":"Q1256909","brand:wikipedia":"en:Grupa Lotos",name:"Lotos"},removeTags:{amenity:"fuel",brand:"Lotos","brand:wikidata":"Q1256909","brand:wikipedia":"en:Grupa Lotos",name:"Lotos"},matchScore:2,suggestion:true},"amenity/fuel/Love's":{name:"Love's",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1872496"},addTags:{amenity:"fuel",brand:"Love's","brand:wikidata":"Q1872496","brand:wikipedia":"en:Love's Travel Stops & Country Stores",name:"Love's"},removeTags:{amenity:"fuel",brand:"Love's","brand:wikidata":"Q1872496","brand:wikipedia":"en:Love's Travel Stops & Country Stores",name:"Love's"},matchScore:2,suggestion:true},"amenity/fuel/Lukoil":{name:"Lukoil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q329347"},addTags:{amenity:"fuel",brand:"Lukoil","brand:wikidata":"Q329347","brand:wikipedia":"en:Lukoil",name:"Lukoil"},removeTags:{amenity:"fuel",brand:"Lukoil","brand:wikidata":"Q329347","brand:wikipedia":"en:Lukoil",name:"Lukoil"},matchScore:2,suggestion:true},"amenity/fuel/MOL":{name:"MOL",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q549181"},addTags:{amenity:"fuel",brand:"MOL","brand:wikidata":"Q549181","brand:wikipedia":"en:MOL (company)",name:"MOL"},removeTags:{amenity:"fuel",brand:"MOL","brand:wikidata":"Q549181","brand:wikipedia":"en:MOL (company)",name:"MOL"},matchScore:2,suggestion:true},"amenity/fuel/MRS":{name:"MRS",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q56274919"},addTags:{amenity:"fuel",brand:"MRS","brand:wikidata":"Q56274919","brand:wikipedia":"en:MRS Oil Nigeria Plc",name:"MRS"},removeTags:{amenity:"fuel",brand:"MRS","brand:wikidata":"Q56274919","brand:wikipedia":"en:MRS Oil Nigeria Plc",name:"MRS"},matchScore:2,suggestion:true},"amenity/fuel/Mac's":{name:"Mac's",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4043527"},addTags:{amenity:"fuel",brand:"Mac's","brand:wikidata":"Q4043527","brand:wikipedia":"en:Mac's Convenience Stores",name:"Mac's"},removeTags:{amenity:"fuel",brand:"Mac's","brand:wikidata":"Q4043527","brand:wikipedia":"en:Mac's Convenience Stores",name:"Mac's"},matchScore:2,suggestion:true},"amenity/fuel/MacEwen":{name:"MacEwen",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q61740335"},addTags:{amenity:"fuel",brand:"MacEwen","brand:wikidata":"Q61740335",name:"MacEwen"},removeTags:{amenity:"fuel",brand:"MacEwen","brand:wikidata":"Q61740335",name:"MacEwen"},matchScore:2,suggestion:true},"amenity/fuel/Marathon":{name:"Marathon",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q458363"},addTags:{amenity:"fuel",brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon"},removeTags:{amenity:"fuel",brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon"},matchScore:2,suggestion:true},"amenity/fuel/Maverik":{name:"Maverik",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q16974822"},addTags:{amenity:"fuel",brand:"Maverik","brand:wikidata":"Q16974822","brand:wikipedia":"en:FJ Management",name:"Maverik"},removeTags:{amenity:"fuel",brand:"Maverik","brand:wikidata":"Q16974822","brand:wikipedia":"en:FJ Management",name:"Maverik"},matchScore:2,suggestion:true},"amenity/fuel/Maxol":{name:"Maxol",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3302837"},addTags:{amenity:"fuel",brand:"Maxol","brand:wikidata":"Q3302837","brand:wikipedia":"en:Maxol",name:"Maxol"},removeTags:{amenity:"fuel",brand:"Maxol","brand:wikidata":"Q3302837","brand:wikipedia":"en:Maxol",name:"Maxol"},matchScore:2,suggestion:true},"amenity/fuel/Migrol":{name:"Migrol",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1747771"},addTags:{amenity:"fuel",brand:"Migrol","brand:wikidata":"Q1747771","brand:wikipedia":"de:Migrol",name:"Migrol"},removeTags:{amenity:"fuel",brand:"Migrol","brand:wikidata":"Q1747771","brand:wikipedia":"de:Migrol",name:"Migrol"},matchScore:2,suggestion:true},"amenity/fuel/Mobil":{name:"Mobil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3088656"},addTags:{amenity:"fuel",brand:"Mobil","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil"},removeTags:{amenity:"fuel",brand:"Mobil","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil"},matchScore:2,suggestion:true},"amenity/fuel/Morrisons":{name:"Morrisons",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q922344"},addTags:{amenity:"fuel",brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons"},removeTags:{amenity:"fuel",brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons"},matchScore:2,suggestion:true},"amenity/fuel/Murphy USA":{name:"Murphy USA",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q19604459"},addTags:{amenity:"fuel",brand:"Murphy USA","brand:wikidata":"Q19604459","brand:wikipedia":"en:Murphy USA",name:"Murphy USA"},removeTags:{amenity:"fuel",brand:"Murphy USA","brand:wikidata":"Q19604459","brand:wikipedia":"en:Murphy USA",name:"Murphy USA"},matchScore:2,suggestion:true},"amenity/fuel/NP":{name:"NP",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7842382"},addTags:{amenity:"fuel",brand:"NP","brand:wikidata":"Q7842382","brand:wikipedia":"en:Trinidad & Tobago National Petroleum Marketing Company Limited",name:"NP"},removeTags:{amenity:"fuel",brand:"NP","brand:wikidata":"Q7842382","brand:wikipedia":"en:Trinidad & Tobago National Petroleum Marketing Company Limited",name:"NP"},matchScore:2,suggestion:true},"amenity/fuel/Neste":{name:"Neste",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q616376"},addTags:{amenity:"fuel",brand:"Neste","brand:wikidata":"Q616376","brand:wikipedia":"en:Neste",name:"Neste"},removeTags:{amenity:"fuel",brand:"Neste","brand:wikidata":"Q616376","brand:wikipedia":"en:Neste",name:"Neste"},matchScore:2,suggestion:true},"amenity/fuel/OIL!":{name:"OIL!",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2007561"},addTags:{amenity:"fuel",brand:"OIL!","brand:wikidata":"Q2007561","brand:wikipedia":"de:OIL! Tankstellen",name:"OIL!"},removeTags:{amenity:"fuel",brand:"OIL!","brand:wikidata":"Q2007561","brand:wikipedia":"de:OIL! Tankstellen",name:"OIL!"},matchScore:2,suggestion:true},"amenity/fuel/OK":{name:"OK",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q12329785"},addTags:{amenity:"fuel",brand:"OK","brand:wikidata":"Q12329785","brand:wikipedia":"da:OK a.m.b.a.",name:"OK"},removeTags:{amenity:"fuel",brand:"OK","brand:wikidata":"Q12329785","brand:wikipedia":"da:OK a.m.b.a.",name:"OK"},matchScore:2,suggestion:true},"amenity/fuel/OKQ8":{name:"OKQ8",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1634762"},addTags:{amenity:"fuel",brand:"OKQ8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"OKQ8"},removeTags:{amenity:"fuel",brand:"OKQ8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"OKQ8"},matchScore:2,suggestion:true},"amenity/fuel/OMV":{name:"OMV",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q168238"},addTags:{amenity:"fuel",brand:"OMV","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"OMV"},removeTags:{amenity:"fuel",brand:"OMV","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"OMV"},matchScore:2,suggestion:true},"amenity/fuel/Oilibya":{name:"Oilibya",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7081491"},addTags:{amenity:"fuel",brand:"Oilibya","brand:wikidata":"Q7081491","brand:wikipedia":"en:Oilibya",name:"Oilibya","name:ar":"أويليبيا"},removeTags:{amenity:"fuel",brand:"Oilibya","brand:wikidata":"Q7081491","brand:wikipedia":"en:Oilibya",name:"Oilibya","name:ar":"أويليبيا"},matchScore:2,suggestion:true},"amenity/fuel/Opet":{name:"Opet",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7072824"},addTags:{amenity:"fuel",brand:"Opet","brand:wikidata":"Q7072824","brand:wikipedia":"en:Opet",name:"Opet"},removeTags:{amenity:"fuel",brand:"Opet","brand:wikidata":"Q7072824","brand:wikipedia":"en:Opet",name:"Opet"},matchScore:2,suggestion:true},"amenity/fuel/Orlen":{name:"Orlen",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q971649"},addTags:{amenity:"fuel",brand:"Orlen","brand:wikidata":"Q971649","brand:wikipedia":"en:PKN Orlen",name:"Orlen"},removeTags:{amenity:"fuel",brand:"Orlen","brand:wikidata":"Q971649","brand:wikipedia":"en:PKN Orlen",name:"Orlen"},matchScore:2,suggestion:true},"amenity/fuel/Oxxo":{name:"Oxxo",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1342538"},addTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",amenity:"fuel"},removeTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",amenity:"fuel"},matchScore:2,suggestion:true},"amenity/fuel/PSO":{name:"PSO",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2741455"},addTags:{amenity:"fuel",brand:"PSO","brand:wikidata":"Q2741455","brand:wikipedia":"en:Pakistan State Oil",name:"PSO"},removeTags:{amenity:"fuel",brand:"PSO","brand:wikidata":"Q2741455","brand:wikipedia":"en:Pakistan State Oil",name:"PSO"},matchScore:2,suggestion:true},"amenity/fuel/PTT":{name:"PTT",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1810389"},addTags:{amenity:"fuel",brand:"PTT","brand:wikidata":"Q1810389","brand:wikipedia":"en:PTT Public Company Limited",name:"PTT"},removeTags:{amenity:"fuel",brand:"PTT","brand:wikidata":"Q1810389","brand:wikipedia":"en:PTT Public Company Limited",name:"PTT"},matchScore:2,suggestion:true},"amenity/fuel/PV Oil":{name:"PV Oil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2089536"},addTags:{amenity:"fuel",brand:"PV Oil","brand:wikidata":"Q2089536","brand:wikipedia":"en:Petrovietnam",name:"PV Oil"},removeTags:{amenity:"fuel",brand:"PV Oil","brand:wikidata":"Q2089536","brand:wikipedia":"en:Petrovietnam",name:"PV Oil"},matchScore:2,suggestion:true},"amenity/fuel/Pacific Pride":{name:"Pacific Pride",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7122637"},addTags:{amenity:"fuel",brand:"Pacific Pride","brand:wikidata":"Q7122637","brand:wikipedia":"en:Pacific Pride",name:"Pacific Pride"},removeTags:{amenity:"fuel",brand:"Pacific Pride","brand:wikidata":"Q7122637","brand:wikipedia":"en:Pacific Pride",name:"Pacific Pride"},matchScore:2,suggestion:true},"amenity/fuel/Pemex":{name:"Pemex",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q871308"},addTags:{amenity:"fuel",brand:"Pemex","brand:wikidata":"Q871308","brand:wikipedia":"en:Pemex",name:"Pemex"},removeTags:{amenity:"fuel",brand:"Pemex","brand:wikidata":"Q871308","brand:wikipedia":"en:Pemex",name:"Pemex"},matchScore:2,suggestion:true},"amenity/fuel/Pertamina":{name:"Pertamina",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1641044"},addTags:{amenity:"fuel",brand:"Pertamina","brand:wikidata":"Q1641044","brand:wikipedia":"en:Pertamina",name:"Pertamina"},removeTags:{amenity:"fuel",brand:"Pertamina","brand:wikidata":"Q1641044","brand:wikipedia":"en:Pertamina",name:"Pertamina"},matchScore:2,suggestion:true},"amenity/fuel/Petro-Canada":{name:"Petro-Canada",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1208279"},addTags:{amenity:"fuel",brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada"},removeTags:{amenity:"fuel",brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada"},matchScore:2,suggestion:true},"amenity/fuel/Petro-T":{name:"Petro-T",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q61743540"},addTags:{amenity:"fuel",brand:"Petro-T","brand:wikidata":"Q61743540",name:"Petro-T"},removeTags:{amenity:"fuel",brand:"Petro-T","brand:wikidata":"Q61743540",name:"Petro-T"},matchScore:2,suggestion:true},"amenity/fuel/PetroPerú":{name:"PetroPerú",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2506390"},addTags:{amenity:"fuel",brand:"PetroPerú","brand:wikidata":"Q2506390","brand:wikipedia":"es:Petroperú",name:"PetroPerú"},removeTags:{amenity:"fuel",brand:"PetroPerú","brand:wikidata":"Q2506390","brand:wikipedia":"es:Petroperú",name:"PetroPerú"},matchScore:2,suggestion:true},"amenity/fuel/Petrochina":{name:"Petrochina",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q503182"},addTags:{amenity:"fuel",brand:"Petrochina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"Petrochina"},removeTags:{amenity:"fuel",brand:"Petrochina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"Petrochina"},matchScore:2,suggestion:true},"amenity/fuel/Petroecuador":{name:"Petroecuador",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1812822"},addTags:{amenity:"fuel",brand:"Petroecuador","brand:wikidata":"Q1812822","brand:wikipedia":"en:Petroecuador",name:"Petroecuador"},removeTags:{amenity:"fuel",brand:"Petroecuador","brand:wikidata":"Q1812822","brand:wikipedia":"en:Petroecuador",name:"Petroecuador"},matchScore:2,suggestion:true},"amenity/fuel/Petrol Ofisi":{name:"Petrol Ofisi",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1278087"},addTags:{amenity:"fuel",brand:"Petrol Ofisi","brand:wikidata":"Q1278087","brand:wikipedia":"en:Petrol Ofisi",name:"Petrol Ofisi"},removeTags:{amenity:"fuel",brand:"Petrol Ofisi","brand:wikidata":"Q1278087","brand:wikipedia":"en:Petrol Ofisi",name:"Petrol Ofisi"},matchScore:2,suggestion:true},"amenity/fuel/Petrolimex":{name:"Petrolimex",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q10831598"},addTags:{amenity:"fuel",brand:"Petrolimex","brand:wikidata":"Q10831598","brand:wikipedia":"en:Petrolimex",name:"Petrolimex"},removeTags:{amenity:"fuel",brand:"Petrolimex","brand:wikidata":"Q10831598","brand:wikipedia":"en:Petrolimex",name:"Petrolimex"},matchScore:2,suggestion:true},"amenity/fuel/Petrolina":{name:"Petrolina",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q17013948"},addTags:{amenity:"fuel",brand:"Petrolina","brand:wikidata":"Q17013948","brand:wikipedia":"en:Petrolina (company)",name:"Petrolina"},removeTags:{amenity:"fuel",brand:"Petrolina","brand:wikidata":"Q17013948","brand:wikipedia":"en:Petrolina (company)",name:"Petrolina"},matchScore:2,suggestion:true},"amenity/fuel/Petrom":{name:"Petrom",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1755034"},addTags:{amenity:"fuel",brand:"Petrom","brand:wikidata":"Q1755034","brand:wikipedia":"en:Petrom",name:"Petrom"},removeTags:{amenity:"fuel",brand:"Petrom","brand:wikidata":"Q1755034","brand:wikipedia":"en:Petrom",name:"Petrom"},matchScore:2,suggestion:true},"amenity/fuel/Petron":{name:"Petron",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7179011"},addTags:{amenity:"fuel",brand:"Petron","brand:wikidata":"Q7179011","brand:wikipedia":"en:Petron Corporation",name:"Petron"},removeTags:{amenity:"fuel",brand:"Petron","brand:wikidata":"Q7179011","brand:wikipedia":"en:Petron Corporation",name:"Petron"},matchScore:2,suggestion:true},"amenity/fuel/Petronas":{name:"Petronas",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q221692"},addTags:{amenity:"fuel",brand:"Petronas","brand:wikidata":"Q221692","brand:wikipedia":"en:Petronas",name:"Petronas"},removeTags:{amenity:"fuel",brand:"Petronas","brand:wikidata":"Q221692","brand:wikipedia":"en:Petronas",name:"Petronas"},matchScore:2,suggestion:true},"amenity/fuel/Petronor":{name:"Petronor",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1726547"},addTags:{amenity:"fuel",brand:"Petronor","brand:wikidata":"Q1726547","brand:wikipedia":"es:Petronor",name:"Petronor"},removeTags:{amenity:"fuel",brand:"Petronor","brand:wikidata":"Q1726547","brand:wikipedia":"es:Petronor",name:"Petronor"},matchScore:2,suggestion:true},"amenity/fuel/Phillips 66":{name:"Phillips 66",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1656230"},addTags:{amenity:"fuel",brand:"Phillips 66","brand:wikidata":"Q1656230","brand:wikipedia":"en:Phillips 66",name:"Phillips 66"},removeTags:{amenity:"fuel",brand:"Phillips 66","brand:wikidata":"Q1656230","brand:wikipedia":"en:Phillips 66",name:"Phillips 66"},matchScore:2,suggestion:true},"amenity/fuel/Phoenix":{name:"Phoenix",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7186949"},addTags:{amenity:"fuel",brand:"Phoenix","brand:wikidata":"Q7186949","brand:wikipedia":"en:Phoenix Petroleum",name:"Phoenix"},removeTags:{amenity:"fuel",brand:"Phoenix","brand:wikidata":"Q7186949","brand:wikipedia":"en:Phoenix Petroleum",name:"Phoenix"},matchScore:2,suggestion:true},"amenity/fuel/Pioneer":{name:"Pioneer",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7196684"},addTags:{amenity:"fuel",brand:"Pioneer","brand:wikidata":"Q7196684","brand:wikipedia":"en:Pioneer Energy",name:"Pioneer"},removeTags:{amenity:"fuel",brand:"Pioneer","brand:wikidata":"Q7196684","brand:wikipedia":"en:Pioneer Energy",name:"Pioneer"},matchScore:2,suggestion:true},"amenity/fuel/Preem":{name:"Preem",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q598835"},addTags:{amenity:"fuel",brand:"Preem","brand:wikidata":"Q598835","brand:wikipedia":"en:Preem",name:"Preem"},removeTags:{amenity:"fuel",brand:"Preem","brand:wikidata":"Q598835","brand:wikipedia":"en:Preem",name:"Preem"},matchScore:2,suggestion:true},"amenity/fuel/Puma":{name:"Puma",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7259769"},addTags:{amenity:"fuel",brand:"Puma","brand:wikidata":"Q7259769","brand:wikipedia":"en:Puma Energy",name:"Puma"},removeTags:{amenity:"fuel",brand:"Puma","brand:wikidata":"Q7259769","brand:wikipedia":"en:Puma Energy",name:"Puma"},matchScore:2,suggestion:true},"amenity/fuel/Q8":{name:"Q8",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1634762"},addTags:{amenity:"fuel",brand:"Q8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"Q8"},removeTags:{amenity:"fuel",brand:"Q8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"Q8"},matchScore:2,suggestion:true},"amenity/fuel/Q8 Easy":{name:"Q8 Easy",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1806948"},addTags:{amenity:"fuel",brand:"Q8 Easy","brand:wikidata":"Q1806948","brand:wikipedia":"nl:Q8 Easy",name:"Q8 Easy"},removeTags:{amenity:"fuel",brand:"Q8 Easy","brand:wikidata":"Q1806948","brand:wikipedia":"nl:Q8 Easy",name:"Q8 Easy"},matchScore:2,suggestion:true},"amenity/fuel/QT":{name:"QT",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7271953"},addTags:{amenity:"fuel",brand:"QT","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QT"},removeTags:{amenity:"fuel",brand:"QT","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QT"},matchScore:2,suggestion:true},"amenity/fuel/Qstar":{name:"Qstar",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q10647961"},addTags:{amenity:"fuel",brand:"Qstar","brand:wikidata":"Q10647961","brand:wikipedia":"sv:Qstar",name:"Qstar"},removeTags:{amenity:"fuel",brand:"Qstar","brand:wikidata":"Q10647961","brand:wikipedia":"sv:Qstar",name:"Qstar"},matchScore:2,suggestion:true},"amenity/fuel/QuikTrip":{name:"QuikTrip",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7271953"},addTags:{amenity:"fuel",brand:"QuikTrip","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QuikTrip"},removeTags:{amenity:"fuel",brand:"QuikTrip","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QuikTrip"},matchScore:2,suggestion:true},"amenity/fuel/Race Trac":{name:"Race Trac",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q735942"},addTags:{amenity:"fuel",brand:"Race Trac","brand:wikidata":"Q735942","brand:wikipedia":"en:RaceTrac",name:"Race Trac"},removeTags:{amenity:"fuel",brand:"Race Trac","brand:wikidata":"Q735942","brand:wikipedia":"en:RaceTrac",name:"Race Trac"},matchScore:2,suggestion:true},"amenity/fuel/Repsol":{name:"Repsol",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q174747"},addTags:{amenity:"fuel",brand:"Repsol","brand:wikidata":"Q174747","brand:wikipedia":"es:Repsol",name:"Repsol"},removeTags:{amenity:"fuel",brand:"Repsol","brand:wikidata":"Q174747","brand:wikipedia":"es:Repsol",name:"Repsol"},matchScore:2,suggestion:true},"amenity/fuel/Rompetrol":{name:"Rompetrol",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1788862"},addTags:{amenity:"fuel",brand:"Rompetrol","brand:wikidata":"Q1788862","brand:wikipedia":"en:Rompetrol",name:"Rompetrol"},removeTags:{amenity:"fuel",brand:"Rompetrol","brand:wikidata":"Q1788862","brand:wikipedia":"en:Rompetrol",name:"Rompetrol"},matchScore:2,suggestion:true},"amenity/fuel/Royal Farms":{name:"Royal Farms",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7374169"},addTags:{amenity:"fuel",brand:"Royal Farms","brand:wikidata":"Q7374169","brand:wikipedia":"en:Royal Farms",name:"Royal Farms"},removeTags:{amenity:"fuel",brand:"Royal Farms","brand:wikidata":"Q7374169","brand:wikipedia":"en:Royal Farms",name:"Royal Farms"},matchScore:2,suggestion:true},"amenity/fuel/Rubis":{name:"Rubis",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3446514"},addTags:{amenity:"fuel",brand:"Rubis","brand:wikidata":"Q3446514","brand:wikipedia":"en:Rubis (company)",name:"Rubis"},removeTags:{amenity:"fuel",brand:"Rubis","brand:wikidata":"Q3446514","brand:wikipedia":"en:Rubis (company)",name:"Rubis"},matchScore:2,suggestion:true},"amenity/fuel/Safeway":{name:"Safeway",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1508234"},addTags:{amenity:"fuel",brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway"},removeTags:{amenity:"fuel",brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway"},matchScore:2,suggestion:true},"amenity/fuel/Sainsbury's":{name:"Sainsbury's",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q152096"},addTags:{amenity:"fuel",brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's"},removeTags:{amenity:"fuel",brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's"},matchScore:2,suggestion:true},"amenity/fuel/Sam's Club":{name:"Sam's Club",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1972120"},addTags:{amenity:"fuel",brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},removeTags:{amenity:"fuel",brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},matchScore:2,suggestion:true},"amenity/fuel/Sasol":{name:"Sasol",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q905998"},addTags:{amenity:"fuel",brand:"Sasol","brand:wikidata":"Q905998","brand:wikipedia":"en:Sasol",name:"Sasol"},removeTags:{amenity:"fuel",brand:"Sasol","brand:wikidata":"Q905998","brand:wikipedia":"en:Sasol",name:"Sasol"},matchScore:2,suggestion:true},"amenity/fuel/Sea Oil":{name:"Sea Oil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7389549"},addTags:{amenity:"fuel",brand:"Sea Oil","brand:wikidata":"Q7389549","brand:wikipedia":"en:Seaoil Philippines",name:"Sea Oil"},removeTags:{amenity:"fuel",brand:"Sea Oil","brand:wikidata":"Q7389549","brand:wikipedia":"en:Seaoil Philippines",name:"Sea Oil"},matchScore:2,suggestion:true},"amenity/fuel/Sheetz":{name:"Sheetz",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7492551"},addTags:{amenity:"fuel",brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz"},removeTags:{amenity:"fuel",brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz"},matchScore:2,suggestion:true},"amenity/fuel/Shell":{name:"Shell",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q154950"},addTags:{amenity:"fuel",brand:"Shell","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell"},removeTags:{amenity:"fuel",brand:"Shell","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell"},matchScore:2,suggestion:true},"amenity/fuel/Shell Express":{name:"Shell Express",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2289188"},addTags:{amenity:"fuel",brand:"Shell Express","brand:wikidata":"Q2289188","brand:wikipedia":"nl:Shell Express",name:"Shell Express"},removeTags:{amenity:"fuel",brand:"Shell Express","brand:wikidata":"Q2289188","brand:wikipedia":"nl:Shell Express",name:"Shell Express"},matchScore:2,suggestion:true},"amenity/fuel/Sinclair":{name:"Sinclair",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1290900"},addTags:{amenity:"fuel",brand:"Sinclair","brand:wikidata":"Q1290900","brand:wikipedia":"en:Sinclair Oil Corporation",name:"Sinclair"},removeTags:{amenity:"fuel",brand:"Sinclair","brand:wikidata":"Q1290900","brand:wikipedia":"en:Sinclair Oil Corporation",name:"Sinclair"},matchScore:2,suggestion:true},"amenity/fuel/Sinopec":{name:"Sinopec",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q831445"},addTags:{amenity:"fuel",brand:"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"Sinopec"},removeTags:{amenity:"fuel",brand:"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"Sinopec"},matchScore:2,suggestion:true},"amenity/fuel/Slovnaft":{name:"Slovnaft",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1587563"},addTags:{amenity:"fuel",brand:"Slovnaft","brand:wikidata":"Q1587563","brand:wikipedia":"en:Slovnaft",name:"Slovnaft"},removeTags:{amenity:"fuel",brand:"Slovnaft","brand:wikidata":"Q1587563","brand:wikipedia":"en:Slovnaft",name:"Slovnaft"},matchScore:2,suggestion:true},"amenity/fuel/Socar":{name:"Socar",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1622293"},addTags:{amenity:"fuel",brand:"Socar","brand:wikidata":"Q1622293","brand:wikipedia":"en:SOCAR",name:"Socar"},removeTags:{amenity:"fuel",brand:"Socar","brand:wikidata":"Q1622293","brand:wikipedia":"en:SOCAR",name:"Socar"},matchScore:2,suggestion:true},"amenity/fuel/Sokimex":{name:"Sokimex",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1149575"},addTags:{amenity:"fuel",brand:"Sokimex","brand:wikidata":"Q1149575","brand:wikipedia":"en:Sokimex",name:"Sokimex"},removeTags:{amenity:"fuel",brand:"Sokimex","brand:wikidata":"Q1149575","brand:wikipedia":"en:Sokimex",name:"Sokimex"},matchScore:2,suggestion:true},"amenity/fuel/Speedway":{name:"Speedway",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7575683"},addTags:{amenity:"fuel",brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway"},removeTags:{amenity:"fuel",brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway"},matchScore:2,suggestion:true},"amenity/fuel/Sprint":{name:"Sprint",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q57588452"},addTags:{amenity:"fuel",brand:"Sprint","brand:wikidata":"Q57588452",name:"Sprint"},removeTags:{amenity:"fuel",brand:"Sprint","brand:wikidata":"Q57588452",name:"Sprint"},matchScore:2,suggestion:true},"amenity/fuel/St1":{name:"St1",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7592214"},addTags:{amenity:"fuel",brand:"St1","brand:wikidata":"Q7592214","brand:wikipedia":"en:St1",name:"St1"},removeTags:{amenity:"fuel",brand:"St1","brand:wikidata":"Q7592214","brand:wikipedia":"en:St1",name:"St1"},matchScore:2,suggestion:true},"amenity/fuel/Star":{name:"Star",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2031095"},addTags:{amenity:"fuel",brand:"Star","brand:wikidata":"Q2031095","brand:wikipedia":"de:Orlen Deutschland",name:"Star"},removeTags:{amenity:"fuel",brand:"Star","brand:wikidata":"Q2031095","brand:wikipedia":"de:Orlen Deutschland",name:"Star"},matchScore:2,suggestion:true},"amenity/fuel/Statoil":{name:"Statoil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1776022"},addTags:{amenity:"fuel",brand:"Statoil","brand:wikidata":"Q1776022","brand:wikipedia":"en:Equinor",name:"Statoil"},removeTags:{amenity:"fuel",brand:"Statoil","brand:wikidata":"Q1776022","brand:wikipedia":"en:Equinor",name:"Statoil"},matchScore:2,suggestion:true},"amenity/fuel/Stewart's":{name:"Stewart's",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7615690"},addTags:{amenity:"fuel",brand:"Stewart's","brand:wikidata":"Q7615690","brand:wikipedia":"en:Stewart's Shops",name:"Stewart's"},removeTags:{amenity:"fuel",brand:"Stewart's","brand:wikidata":"Q7615690","brand:wikipedia":"en:Stewart's Shops",name:"Stewart's"},matchScore:2,suggestion:true},"amenity/fuel/Sunoco":{name:"Sunoco",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1423218"},addTags:{amenity:"fuel",brand:"Sunoco","brand:wikidata":"Q1423218","brand:wikipedia":"en:Sunoco",name:"Sunoco"},removeTags:{amenity:"fuel",brand:"Sunoco","brand:wikidata":"Q1423218","brand:wikipedia":"en:Sunoco",name:"Sunoco"},matchScore:2,suggestion:true},"amenity/fuel/Super U":{name:"Super U",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2529029"},addTags:{amenity:"fuel",brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U"},removeTags:{amenity:"fuel",brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U"},matchScore:2,suggestion:true},"amenity/fuel/Tamoil":{name:"Tamoil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q706793"},addTags:{amenity:"fuel",brand:"Tamoil","brand:wikidata":"Q706793","brand:wikipedia":"en:Tamoil",name:"Tamoil"},removeTags:{amenity:"fuel",brand:"Tamoil","brand:wikidata":"Q706793","brand:wikipedia":"en:Tamoil",name:"Tamoil"},matchScore:2,suggestion:true},"amenity/fuel/Tango":{name:"Tango",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2423920"},addTags:{amenity:"fuel",brand:"Tango","brand:wikidata":"Q2423920","brand:wikipedia":"nl:Tango CV",name:"Tango"},removeTags:{amenity:"fuel",brand:"Tango","brand:wikidata":"Q2423920","brand:wikipedia":"nl:Tango CV",name:"Tango"},matchScore:2,suggestion:true},"amenity/fuel/Tanka":{name:"Tanka",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q10690640"},addTags:{amenity:"fuel",brand:"Tanka","brand:wikidata":"Q10690640","brand:wikipedia":"sv:Tanka (bensinstationskedja)",name:"Tanka"},removeTags:{amenity:"fuel",brand:"Tanka","brand:wikidata":"Q10690640","brand:wikipedia":"sv:Tanka (bensinstationskedja)",name:"Tanka"},matchScore:2,suggestion:true},"amenity/fuel/Teboil":{name:"Teboil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7692079"},addTags:{amenity:"fuel",brand:"Teboil","brand:wikidata":"Q7692079","brand:wikipedia":"en:Teboil",name:"Teboil"},removeTags:{amenity:"fuel",brand:"Teboil","brand:wikidata":"Q7692079","brand:wikipedia":"en:Teboil",name:"Teboil"},matchScore:2,suggestion:true},"amenity/fuel/Terpel":{name:"Terpel",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7703003"},addTags:{amenity:"fuel",brand:"Terpel","brand:wikidata":"Q7703003","brand:wikipedia":"en:Terpel",name:"Terpel"},removeTags:{amenity:"fuel",brand:"Terpel","brand:wikidata":"Q7703003","brand:wikipedia":"en:Terpel",name:"Terpel"},matchScore:2,suggestion:true},"amenity/fuel/Tesco":{name:"Tesco",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q17145596"},addTags:{amenity:"fuel",brand:"Tesco","brand:wikidata":"Q17145596","brand:wikipedia":"en:Tesco Corporation",name:"Tesco"},removeTags:{amenity:"fuel",brand:"Tesco","brand:wikidata":"Q17145596","brand:wikipedia":"en:Tesco Corporation",name:"Tesco"},matchScore:2,suggestion:true},"amenity/fuel/Texaco":{name:"Texaco",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q775060"},addTags:{amenity:"fuel",brand:"Texaco","brand:wikidata":"Q775060","brand:wikipedia":"en:Texaco",name:"Texaco"},removeTags:{amenity:"fuel",brand:"Texaco","brand:wikidata":"Q775060","brand:wikipedia":"en:Texaco",name:"Texaco"},matchScore:2,suggestion:true},"amenity/fuel/Tinq":{name:"Tinq",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2132028"},addTags:{amenity:"fuel",brand:"Tinq","brand:wikidata":"Q2132028","brand:wikipedia":"nl:Tinq",name:"Tinq"},removeTags:{amenity:"fuel",brand:"Tinq","brand:wikidata":"Q2132028","brand:wikipedia":"nl:Tinq",name:"Tinq"},matchScore:2,suggestion:true},"amenity/fuel/Topaz":{name:"Topaz",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7824764"},addTags:{amenity:"fuel",brand:"Topaz","brand:wikidata":"Q7824764","brand:wikipedia":"en:Topaz Energy",name:"Topaz"},removeTags:{amenity:"fuel",brand:"Topaz","brand:wikidata":"Q7824764","brand:wikipedia":"en:Topaz Energy",name:"Topaz"},matchScore:2,suggestion:true},"amenity/fuel/Total":{name:"Total",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q154037"},addTags:{amenity:"fuel",brand:"Total","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total"},removeTags:{amenity:"fuel",brand:"Total","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total"},matchScore:2,suggestion:true},"amenity/fuel/TotalErg":{name:"TotalErg",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3995933"},addTags:{amenity:"fuel",brand:"TotalErg","brand:wikidata":"Q3995933","brand:wikipedia":"it:TotalErg",name:"TotalErg"},removeTags:{amenity:"fuel",brand:"TotalErg","brand:wikidata":"Q3995933","brand:wikipedia":"it:TotalErg",name:"TotalErg"},matchScore:2,suggestion:true},"amenity/fuel/Turkey Hill":{name:"Turkey Hill",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q42376970"},addTags:{amenity:"fuel",brand:"Turkey Hill","brand:wikidata":"Q42376970","brand:wikipedia":"en:Turkey Hill Minit Markets",name:"Turkey Hill"},removeTags:{amenity:"fuel",brand:"Turkey Hill","brand:wikidata":"Q42376970","brand:wikipedia":"en:Turkey Hill Minit Markets",name:"Turkey Hill"},matchScore:2,suggestion:true},"amenity/fuel/Turmöl":{name:"Turmöl",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1473279"},addTags:{amenity:"fuel",brand:"Turmöl","brand:wikidata":"Q1473279","brand:wikipedia":"de:Turmöl",name:"Turmöl"},removeTags:{amenity:"fuel",brand:"Turmöl","brand:wikidata":"Q1473279","brand:wikipedia":"de:Turmöl",name:"Turmöl"},matchScore:2,suggestion:true},"amenity/fuel/UDF Fuel":{name:"UDF Fuel",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7887677"},addTags:{amenity:"fuel",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"UDF Fuel",short_name:"UDF"},removeTags:{amenity:"fuel",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"UDF Fuel",short_name:"UDF"},matchScore:2,suggestion:true},"amenity/fuel/Ultramar":{name:"Ultramar",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3548078"},addTags:{amenity:"fuel",brand:"Ultramar","brand:wikidata":"Q3548078","brand:wikipedia":"en:Ultramar",name:"Ultramar"},removeTags:{amenity:"fuel",brand:"Ultramar","brand:wikidata":"Q3548078","brand:wikipedia":"en:Ultramar",name:"Ultramar"},matchScore:2,suggestion:true},"amenity/fuel/United":{name:"United",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q28224393"},addTags:{amenity:"fuel",brand:"United","brand:wikidata":"Q28224393","brand:wikipedia":"en:United Petroleum",name:"United"},removeTags:{amenity:"fuel",brand:"United","brand:wikidata":"Q28224393","brand:wikipedia":"en:United Petroleum",name:"United"},matchScore:2,suggestion:true},"amenity/fuel/Uno-X":{name:"Uno-X",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3362746"},addTags:{amenity:"fuel",brand:"Uno-X","brand:wikidata":"Q3362746","brand:wikipedia":"en:Uno-X",name:"Uno-X"},removeTags:{amenity:"fuel",brand:"Uno-X","brand:wikidata":"Q3362746","brand:wikipedia":"en:Uno-X",name:"Uno-X"},matchScore:2,suggestion:true},"amenity/fuel/Valero":{name:"Valero",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1283291"},addTags:{amenity:"fuel",brand:"Valero","brand:wikidata":"Q1283291","brand:wikipedia":"en:Valero Energy",name:"Valero"},removeTags:{amenity:"fuel",brand:"Valero","brand:wikidata":"Q1283291","brand:wikipedia":"en:Valero Energy",name:"Valero"},matchScore:2,suggestion:true},"amenity/fuel/Viada":{name:"Viada",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q12663942"},addTags:{amenity:"fuel",brand:"Viada","brand:wikidata":"Q12663942","brand:wikipedia":"en:Lukoil Baltija",name:"Viada"},removeTags:{amenity:"fuel",brand:"Viada","brand:wikidata":"Q12663942","brand:wikipedia":"en:Lukoil Baltija",name:"Viada"},matchScore:2,suggestion:true},"amenity/fuel/WOG":{name:"WOG",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q12072939"},addTags:{amenity:"fuel",brand:"WOG","brand:wikidata":"Q12072939","brand:wikipedia":"en:WOG (gas stations)",name:"WOG"},removeTags:{amenity:"fuel",brand:"WOG","brand:wikidata":"Q12072939","brand:wikipedia":"en:WOG (gas stations)",name:"WOG"},matchScore:2,suggestion:true},"amenity/fuel/Wawa":{name:"Wawa",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5936320"},addTags:{amenity:"fuel",brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa"},removeTags:{amenity:"fuel",brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa"},matchScore:2,suggestion:true},"amenity/fuel/Westfalen":{name:"Westfalen",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1411209"},addTags:{amenity:"fuel",brand:"Westfalen","brand:wikidata":"Q1411209","brand:wikipedia":"en:Westfalen AG",name:"Westfalen"},removeTags:{amenity:"fuel",brand:"Westfalen","brand:wikidata":"Q1411209","brand:wikipedia":"en:Westfalen AG",name:"Westfalen"},matchScore:2,suggestion:true},"amenity/fuel/Woolworths Petrol":{name:"Woolworths Petrol",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5023980"},addTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol"},removeTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol"},matchScore:2,suggestion:true},"amenity/fuel/YPF":{name:"YPF",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2006989"},addTags:{amenity:"fuel",brand:"YPF","brand:wikidata":"Q2006989","brand:wikipedia":"en:YPF",name:"YPF"},removeTags:{amenity:"fuel",brand:"YPF","brand:wikidata":"Q2006989","brand:wikipedia":"en:YPF",name:"YPF"},matchScore:2,suggestion:true},"amenity/fuel/Z":{name:"Z",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q8063337"},addTags:{amenity:"fuel",brand:"Z","brand:wikidata":"Q8063337","brand:wikipedia":"en:Z Energy",name:"Z"},removeTags:{amenity:"fuel",brand:"Z","brand:wikidata":"Q8063337","brand:wikipedia":"en:Z Energy",name:"Z"},matchScore:2,suggestion:true},"amenity/fuel/bft":{name:"bft",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1009104"},addTags:{amenity:"fuel",brand:"bft","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"bft"},removeTags:{amenity:"fuel",brand:"bft","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"bft"},matchScore:2,suggestion:true},"amenity/fuel/din-X":{name:"din-X",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q10472858"},addTags:{amenity:"fuel",brand:"din-X","brand:wikidata":"Q10472858","brand:wikipedia":"sv:Din-X",name:"din-X"},removeTags:{amenity:"fuel",brand:"din-X","brand:wikidata":"Q10472858","brand:wikipedia":"sv:Din-X",name:"din-X"},matchScore:2,suggestion:true},"amenity/fuel/АЗС":{name:"АЗС",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q12122687"},addTags:{amenity:"fuel",brand:"АЗС","brand:wikidata":"Q12122687","brand:wikipedia":"uk:Мережа АЗС Приват",name:"АЗС"},removeTags:{amenity:"fuel",brand:"АЗС","brand:wikidata":"Q12122687","brand:wikipedia":"uk:Мережа АЗС Приват",name:"АЗС"},matchScore:2,suggestion:true},"amenity/fuel/Авіас":{name:"Авіас",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q12122687"},addTags:{amenity:"fuel",brand:"Авіас","brand:wikidata":"Q12122687","brand:wikipedia":"uk:Мережа АЗС Приват",name:"Авіас"},removeTags:{amenity:"fuel",brand:"Авіас","brand:wikidata":"Q12122687","brand:wikipedia":"uk:Мережа АЗС Приват",name:"Авіас"},matchScore:2,suggestion:true},"amenity/fuel/БРСМ-Нафта":{name:"БРСМ-Нафта",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q56356523"},addTags:{amenity:"fuel",brand:"БРСМ-Нафта","brand:wikidata":"Q56356523","brand:wikipedia":"uk:БРСМ-Нафта",name:"БРСМ-Нафта"},removeTags:{amenity:"fuel",brand:"БРСМ-Нафта","brand:wikidata":"Q56356523","brand:wikipedia":"uk:БРСМ-Нафта",name:"БРСМ-Нафта"},matchScore:2,suggestion:true},"amenity/fuel/Башнефть":{name:"Башнефть",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q809985"},addTags:{amenity:"fuel",brand:"Башнефть","brand:en":"Bashneft","brand:wikidata":"Q809985","brand:wikipedia":"en:Bashneft",name:"Башнефть","name:en":"Bashneft"},removeTags:{amenity:"fuel",brand:"Башнефть","brand:en":"Bashneft","brand:wikidata":"Q809985","brand:wikipedia":"en:Bashneft",name:"Башнефть","name:en":"Bashneft"},matchScore:2,suggestion:true},"amenity/fuel/Белоруснефть":{name:"Белоруснефть",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4082693"},addTags:{amenity:"fuel",brand:"Белоруснефть","brand:wikidata":"Q4082693","brand:wikipedia":"ru:Белоруснефть",name:"Белоруснефть"},removeTags:{amenity:"fuel",brand:"Белоруснефть","brand:wikidata":"Q4082693","brand:wikipedia":"ru:Белоруснефть",name:"Белоруснефть"},matchScore:2,suggestion:true},"amenity/fuel/Газпромнефть":{name:"Газпромнефть",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1461799"},addTags:{amenity:"fuel",brand:"Газпромнефть","brand:wikidata":"Q1461799","brand:wikipedia":"en:Gazprom Neft",name:"Газпромнефть"},removeTags:{amenity:"fuel",brand:"Газпромнефть","brand:wikidata":"Q1461799","brand:wikipedia":"en:Gazprom Neft",name:"Газпромнефть"},matchScore:2,suggestion:true},"amenity/fuel/КазМунайГаз":{name:"КазМунайГаз",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1417227"},addTags:{amenity:"fuel",brand:"КазМунайГаз","brand:wikidata":"Q1417227","brand:wikipedia":"en:KazMunayGas",name:"КазМунайГаз"},removeTags:{amenity:"fuel",brand:"КазМунайГаз","brand:wikidata":"Q1417227","brand:wikipedia":"en:KazMunayGas",name:"КазМунайГаз"},matchScore:2,suggestion:true},"amenity/fuel/Лукойл":{name:"Лукойл",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q329347"},addTags:{amenity:"fuel",brand:"Лукойл","brand:wikidata":"Q329347","brand:wikipedia":"ru:Лукойл",name:"Лукойл"},removeTags:{amenity:"fuel",brand:"Лукойл","brand:wikidata":"Q329347","brand:wikipedia":"ru:Лукойл",name:"Лукойл"},matchScore:2,suggestion:true},"amenity/fuel/Макпетрол":{name:"Макпетрол",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1886438"},addTags:{amenity:"fuel",brand:"Макпетрол","brand:wikidata":"Q1886438","brand:wikipedia":"en:Makpetrol",name:"Макпетрол"},removeTags:{amenity:"fuel",brand:"Макпетрол","brand:wikidata":"Q1886438","brand:wikipedia":"en:Makpetrol",name:"Макпетрол"},matchScore:2,suggestion:true},"amenity/fuel/НК Альянс":{name:"НК Альянс",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4063700"},addTags:{amenity:"fuel",brand:"НК Альянс","brand:wikidata":"Q4063700","brand:wikipedia":"ru:Альянс (компания)",name:"НК Альянс"},removeTags:{amenity:"fuel",brand:"НК Альянс","brand:wikidata":"Q4063700","brand:wikipedia":"ru:Альянс (компания)",name:"НК Альянс"},matchScore:2,suggestion:true},"amenity/fuel/ОККО":{name:"ОККО",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7072617"},addTags:{amenity:"fuel",brand:"ОККО","brand:en":"OKKO","brand:wikidata":"Q7072617","brand:wikipedia":"en:OKKO",name:"ОККО","name:en":"OKKO"},removeTags:{amenity:"fuel",brand:"ОККО","brand:en":"OKKO","brand:wikidata":"Q7072617","brand:wikipedia":"en:OKKO",name:"ОККО","name:en":"OKKO"},matchScore:2,suggestion:true},"amenity/fuel/ПТК":{name:"ПТК",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4360193"},addTags:{amenity:"fuel",brand:"ПТК","brand:en":"The Petersburg Fuel Company","brand:wikidata":"Q4360193","brand:wikipedia":"en:Petersburg Fuel Company",name:"ПТК","name:en":"The Petersburg Fuel Company"},removeTags:{amenity:"fuel",brand:"ПТК","brand:en":"The Petersburg Fuel Company","brand:wikidata":"Q4360193","brand:wikipedia":"en:Petersburg Fuel Company",name:"ПТК","name:en":"The Petersburg Fuel Company"},matchScore:2,suggestion:true},"amenity/fuel/Петрол":{name:"Петрол",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q24315"},addTags:{amenity:"fuel",brand:"Петрол","brand:wikidata":"Q24315","brand:wikipedia":"en:Petrol AD",name:"Петрол"},removeTags:{amenity:"fuel",brand:"Петрол","brand:wikidata":"Q24315","brand:wikipedia":"en:Petrol AD",name:"Петрол"},matchScore:2,suggestion:true},"amenity/fuel/Роснефть":{name:"Роснефть",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1141123"},addTags:{amenity:"fuel",brand:"Роснефть","brand:en":"Rosneft","brand:wikidata":"Q1141123","brand:wikipedia":"en:Rosneft",name:"Роснефть","name:en":"Rosneft"},removeTags:{amenity:"fuel",brand:"Роснефть","brand:en":"Rosneft","brand:wikidata":"Q1141123","brand:wikipedia":"en:Rosneft",name:"Роснефть","name:en":"Rosneft"},matchScore:2,suggestion:true},"amenity/fuel/Сургутнефтегаз":{name:"Сургутнефтегаз",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q680776"},addTags:{amenity:"fuel",brand:"Сургутнефтегаз","brand:en":"Surgutneftegas","brand:wikidata":"Q680776","brand:wikipedia":"en:Surgutneftegas",name:"Сургутнефтегаз","name:en":"Surgutneftegas"},removeTags:{amenity:"fuel",brand:"Сургутнефтегаз","brand:en":"Surgutneftegas","brand:wikidata":"Q680776","brand:wikipedia":"en:Surgutneftegas",name:"Сургутнефтегаз","name:en":"Surgutneftegas"},matchScore:2,suggestion:true},"amenity/fuel/ТНК":{name:"ТНК",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2298901"},addTags:{amenity:"fuel",brand:"ТНК","brand:wikidata":"Q2298901","brand:wikipedia":"en:TNK-BP",name:"ТНК"},removeTags:{amenity:"fuel",brand:"ТНК","brand:wikidata":"Q2298901","brand:wikipedia":"en:TNK-BP",name:"ТНК"},matchScore:2,suggestion:true},"amenity/fuel/Татнефть":{name:"Татнефть",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1616858"},addTags:{amenity:"fuel",brand:"Татнефть","brand:en":"Tatneft","brand:wikidata":"Q1616858","brand:wikipedia":"en:Tatneft",name:"Татнефть","name:en":"Tatneft"},removeTags:{amenity:"fuel",brand:"Татнефть","brand:en":"Tatneft","brand:wikidata":"Q1616858","brand:wikipedia":"en:Tatneft",name:"Татнефть","name:en":"Tatneft"},matchScore:2,suggestion:true},"amenity/fuel/Укрнафта":{name:"Укрнафта",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2447961"},addTags:{amenity:"fuel",brand:"Укрнафта","brand:en":"Ukrnafta","brand:wikidata":"Q2447961","brand:wikipedia":"en:Ukrnafta",name:"Укрнафта","name:en":"Ukrnafta"},removeTags:{amenity:"fuel",brand:"Укрнафта","brand:en":"Ukrnafta","brand:wikidata":"Q2447961","brand:wikipedia":"en:Ukrnafta",name:"Укрнафта","name:en":"Ukrnafta"},matchScore:2,suggestion:true},"amenity/fuel/סונול":{name:"סונול",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3701622"},addTags:{amenity:"fuel",brand:"סונול","brand:en":"Sonol","brand:wikidata":"Q3701622","brand:wikipedia":"en:Sonol",name:"סונול","name:en":"Sonol"},removeTags:{amenity:"fuel",brand:"סונול","brand:en":"Sonol","brand:wikidata":"Q3701622","brand:wikipedia":"en:Sonol",name:"סונול","name:en":"Sonol"},matchScore:2,suggestion:true},"amenity/fuel/บางจาก":{name:"บางจาก",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q6579719"},addTags:{amenity:"fuel",brand:"บางจาก","brand:wikidata":"Q6579719","brand:wikipedia":"th:บางจาก คอร์ปอเรชัน",name:"บางจาก"},removeTags:{amenity:"fuel",brand:"บางจาก","brand:wikidata":"Q6579719","brand:wikipedia":"th:บางจาก คอร์ปอเรชัน",name:"บางจาก"},matchScore:2,suggestion:true},"amenity/fuel/ป.ต.ท.":{name:"ป.ต.ท.",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1810389"},addTags:{amenity:"fuel",brand:"ป.ต.ท.","brand:wikidata":"Q1810389","brand:wikipedia":"th:ปตท.",name:"ป.ต.ท."},removeTags:{amenity:"fuel",brand:"ป.ต.ท.","brand:wikidata":"Q1810389","brand:wikipedia":"th:ปตท.",name:"ป.ต.ท."},matchScore:2,suggestion:true},"amenity/fuel/เชลล์":{name:"เชลล์",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q18109"},addTags:{amenity:"fuel",brand:"เชลล์","brand:wikidata":"Q18109","brand:wikipedia":"th:เชลล์",name:"เชลล์"},removeTags:{amenity:"fuel",brand:"เชลล์","brand:wikidata":"Q18109","brand:wikipedia":"th:เชลล์",name:"เชลล์"},matchScore:2,suggestion:true},"amenity/fuel/เอสโซ่":{name:"เอสโซ่",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q867662"},addTags:{amenity:"fuel",brand:"เอสโซ่","brand:en":"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"เอสโซ่","name:en":"Esso"},removeTags:{amenity:"fuel",brand:"เอสโซ่","brand:en":"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"เอสโซ่","name:en":"Esso"},matchScore:2,suggestion:true},"amenity/fuel/エッソ":{name:"エッソ",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q867662"},addTags:{amenity:"fuel",brand:"エッソ","brand:en":"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"エッソ","name:en":"Esso"},removeTags:{amenity:"fuel",brand:"エッソ","brand:en":"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"エッソ","name:en":"Esso"},matchScore:2,suggestion:true},"amenity/fuel/エネオス":{name:"エネオス",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1640290"},addTags:{amenity:"fuel",brand:"エネオス","brand:en":"JXTG Nippon Oil & Energy","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"エネオス","name:en":"JXTG Nippon Oil & Energy"},removeTags:{amenity:"fuel",brand:"エネオス","brand:en":"JXTG Nippon Oil & Energy","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"エネオス","name:en":"JXTG Nippon Oil & Energy"},matchScore:2,suggestion:true},"amenity/fuel/コスモ石油":{name:"コスモ石油",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2498318"},addTags:{amenity:"fuel",brand:"コスモ石油","brand:en":"Cosmo Oil Company","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"コスモ石油","name:en":"Cosmo Oil Company"},removeTags:{amenity:"fuel",brand:"コスモ石油","brand:en":"Cosmo Oil Company","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"コスモ石油","name:en":"Cosmo Oil Company"},matchScore:2,suggestion:true},"amenity/fuel/中国石化":{name:"中国石化",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q831445"},addTags:{amenity:"fuel",brand:"中国石化","brand:en":"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"中国石化","name:en":"Sinopec"},removeTags:{amenity:"fuel",brand:"中国石化","brand:en":"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"中国石化","name:en":"Sinopec"},matchScore:2,suggestion:true},"amenity/fuel/中国石化 Sinopec":{name:"中国石化 Sinopec",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q831445"},addTags:{amenity:"fuel",brand:"中国石化 Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"zh:中国石化",name:"中国石化 Sinopec"},removeTags:{amenity:"fuel",brand:"中国石化 Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"zh:中国石化",name:"中国石化 Sinopec"},matchScore:2,suggestion:true},"amenity/fuel/中国石油":{name:"中国石油",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q503182"},addTags:{amenity:"fuel",brand:"中国石油","brand:en":"PetroChina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"中国石油","name:en":"PetroChina"},removeTags:{amenity:"fuel",brand:"中国石油","brand:en":"PetroChina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"中国石油","name:en":"PetroChina"},matchScore:2,suggestion:true},"amenity/fuel/出光":{name:"出光",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2216770"},addTags:{amenity:"fuel",brand:"出光","brand:en":"Idemitsu Kosan","brand:wikidata":"Q2216770","brand:wikipedia":"en:Idemitsu Kosan",name:"出光","name:en":"Idemitsu Kosan"},removeTags:{amenity:"fuel",brand:"出光","brand:en":"Idemitsu Kosan","brand:wikidata":"Q2216770","brand:wikipedia":"en:Idemitsu Kosan",name:"出光","name:en":"Idemitsu Kosan"},matchScore:2,suggestion:true},"amenity/fuel/台灣中油":{name:"台灣中油",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q21527177"},addTags:{amenity:"fuel",brand:"台灣中油","brand:en":"CPC Corporation, Taiwan","brand:wikidata":"Q21527177","brand:wikipedia":"en:CPC Corporation",name:"台灣中油","name:en":"CPC Corporation, Taiwan"},removeTags:{amenity:"fuel",brand:"台灣中油","brand:en":"CPC Corporation, Taiwan","brand:wikidata":"Q21527177","brand:wikipedia":"en:CPC Corporation",name:"台灣中油","name:en":"CPC Corporation, Taiwan"},matchScore:2,suggestion:true},"amenity/fuel/昭和シェル":{name:"昭和シェル",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q277115"},addTags:{amenity:"fuel",brand:"昭和シェル","brand:en":"Showa Shell Sekiyu","brand:wikidata":"Q277115","brand:wikipedia":"en:Showa Shell Sekiyu",name:"昭和シェル","name:en":"Showa Shell Sekiyu"},removeTags:{amenity:"fuel",brand:"昭和シェル","brand:en":"Showa Shell Sekiyu","brand:wikidata":"Q277115","brand:wikipedia":"en:Showa Shell Sekiyu",name:"昭和シェル","name:en":"Showa Shell Sekiyu"},matchScore:2,suggestion:true},"amenity/ice_cream/Baskin-Robbins":{name:"Baskin-Robbins",icon:"maki-ice-cream",geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q584601"},addTags:{amenity:"ice_cream",brand:"Baskin-Robbins","brand:wikidata":"Q584601","brand:wikipedia":"en:Baskin-Robbins",cuisine:"ice_cream",name:"Baskin-Robbins"},removeTags:{amenity:"ice_cream",brand:"Baskin-Robbins","brand:wikidata":"Q584601","brand:wikipedia":"en:Baskin-Robbins",cuisine:"ice_cream",name:"Baskin-Robbins"},matchScore:2,suggestion:true},"amenity/ice_cream/Ben & Jerry's":{name:"Ben & Jerry's",icon:"maki-ice-cream",geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q816412"},addTags:{amenity:"ice_cream",brand:"Ben & Jerry's","brand:wikidata":"Q816412","brand:wikipedia":"en:Ben & Jerry's",cuisine:"ice_cream",name:"Ben & Jerry's"},removeTags:{amenity:"ice_cream",brand:"Ben & Jerry's","brand:wikidata":"Q816412","brand:wikipedia":"en:Ben & Jerry's",cuisine:"ice_cream",name:"Ben & Jerry's"},matchScore:2,suggestion:true},"amenity/ice_cream/Cold Stone Creamery":{name:"Cold Stone Creamery",icon:"maki-ice-cream",geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q1094923"},addTags:{amenity:"ice_cream",brand:"Cold Stone Creamery","brand:wikidata":"Q1094923","brand:wikipedia":"en:Cold Stone Creamery",cuisine:"ice_cream",name:"Cold Stone Creamery"},removeTags:{amenity:"ice_cream",brand:"Cold Stone Creamery","brand:wikidata":"Q1094923","brand:wikipedia":"en:Cold Stone Creamery",cuisine:"ice_cream",name:"Cold Stone Creamery"},matchScore:2,suggestion:true},"amenity/ice_cream/Freddo":{name:"Freddo",icon:"maki-ice-cream",geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q28823999"},addTags:{amenity:"ice_cream",brand:"Freddo","brand:wikidata":"Q28823999","brand:wikipedia":"es:Freddo",cuisine:"ice_cream",name:"Freddo"},removeTags:{amenity:"ice_cream",brand:"Freddo","brand:wikidata":"Q28823999","brand:wikipedia":"es:Freddo",cuisine:"ice_cream",name:"Freddo"},matchScore:2,suggestion:true},"amenity/ice_cream/Grido":{name:"Grido",icon:"maki-ice-cream",geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q5885724"},addTags:{amenity:"ice_cream",brand:"Grido","brand:wikidata":"Q5885724","brand:wikipedia":"es:Grido Helado",cuisine:"ice_cream",name:"Grido"},removeTags:{amenity:"ice_cream",brand:"Grido","brand:wikidata":"Q5885724","brand:wikipedia":"es:Grido Helado",cuisine:"ice_cream",name:"Grido"},matchScore:2,suggestion:true},"amenity/ice_cream/Rita's Italian Ice":{name:"Rita's Italian Ice",icon:"maki-ice-cream",geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q7336456"},addTags:{amenity:"ice_cream",brand:"Rita's Italian Ice","brand:wikidata":"Q7336456","brand:wikipedia":"en:Rita's Italian Ice",cuisine:"ice_cream",name:"Rita's Italian Ice"},removeTags:{amenity:"ice_cream",brand:"Rita's Italian Ice","brand:wikidata":"Q7336456","brand:wikipedia":"en:Rita's Italian Ice",cuisine:"ice_cream",name:"Rita's Italian Ice"},matchScore:2,suggestion:true},"amenity/ice_cream/sweetFrog":{name:"sweetFrog",icon:"maki-ice-cream",geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q16952110"},addTags:{amenity:"ice_cream",brand:"sweetFrog","brand:wikidata":"Q16952110","brand:wikipedia":"en:Sweet Frog",cuisine:"frozen_yogurt",name:"sweetFrog"},removeTags:{amenity:"ice_cream",brand:"sweetFrog","brand:wikidata":"Q16952110","brand:wikipedia":"en:Sweet Frog",cuisine:"frozen_yogurt",name:"sweetFrog"},matchScore:2,suggestion:true},"amenity/money_transfer/Express Union":{name:"Express Union",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"money_transfer","brand:wikidata":"Q3062276"},addTags:{amenity:"money_transfer",brand:"Express Union","brand:wikidata":"Q3062276","brand:wikipedia":"fr:Express Union",name:"Express Union"},removeTags:{amenity:"money_transfer",brand:"Express Union","brand:wikidata":"Q3062276","brand:wikipedia":"fr:Express Union",name:"Express Union"},matchScore:2,suggestion:true},"amenity/money_transfer/Western Union":{name:"Western Union",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"money_transfer","brand:wikidata":"Q861042"},addTags:{amenity:"money_transfer",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},removeTags:{amenity:"money_transfer",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},matchScore:2,suggestion:true},"amenity/payment_centre/Abitab":{name:"Abitab",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"payment_centre","brand:wikidata":"Q16488129"},addTags:{amenity:"payment_centre",brand:"Abitab","brand:wikidata":"Q16488129","brand:wikipedia":"es:Abitab",name:"Abitab"},removeTags:{amenity:"payment_centre",brand:"Abitab","brand:wikidata":"Q16488129","brand:wikipedia":"es:Abitab",name:"Abitab"},matchScore:2,suggestion:true},"amenity/payment_centre/Rapipago":{name:"Rapipago",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"payment_centre","brand:wikidata":"Q6100413"},addTags:{amenity:"payment_centre",brand:"Rapipago","brand:wikidata":"Q6100413","brand:wikipedia":"es:Rapipago",name:"Rapipago"},removeTags:{amenity:"payment_centre",brand:"Rapipago","brand:wikidata":"Q6100413","brand:wikipedia":"es:Rapipago",name:"Rapipago"},matchScore:2,suggestion:true},"amenity/payment_terminal/Qiwi":{name:"Qiwi",icon:"maki-bank",geometry:["point"],tags:{amenity:"payment_terminal","brand:wikidata":"Q4047736"},addTags:{amenity:"payment_terminal",brand:"Qiwi","brand:wikidata":"Q4047736","brand:wikipedia":"en:Qiwi",name:"Qiwi"},removeTags:{amenity:"payment_terminal",brand:"Qiwi","brand:wikidata":"Q4047736","brand:wikipedia":"en:Qiwi",name:"Qiwi"},matchScore:2,suggestion:true},"amenity/payment_terminal/ПриватБанк":{name:"ПриватБанк",icon:"maki-bank",geometry:["point"],tags:{amenity:"payment_terminal","brand:wikidata":"Q1515015"},addTags:{amenity:"payment_terminal",brand:"ПриватБанк","brand:wikidata":"Q1515015","brand:wikipedia":"en:PrivatBank",name:"ПриватБанк"},removeTags:{amenity:"payment_terminal",brand:"ПриватБанк","brand:wikidata":"Q1515015","brand:wikipedia":"en:PrivatBank",name:"ПриватБанк"},matchScore:2,suggestion:true},"amenity/payment_terminal/Элекснет":{name:"Элекснет",icon:"maki-bank",geometry:["point"],tags:{amenity:"payment_terminal","brand:wikidata":"Q4530795"},addTags:{amenity:"payment_terminal",brand:"Элекснет","brand:wikidata":"Q4530795","brand:wikipedia":"ru:Элекснет",name:"Элекснет"},removeTags:{amenity:"payment_terminal",brand:"Элекснет","brand:wikidata":"Q4530795","brand:wikipedia":"ru:Элекснет",name:"Элекснет"},matchScore:2,suggestion:true},"amenity/pharmacy/36,6":{name:"36,6",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q226889"},addTags:{amenity:"pharmacy",brand:"36,6","brand:wikidata":"Q226889","brand:wikipedia":"ru:36,6 (аптечная сеть)",healthcare:"pharmacy",name:"36,6"},removeTags:{amenity:"pharmacy",brand:"36,6","brand:wikidata":"Q226889","brand:wikipedia":"ru:36,6 (аптечная сеть)",healthcare:"pharmacy",name:"36,6"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Apotek Hjärtat":{name:"Apotek Hjärtat",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q10416114"},addTags:{amenity:"pharmacy",brand:"Apotek Hjärtat","brand:wikidata":"Q10416114","brand:wikipedia":"sv:Apotek Hjärtat",healthcare:"pharmacy",name:"Apotek Hjärtat"},removeTags:{amenity:"pharmacy",brand:"Apotek Hjärtat","brand:wikidata":"Q10416114","brand:wikipedia":"sv:Apotek Hjärtat",healthcare:"pharmacy",name:"Apotek Hjärtat"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Bartell Drugs":{name:"Bartell Drugs",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q4865152"},addTags:{amenity:"pharmacy",brand:"Bartell Drugs","brand:wikidata":"Q4865152","brand:wikipedia":"en:Bartell Drugs",healthcare:"pharmacy",name:"Bartell Drugs"},removeTags:{amenity:"pharmacy",brand:"Bartell Drugs","brand:wikidata":"Q4865152","brand:wikipedia":"en:Bartell Drugs",healthcare:"pharmacy",name:"Bartell Drugs"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Benavides":{name:"Benavides",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5435613"},addTags:{amenity:"pharmacy",brand:"Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Benavides"},removeTags:{amenity:"pharmacy",brand:"Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Benavides"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Boots":{name:"Boots",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q6123139"},addTags:{amenity:"pharmacy",brand:"Boots","brand:wikidata":"Q6123139","brand:wikipedia":"en:Boots UK",healthcare:"pharmacy",name:"Boots"},removeTags:{amenity:"pharmacy",brand:"Boots","brand:wikidata":"Q6123139","brand:wikipedia":"en:Boots UK",healthcare:"pharmacy",name:"Boots"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Brookshire Brothers Pharmacy":{name:"Brookshire Brothers Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q4975084"},addTags:{amenity:"pharmacy",brand:"Brookshire Brothers Pharmacy","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",healthcare:"pharmacy",name:"Brookshire Brothers Pharmacy"},removeTags:{amenity:"pharmacy",brand:"Brookshire Brothers Pharmacy","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",healthcare:"pharmacy",name:"Brookshire Brothers Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/CVS":{name:"CVS",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q2078880"},addTags:{amenity:"pharmacy",brand:"CVS","brand:wikidata":"Q2078880","brand:wikipedia":"en:CVS Pharmacy",healthcare:"pharmacy",name:"CVS"},removeTags:{amenity:"pharmacy",brand:"CVS","brand:wikidata":"Q2078880","brand:wikipedia":"en:CVS Pharmacy",healthcare:"pharmacy",name:"CVS"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Catena":{name:"Catena",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q24035728"},addTags:{amenity:"pharmacy",brand:"Catena","brand:wikidata":"Q24035728","brand:wikipedia":"ro:Farmacia Catena",healthcare:"pharmacy",name:"Catena"},removeTags:{amenity:"pharmacy",brand:"Catena","brand:wikidata":"Q24035728","brand:wikipedia":"ro:Farmacia Catena",healthcare:"pharmacy",name:"Catena"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Chemist Warehouse":{name:"Chemist Warehouse",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q48782120"},addTags:{amenity:"pharmacy",brand:"Chemist Warehouse","brand:wikidata":"Q48782120","brand:wikipedia":"en:Chemist Warehouse",healthcare:"pharmacy",name:"Chemist Warehouse"},removeTags:{amenity:"pharmacy",brand:"Chemist Warehouse","brand:wikidata":"Q48782120","brand:wikipedia":"en:Chemist Warehouse",healthcare:"pharmacy",name:"Chemist Warehouse"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Costco Pharmacy":{name:"Costco Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q715583"},addTags:{amenity:"pharmacy",healthcare:"pharmacy",brand:"Costco Pharmacy","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Pharmacy"},removeTags:{amenity:"pharmacy",healthcare:"pharmacy",brand:"Costco Pharmacy","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Cruz Verde":{name:"Cruz Verde",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5856071"},addTags:{amenity:"pharmacy",brand:"Cruz Verde","brand:wikidata":"Q5856071","brand:wikipedia":"es:Farmacias Cruz Verde",healthcare:"pharmacy",name:"Cruz Verde"},removeTags:{amenity:"pharmacy",brand:"Cruz Verde","brand:wikidata":"Q5856071","brand:wikipedia":"es:Farmacias Cruz Verde",healthcare:"pharmacy",name:"Cruz Verde"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Dr. Max":{name:"Dr. Max",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q56317371"},addTags:{amenity:"pharmacy",brand:"Dr. Max","brand:wikidata":"Q56317371","brand:wikipedia":"fr:Dr.Max",healthcare:"pharmacy",name:"Dr. Max"},removeTags:{amenity:"pharmacy",brand:"Dr. Max","brand:wikidata":"Q56317371","brand:wikipedia":"fr:Dr.Max",healthcare:"pharmacy",name:"Dr. Max"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Droga Raia":{name:"Droga Raia",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q10357101"},addTags:{amenity:"pharmacy",brand:"Droga Raia","brand:wikidata":"Q10357101","brand:wikipedia":"pt:RaiaDrogasil",healthcare:"pharmacy",name:"Droga Raia"},removeTags:{amenity:"pharmacy",brand:"Droga Raia","brand:wikidata":"Q10357101","brand:wikipedia":"pt:RaiaDrogasil",healthcare:"pharmacy",name:"Droga Raia"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Drogaria São Paulo":{name:"Drogaria São Paulo",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5308184"},addTags:{amenity:"pharmacy",brand:"Drogaria São Paulo","brand:wikidata":"Q5308184","brand:wikipedia":"en:Grupo DPSP",healthcare:"pharmacy",name:"Drogaria São Paulo"},removeTags:{amenity:"pharmacy",brand:"Drogaria São Paulo","brand:wikidata":"Q5308184","brand:wikipedia":"en:Grupo DPSP",healthcare:"pharmacy",name:"Drogaria São Paulo"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Drogasil":{name:"Drogasil",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5308185"},addTags:{amenity:"pharmacy",brand:"Drogasil","brand:wikidata":"Q5308185","brand:wikipedia":"pt:Drogasil",healthcare:"pharmacy",name:"Drogasil"},removeTags:{amenity:"pharmacy",brand:"Drogasil","brand:wikidata":"Q5308185","brand:wikipedia":"pt:Drogasil",healthcare:"pharmacy",name:"Drogasil"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Duane Reade":{name:"Duane Reade",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5310380"},addTags:{amenity:"pharmacy",brand:"Duane Reade","brand:wikidata":"Q5310380","brand:wikipedia":"en:Duane Reade",healthcare:"pharmacy",name:"Duane Reade"},removeTags:{amenity:"pharmacy",brand:"Duane Reade","brand:wikidata":"Q5310380","brand:wikipedia":"en:Duane Reade",healthcare:"pharmacy",name:"Duane Reade"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Eurovaistinė":{name:"Eurovaistinė",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q267205"},addTags:{amenity:"pharmacy",brand:"Eurovaistinė","brand:wikidata":"Q267205","brand:wikipedia":"en:Euroapotheca",healthcare:"pharmacy",name:"Eurovaistinė"},removeTags:{amenity:"pharmacy",brand:"Eurovaistinė","brand:wikidata":"Q267205","brand:wikipedia":"en:Euroapotheca",healthcare:"pharmacy",name:"Eurovaistinė"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Familiprix":{name:"Familiprix",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q3064881"},addTags:{amenity:"pharmacy",brand:"Familiprix","brand:wikidata":"Q3064881","brand:wikipedia":"en:Familiprix",healthcare:"pharmacy",name:"Familiprix"},removeTags:{amenity:"pharmacy",brand:"Familiprix","brand:wikidata":"Q3064881","brand:wikipedia":"en:Familiprix",healthcare:"pharmacy",name:"Familiprix"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmacia Benavides":{name:"Farmacia Benavides",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5435613"},addTags:{amenity:"pharmacy",brand:"Farmacia Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Farmacia Benavides"},removeTags:{amenity:"pharmacy",brand:"Farmacia Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Farmacia Benavides"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmacia Guadalajara":{name:"Farmacia Guadalajara",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5435609"},addTags:{amenity:"pharmacy",brand:"Farmacia Guadalajara","brand:wikidata":"Q5435609","brand:wikipedia":"en:Farmacias Guadalajara",healthcare:"pharmacy",name:"Farmacia Guadalajara"},removeTags:{amenity:"pharmacy",brand:"Farmacia Guadalajara","brand:wikidata":"Q5435609","brand:wikipedia":"en:Farmacias Guadalajara",healthcare:"pharmacy",name:"Farmacia Guadalajara"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias Ahumada":{name:"Farmacias Ahumada",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5856069"},addTags:{amenity:"pharmacy",brand:"Farmacias Ahumada","brand:wikidata":"Q5856069","brand:wikipedia":"es:Farmacias Ahumada",healthcare:"pharmacy",name:"Farmacias Ahumada"},removeTags:{amenity:"pharmacy",brand:"Farmacias Ahumada","brand:wikidata":"Q5856069","brand:wikipedia":"es:Farmacias Ahumada",healthcare:"pharmacy",name:"Farmacias Ahumada"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias Cruz Verde":{name:"Farmacias Cruz Verde",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5856071"},addTags:{amenity:"pharmacy",brand:"Farmacias Cruz Verde","brand:wikidata":"Q5856071","brand:wikipedia":"es:Farmacias Cruz Verde",healthcare:"pharmacy",name:"Farmacias Cruz Verde"},removeTags:{amenity:"pharmacy",brand:"Farmacias Cruz Verde","brand:wikidata":"Q5856071","brand:wikipedia":"es:Farmacias Cruz Verde",healthcare:"pharmacy",name:"Farmacias Cruz Verde"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias SalcoBrand":{name:"Farmacias SalcoBrand",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q2877054"},addTags:{amenity:"pharmacy",brand:"Farmacias SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"Farmacias SalcoBrand"},removeTags:{amenity:"pharmacy",brand:"Farmacias SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"Farmacias SalcoBrand"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmacity":{name:"Farmacity",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5856076"},addTags:{amenity:"pharmacy",brand:"Farmacity","brand:wikidata":"Q5856076","brand:wikipedia":"es:Farmacity",healthcare:"pharmacy",name:"Farmacity"},removeTags:{amenity:"pharmacy",brand:"Farmacity","brand:wikidata":"Q5856076","brand:wikipedia":"es:Farmacity",healthcare:"pharmacy",name:"Farmacity"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmahorro":{name:"Farmahorro",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q20015002"},addTags:{amenity:"pharmacy",brand:"Farmahorro","brand:wikidata":"Q20015002","brand:wikipedia":"es:Farmahorro",healthcare:"pharmacy",name:"Farmahorro"},removeTags:{amenity:"pharmacy",brand:"Farmahorro","brand:wikidata":"Q20015002","brand:wikipedia":"es:Farmahorro",healthcare:"pharmacy",name:"Farmahorro"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmatodo":{name:"Farmatodo",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5856092"},addTags:{amenity:"pharmacy",brand:"Farmatodo","brand:wikidata":"Q5856092","brand:wikipedia":"es:Farmatodo",healthcare:"pharmacy",name:"Farmatodo"},removeTags:{amenity:"pharmacy",brand:"Farmatodo","brand:wikidata":"Q5856092","brand:wikipedia":"es:Farmatodo",healthcare:"pharmacy",name:"Farmatodo"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Gintarinė vaistinė":{name:"Gintarinė vaistinė",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q15857801"},addTags:{amenity:"pharmacy",brand:"Gintarinė vaistinė","brand:wikidata":"Q15857801","brand:wikipedia":"lt:Gintarinė vaistinė",healthcare:"pharmacy",name:"Gintarinė vaistinė"},removeTags:{amenity:"pharmacy",brand:"Gintarinė vaistinė","brand:wikidata":"Q15857801","brand:wikipedia":"lt:Gintarinė vaistinė",healthcare:"pharmacy",name:"Gintarinė vaistinė"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Guardian":{name:"Guardian",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q13646560"},addTags:{amenity:"pharmacy",brand:"Guardian","brand:wikidata":"Q13646560","brand:wikipedia":"en:Mannings",healthcare:"pharmacy",name:"Guardian"},removeTags:{amenity:"pharmacy",brand:"Guardian","brand:wikidata":"Q13646560","brand:wikipedia":"en:Mannings",healthcare:"pharmacy",name:"Guardian"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/H-E-B Pharmacy":{name:"H-E-B Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q830621"},addTags:{amenity:"pharmacy",brand:"H-E-B Pharmacy","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",healthcare:"pharmacy",name:"H-E-B Pharmacy"},removeTags:{amenity:"pharmacy",brand:"H-E-B Pharmacy","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",healthcare:"pharmacy",name:"H-E-B Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Hy-Vee Pharmacy":{name:"Hy-Vee Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q1639719"},addTags:{amenity:"pharmacy",brand:"Hy-Vee Pharmacy","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",healthcare:"pharmacy",name:"Hy-Vee Pharmacy"},removeTags:{amenity:"pharmacy",brand:"Hy-Vee Pharmacy","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",healthcare:"pharmacy",name:"Hy-Vee Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Inkafarma":{name:"Inkafarma",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q10997748"},addTags:{amenity:"pharmacy",brand:"Inkafarma","brand:wikidata":"Q10997748","brand:wikipedia":"es:Inkafarma",healthcare:"pharmacy",name:"Inkafarma"},removeTags:{amenity:"pharmacy",brand:"Inkafarma","brand:wikidata":"Q10997748","brand:wikipedia":"es:Inkafarma",healthcare:"pharmacy",name:"Inkafarma"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Jean Coutu":{name:"Jean Coutu",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q3117457"},addTags:{amenity:"pharmacy",brand:"Jean Coutu","brand:wikidata":"Q3117457","brand:wikipedia":"en:Jean Coutu Group",healthcare:"pharmacy",name:"Jean Coutu"},removeTags:{amenity:"pharmacy",brand:"Jean Coutu","brand:wikidata":"Q3117457","brand:wikipedia":"en:Jean Coutu Group",healthcare:"pharmacy",name:"Jean Coutu"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Kimia Farma":{name:"Kimia Farma",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11264892"},addTags:{amenity:"pharmacy",brand:"Kimia Farma","brand:wikidata":"Q11264892","brand:wikipedia":"en:Kimia Farma",healthcare:"pharmacy",name:"Kimia Farma"},removeTags:{amenity:"pharmacy",brand:"Kimia Farma","brand:wikidata":"Q11264892","brand:wikipedia":"en:Kimia Farma",healthcare:"pharmacy",name:"Kimia Farma"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Kinney Drugs":{name:"Kinney Drugs",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q6414090"},addTags:{amenity:"pharmacy",brand:"Kinney Drugs","brand:wikidata":"Q6414090","brand:wikipedia":"en:Kinney Drugs",healthcare:"pharmacy",name:"Kinney Drugs"},removeTags:{amenity:"pharmacy",brand:"Kinney Drugs","brand:wikidata":"Q6414090","brand:wikipedia":"en:Kinney Drugs",healthcare:"pharmacy",name:"Kinney Drugs"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Lloyds Pharmacy":{name:"Lloyds Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q6662870"},addTags:{amenity:"pharmacy",brand:"Lloyds Pharmacy","brand:wikidata":"Q6662870","brand:wikipedia":"en:LloydsPharmacy",healthcare:"pharmacy",name:"Lloyds Pharmacy"},removeTags:{amenity:"pharmacy",brand:"Lloyds Pharmacy","brand:wikidata":"Q6662870","brand:wikipedia":"en:LloydsPharmacy",healthcare:"pharmacy",name:"Lloyds Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/London Drugs":{name:"London Drugs",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q3258955"},addTags:{amenity:"pharmacy",brand:"London Drugs","brand:wikidata":"Q3258955","brand:wikipedia":"en:London Drugs",healthcare:"pharmacy",name:"London Drugs"},removeTags:{amenity:"pharmacy",brand:"London Drugs","brand:wikidata":"Q3258955","brand:wikipedia":"en:London Drugs",healthcare:"pharmacy",name:"London Drugs"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Mercury Drug":{name:"Mercury Drug",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q6818610"},addTags:{amenity:"pharmacy",brand:"Mercury Drug","brand:wikidata":"Q6818610","brand:wikipedia":"en:Mercury Drug",healthcare:"pharmacy",name:"Mercury Drug"},removeTags:{amenity:"pharmacy",brand:"Mercury Drug","brand:wikidata":"Q6818610","brand:wikipedia":"en:Mercury Drug",healthcare:"pharmacy",name:"Mercury Drug"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Mēness aptieka":{name:"Mēness aptieka",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q57583051"},addTags:{amenity:"pharmacy",brand:"Mēness aptieka","brand:wikidata":"Q57583051",healthcare:"pharmacy",name:"Mēness aptieka"},removeTags:{amenity:"pharmacy",brand:"Mēness aptieka","brand:wikidata":"Q57583051",healthcare:"pharmacy",name:"Mēness aptieka"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Pague Menos":{name:"Pague Menos",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7124466"},addTags:{amenity:"pharmacy",brand:"Pague Menos","brand:wikidata":"Q7124466","brand:wikipedia":"pt:Pague Menos",healthcare:"pharmacy",name:"Pague Menos"},removeTags:{amenity:"pharmacy",brand:"Pague Menos","brand:wikidata":"Q7124466","brand:wikipedia":"pt:Pague Menos",healthcare:"pharmacy",name:"Pague Menos"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Pharmacie Principale":{name:"Pharmacie Principale",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q1547749"},addTags:{amenity:"pharmacy",brand:"Pharmacie Principale","brand:wikidata":"Q1547749","brand:wikipedia":"fr:PP Holding Group",healthcare:"pharmacy",name:"Pharmacie Principale"},removeTags:{amenity:"pharmacy",brand:"Pharmacie Principale","brand:wikidata":"Q1547749","brand:wikipedia":"fr:PP Holding Group",healthcare:"pharmacy",name:"Pharmacie Principale"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Pharmaprix":{name:"Pharmaprix",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q1820137"},addTags:{amenity:"pharmacy",brand:"Pharmaprix","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Pharmaprix"},removeTags:{amenity:"pharmacy",brand:"Pharmaprix","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Pharmaprix"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Pharmasave":{name:"Pharmasave",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q17093822"},addTags:{amenity:"pharmacy",brand:"Pharmasave","brand:wikidata":"Q17093822","brand:wikipedia":"en:Pharmasave",healthcare:"pharmacy",name:"Pharmasave"},removeTags:{amenity:"pharmacy",brand:"Pharmasave","brand:wikidata":"Q17093822","brand:wikipedia":"en:Pharmasave",healthcare:"pharmacy",name:"Pharmasave"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Rexall":{name:"Rexall",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7319360"},addTags:{amenity:"pharmacy",brand:"Rexall","brand:wikidata":"Q7319360","brand:wikipedia":"en:Rexall",healthcare:"pharmacy",name:"Rexall"},removeTags:{amenity:"pharmacy",brand:"Rexall","brand:wikidata":"Q7319360","brand:wikipedia":"en:Rexall",healthcare:"pharmacy",name:"Rexall"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Rite Aid":{name:"Rite Aid",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q3433273"},addTags:{amenity:"pharmacy",brand:"Rite Aid","brand:wikidata":"Q3433273","brand:wikipedia":"en:Rite Aid",healthcare:"pharmacy",name:"Rite Aid"},removeTags:{amenity:"pharmacy",brand:"Rite Aid","brand:wikidata":"Q3433273","brand:wikipedia":"en:Rite Aid",healthcare:"pharmacy",name:"Rite Aid"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/SalcoBrand":{name:"SalcoBrand",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q2877054"},addTags:{amenity:"pharmacy",brand:"SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"SalcoBrand"},removeTags:{amenity:"pharmacy",brand:"SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"SalcoBrand"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Sensiblu":{name:"Sensiblu",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q12740640"},addTags:{amenity:"pharmacy",brand:"Sensiblu","brand:wikidata":"Q12740640","brand:wikipedia":"ro:Sensiblu",healthcare:"pharmacy",name:"Sensiblu"},removeTags:{amenity:"pharmacy",brand:"Sensiblu","brand:wikidata":"Q12740640","brand:wikipedia":"ro:Sensiblu",healthcare:"pharmacy",name:"Sensiblu"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Shoppers Drug Mart":{name:"Shoppers Drug Mart",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q1820137"},addTags:{amenity:"pharmacy",brand:"Shoppers Drug Mart","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Shoppers Drug Mart"},removeTags:{amenity:"pharmacy",brand:"Shoppers Drug Mart","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Shoppers Drug Mart"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/South Star Drug":{name:"South Star Drug",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7568544"},addTags:{amenity:"pharmacy",brand:"South Star Drug","brand:wikidata":"Q7568544","brand:wikipedia":"en:South Star Drug",healthcare:"pharmacy",name:"South Star Drug"},removeTags:{amenity:"pharmacy",brand:"South Star Drug","brand:wikidata":"Q7568544","brand:wikipedia":"en:South Star Drug",healthcare:"pharmacy",name:"South Star Drug"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Superdrug":{name:"Superdrug",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7643261"},addTags:{amenity:"pharmacy",brand:"Superdrug","brand:wikidata":"Q7643261","brand:wikipedia":"en:Superdrug",healthcare:"pharmacy",name:"Superdrug"},removeTags:{amenity:"pharmacy",brand:"Superdrug","brand:wikidata":"Q7643261","brand:wikipedia":"en:Superdrug",healthcare:"pharmacy",name:"Superdrug"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Uniprix":{name:"Uniprix",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q683265"},addTags:{amenity:"pharmacy",brand:"Uniprix","brand:wikidata":"Q683265","brand:wikipedia":"en:Uniprix",healthcare:"pharmacy",name:"Uniprix"},removeTags:{amenity:"pharmacy",brand:"Uniprix","brand:wikidata":"Q683265","brand:wikipedia":"en:Uniprix",healthcare:"pharmacy",name:"Uniprix"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Walgreens":{name:"Walgreens",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q1591889"},addTags:{amenity:"pharmacy",brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",healthcare:"pharmacy",name:"Walgreens"},removeTags:{amenity:"pharmacy",brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",healthcare:"pharmacy",name:"Walgreens"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Walmart Pharmacy":{name:"Walmart Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q483551"},addTags:{amenity:"pharmacy",brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",healthcare:"pharmacy",name:"Walmart Pharmacy",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},removeTags:{amenity:"pharmacy",brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",healthcare:"pharmacy",name:"Walmart Pharmacy",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Watsons":{name:"Watsons",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7974785"},addTags:{amenity:"pharmacy",brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",healthcare:"pharmacy",name:"Watsons"},removeTags:{amenity:"pharmacy",brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",healthcare:"pharmacy",name:"Watsons"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Well Pharmacy":{name:"Well Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7726524"},addTags:{amenity:"pharmacy",brand:"Well Pharmacy","brand:wikidata":"Q7726524","brand:wikipedia":"en:Well Pharmacy",healthcare:"pharmacy",name:"Well Pharmacy"},removeTags:{amenity:"pharmacy",brand:"Well Pharmacy","brand:wikidata":"Q7726524","brand:wikipedia":"en:Well Pharmacy",healthcare:"pharmacy",name:"Well Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Ригла":{name:"Ригла",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q4394431"},addTags:{amenity:"pharmacy",brand:"Ригла","brand:wikidata":"Q4394431","brand:wikipedia":"ru:Ригла",healthcare:"pharmacy",name:"Ригла"},removeTags:{amenity:"pharmacy",brand:"Ригла","brand:wikidata":"Q4394431","brand:wikipedia":"ru:Ригла",healthcare:"pharmacy",name:"Ригла"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/くすりの福太郎":{name:"くすりの福太郎",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q17214460"},addTags:{amenity:"pharmacy",brand:"くすりの福太郎","brand:wikidata":"Q17214460","brand:wikipedia":"ja:くすりの福太郎",healthcare:"pharmacy",name:"くすりの福太郎"},removeTags:{amenity:"pharmacy",brand:"くすりの福太郎","brand:wikidata":"Q17214460","brand:wikipedia":"ja:くすりの福太郎",healthcare:"pharmacy",name:"くすりの福太郎"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/ウエルシア":{name:"ウエルシア",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11288684"},addTags:{amenity:"pharmacy",brand:"ウエルシア","brand:wikidata":"Q11288684","brand:wikipedia":"ja:ウエルシアホールディングス",healthcare:"pharmacy",name:"ウエルシア"},removeTags:{amenity:"pharmacy",brand:"ウエルシア","brand:wikidata":"Q11288684","brand:wikipedia":"ja:ウエルシアホールディングス",healthcare:"pharmacy",name:"ウエルシア"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/ウエルシア薬局":{name:"ウエルシア薬局",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11288687"},addTags:{amenity:"pharmacy",brand:"ウエルシア薬局","brand:wikidata":"Q11288687","brand:wikipedia":"ja:ウエルシア薬局",healthcare:"pharmacy",name:"ウエルシア薬局"},removeTags:{amenity:"pharmacy",brand:"ウエルシア薬局","brand:wikidata":"Q11288687","brand:wikipedia":"ja:ウエルシア薬局",healthcare:"pharmacy",name:"ウエルシア薬局"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/カワチ薬品":{name:"カワチ薬品",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11295397"},addTags:{amenity:"pharmacy",brand:"カワチ薬品","brand:wikidata":"Q11295397","brand:wikipedia":"ja:カワチ薬品",healthcare:"pharmacy",name:"カワチ薬品"},removeTags:{amenity:"pharmacy",brand:"カワチ薬品","brand:wikidata":"Q11295397","brand:wikipedia":"ja:カワチ薬品",healthcare:"pharmacy",name:"カワチ薬品"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/キリン堂":{name:"キリン堂",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11297751"},addTags:{amenity:"pharmacy",brand:"キリン堂","brand:wikidata":"Q11297751","brand:wikipedia":"ja:キリン堂",healthcare:"pharmacy",name:"キリン堂"},removeTags:{amenity:"pharmacy",brand:"キリン堂","brand:wikidata":"Q11297751","brand:wikipedia":"ja:キリン堂",healthcare:"pharmacy",name:"キリン堂"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/クリエイト":{name:"クリエイト",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11299163"},addTags:{amenity:"pharmacy",brand:"クリエイト","brand:wikidata":"Q11299163","brand:wikipedia":"ja:クリエイトSDホールディングス",healthcare:"pharmacy",name:"クリエイト"},removeTags:{amenity:"pharmacy",brand:"クリエイト","brand:wikidata":"Q11299163","brand:wikipedia":"ja:クリエイトSDホールディングス",healthcare:"pharmacy",name:"クリエイト"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/ココカラファイン":{name:"ココカラファイン",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11301948"},addTags:{amenity:"pharmacy",brand:"ココカラファイン","brand:wikidata":"Q11301948","brand:wikipedia":"ja:ココカラファイン",healthcare:"pharmacy",name:"ココカラファイン"},removeTags:{amenity:"pharmacy",brand:"ココカラファイン","brand:wikidata":"Q11301948","brand:wikipedia":"ja:ココカラファイン",healthcare:"pharmacy",name:"ココカラファイン"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/サンドラッグ":{name:"サンドラッグ",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11305867"},addTags:{amenity:"pharmacy",brand:"サンドラッグ","brand:wikidata":"Q11305867","brand:wikipedia":"ja:サンドラッグ",healthcare:"pharmacy",name:"サンドラッグ"},removeTags:{amenity:"pharmacy",brand:"サンドラッグ","brand:wikidata":"Q11305867","brand:wikipedia":"ja:サンドラッグ",healthcare:"pharmacy",name:"サンドラッグ"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/セイジョー":{name:"セイジョー",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11314133"},addTags:{amenity:"pharmacy",brand:"セイジョー","brand:wikidata":"Q11314133","brand:wikipedia":"ja:セイジョー",healthcare:"pharmacy",name:"セイジョー"},removeTags:{amenity:"pharmacy",brand:"セイジョー","brand:wikidata":"Q11314133","brand:wikipedia":"ja:セイジョー",healthcare:"pharmacy",name:"セイジョー"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/ダイコクドラッグ":{name:"ダイコクドラッグ",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11316754"},addTags:{amenity:"pharmacy",brand:"ダイコクドラッグ","brand:wikidata":"Q11316754","brand:wikipedia":"ja:ダイコク",healthcare:"pharmacy",name:"ダイコクドラッグ"},removeTags:{amenity:"pharmacy",brand:"ダイコクドラッグ","brand:wikidata":"Q11316754","brand:wikipedia":"ja:ダイコク",healthcare:"pharmacy",name:"ダイコクドラッグ"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/マツモトキヨシ":{name:"マツモトキヨシ",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q8014776"},addTags:{amenity:"pharmacy",brand:"マツモトキヨシ","brand:wikidata":"Q8014776","brand:wikipedia":"ja:マツモトキヨシ",healthcare:"pharmacy",name:"マツモトキヨシ"},removeTags:{amenity:"pharmacy",brand:"マツモトキヨシ","brand:wikidata":"Q8014776","brand:wikipedia":"ja:マツモトキヨシ",healthcare:"pharmacy",name:"マツモトキヨシ"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/post_box/Deutsche Post":{name:"Deutsche Post",icon:"temaki-post_box",geometry:["point","vertex"],tags:{amenity:"post_box","brand:wikidata":"Q157645"},addTags:{amenity:"post_box",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},removeTags:{amenity:"post_box",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},matchScore:2,suggestion:true},"amenity/post_box/USPS":{name:"USPS",icon:"temaki-post_box",geometry:["point","vertex"],tags:{amenity:"post_box","brand:wikidata":"Q668687"},addTags:{amenity:"post_box",brand:"USPS","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"USPS",operator:"USPS"},removeTags:{amenity:"post_box",brand:"USPS","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"USPS",operator:"USPS"},matchScore:2,suggestion:true},"amenity/post_office/Australia Post":{name:"Australia Post",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1142936"},addTags:{amenity:"post_office",brand:"Australia Post","brand:wikidata":"Q1142936","brand:wikipedia":"en:Australia Post",name:"Australia Post"},removeTags:{amenity:"post_office",brand:"Australia Post","brand:wikidata":"Q1142936","brand:wikipedia":"en:Australia Post",name:"Australia Post"},matchScore:2,suggestion:true},"amenity/post_office/CTT":{name:"CTT",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q909429"},addTags:{amenity:"post_office",brand:"CTT","brand:wikidata":"Q909429","brand:wikipedia":"en:CTT (Macau)",name:"CTT"},removeTags:{amenity:"post_office",brand:"CTT","brand:wikidata":"Q909429","brand:wikipedia":"en:CTT (Macau)",name:"CTT"},matchScore:2,suggestion:true},"amenity/post_office/Canada Post":{name:"Canada Post",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1032001"},addTags:{amenity:"post_office",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"},removeTags:{amenity:"post_office",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"},matchScore:2,suggestion:true},"amenity/post_office/Correios":{name:"Correios",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q3375004"},addTags:{amenity:"post_office",brand:"Correios","brand:wikidata":"Q3375004","brand:wikipedia":"en:Correios",name:"Correios"},removeTags:{amenity:"post_office",brand:"Correios","brand:wikidata":"Q3375004","brand:wikipedia":"en:Correios",name:"Correios"},matchScore:2,suggestion:true},"amenity/post_office/Correo Argentino":{name:"Correo Argentino",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q4036566"},addTags:{amenity:"post_office",brand:"Correo Argentino","brand:wikidata":"Q4036566","brand:wikipedia":"en:Correo Argentino",name:"Correo Argentino"},removeTags:{amenity:"post_office",brand:"Correo Argentino","brand:wikidata":"Q4036566","brand:wikipedia":"en:Correo Argentino",name:"Correo Argentino"},matchScore:2,suggestion:true},"amenity/post_office/Correos de Chile":{name:"Correos de Chile",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q5172893"},addTags:{amenity:"post_office",brand:"Correos de Chile","brand:wikidata":"Q5172893","brand:wikipedia":"en:Correos de Chile",name:"Correos de Chile"},removeTags:{amenity:"post_office",brand:"Correos de Chile","brand:wikidata":"Q5172893","brand:wikipedia":"en:Correos de Chile",name:"Correos de Chile"},matchScore:2,suggestion:true},"amenity/post_office/Correos de Costa Rica":{name:"Correos de Costa Rica",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q5172894"},addTags:{amenity:"post_office",brand:"Correos de Costa Rica","brand:wikidata":"Q5172894","brand:wikipedia":"en:Correos de Costa Rica",name:"Correos de Costa Rica"},removeTags:{amenity:"post_office",brand:"Correos de Costa Rica","brand:wikidata":"Q5172894","brand:wikipedia":"en:Correos de Costa Rica",name:"Correos de Costa Rica"},matchScore:2,suggestion:true},"amenity/post_office/DHL":{name:"DHL",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q489815"},addTags:{amenity:"post_office",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL",operator:"DHL"},removeTags:{amenity:"post_office",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL",operator:"DHL"},matchScore:2,suggestion:true},"amenity/post_office/DPD Paketshop":{name:"DPD Paketshop",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q541030"},addTags:{amenity:"post_office",brand:"DPD Paketshop","brand:wikidata":"Q541030","brand:wikipedia":"en:DPDgroup",name:"DPD Paketshop"},removeTags:{amenity:"post_office",brand:"DPD Paketshop","brand:wikidata":"Q541030","brand:wikipedia":"en:DPDgroup",name:"DPD Paketshop"},matchScore:2,suggestion:true},"amenity/post_office/Deutsche Post":{name:"Deutsche Post",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q157645"},addTags:{amenity:"post_office",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},removeTags:{amenity:"post_office",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},matchScore:2,suggestion:true},"amenity/post_office/Fancourier":{name:"Fancourier",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q12727984"},addTags:{amenity:"post_office",brand:"Fancourier","brand:wikidata":"Q12727984","brand:wikipedia":"ro:FAN Courier Express",name:"Fancourier"},removeTags:{amenity:"post_office",brand:"Fancourier","brand:wikidata":"Q12727984","brand:wikipedia":"ro:FAN Courier Express",name:"Fancourier"},matchScore:2,suggestion:true},"amenity/post_office/FedEx":{name:"FedEx",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q459477"},addTags:{amenity:"post_office",brand:"FedEx","brand:wikidata":"Q459477","brand:wikipedia":"en:FedEx",name:"FedEx"},removeTags:{amenity:"post_office",brand:"FedEx","brand:wikidata":"Q459477","brand:wikipedia":"en:FedEx",name:"FedEx"},matchScore:2,suggestion:true},"amenity/post_office/Hermes Paketshop":{name:"Hermes Paketshop",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1613532"},addTags:{amenity:"post_office",brand:"Hermes Paketshop","brand:wikidata":"Q1613532","brand:wikipedia":"en:Hermes Group",name:"Hermes Paketshop"},removeTags:{amenity:"post_office",brand:"Hermes Paketshop","brand:wikidata":"Q1613532","brand:wikipedia":"en:Hermes Group",name:"Hermes Paketshop"},matchScore:2,suggestion:true},"amenity/post_office/LBC":{name:"LBC",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q17075584"},addTags:{amenity:"post_office",brand:"LBC","brand:wikidata":"Q17075584","brand:wikipedia":"en:LBC Express",name:"LBC"},removeTags:{amenity:"post_office",brand:"LBC","brand:wikidata":"Q17075584","brand:wikipedia":"en:LBC Express",name:"LBC"},matchScore:2,suggestion:true},"amenity/post_office/La Poste":{name:"La Poste",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q373724"},addTags:{amenity:"post_office",brand:"La Poste","brand:wikidata":"Q373724","brand:wikipedia":"fr:La Poste (entreprise française)",name:"La Poste"},removeTags:{amenity:"post_office",brand:"La Poste","brand:wikidata":"Q373724","brand:wikipedia":"fr:La Poste (entreprise française)",name:"La Poste"},matchScore:2,suggestion:true},"amenity/post_office/MRW":{name:"MRW",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q23767821"},addTags:{amenity:"post_office",brand:"MRW","brand:wikidata":"Q23767821","brand:wikipedia":"es:MRW",name:"MRW"},removeTags:{amenity:"post_office",brand:"MRW","brand:wikidata":"Q23767821","brand:wikipedia":"es:MRW",name:"MRW"},matchScore:2,suggestion:true},"amenity/post_office/Oficina de Correos":{name:"Oficina de Correos",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q776605"},addTags:{amenity:"post_office",brand:"Oficina de Correos","brand:wikidata":"Q776605","brand:wikipedia":"es:Correos (España)",name:"Oficina de Correos"},removeTags:{amenity:"post_office",brand:"Oficina de Correos","brand:wikidata":"Q776605","brand:wikipedia":"es:Correos (España)",name:"Oficina de Correos"},matchScore:2,suggestion:true},"amenity/post_office/Poczta Polska":{name:"Poczta Polska",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q168833"},addTags:{amenity:"post_office",brand:"Poczta Polska","brand:wikidata":"Q168833","brand:wikipedia":"en:Poczta Polska",name:"Poczta Polska"},removeTags:{amenity:"post_office",brand:"Poczta Polska","brand:wikidata":"Q168833","brand:wikipedia":"en:Poczta Polska",name:"Poczta Polska"},matchScore:2,suggestion:true},"amenity/post_office/Poste Italiane":{name:"Poste Italiane",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q495026"},addTags:{amenity:"post_office",brand:"Poste Italiane","brand:wikidata":"Q495026","brand:wikipedia":"en:Poste italiane",name:"Poste Italiane"},removeTags:{amenity:"post_office",brand:"Poste Italiane","brand:wikidata":"Q495026","brand:wikipedia":"en:Poste italiane",name:"Poste Italiane"},matchScore:2,suggestion:true},"amenity/post_office/Slovenská pošta":{name:"Slovenská pošta",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1191849"},addTags:{amenity:"post_office",brand:"Slovenská pošta","brand:wikidata":"Q1191849","brand:wikipedia":"en:Slovenská pošta",name:"Slovenská pošta"},removeTags:{amenity:"post_office",brand:"Slovenská pošta","brand:wikidata":"Q1191849","brand:wikipedia":"en:Slovenská pošta",name:"Slovenská pošta"},matchScore:2,suggestion:true},"amenity/post_office/The UPS Store":{name:"The UPS Store",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q7771029"},addTags:{amenity:"post_office",brand:"The UPS Store","brand:wikidata":"Q7771029","brand:wikipedia":"en:The UPS Store",name:"The UPS Store"},removeTags:{amenity:"post_office",brand:"The UPS Store","brand:wikidata":"Q7771029","brand:wikipedia":"en:The UPS Store",name:"The UPS Store"},matchScore:2,suggestion:true},"amenity/post_office/US Post Office":{name:"US Post Office",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q668687"},addTags:{amenity:"post_office",brand:"US Post Office","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"US Post Office",operator:"USPS"},removeTags:{amenity:"post_office",brand:"US Post Office","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"US Post Office",operator:"USPS"},matchScore:2,suggestion:true},"amenity/post_office/ΕΛΤΑ":{name:"ΕΛΤΑ",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1275135"},addTags:{amenity:"post_office",brand:"ΕΛΤΑ","brand:wikidata":"Q1275135","brand:wikipedia":"el:Ελληνικά Ταχυδρομεία",name:"ΕΛΤΑ"},removeTags:{amenity:"post_office",brand:"ΕΛΤΑ","brand:wikidata":"Q1275135","brand:wikipedia":"el:Ελληνικά Ταχυδρομεία",name:"ΕΛΤΑ"},matchScore:2,suggestion:true},"amenity/post_office/Белпочта":{name:"Белпочта",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q2662336"},addTags:{amenity:"post_office",brand:"Белпочта","brand:wikidata":"Q2662336","brand:wikipedia":"en:Belposhta",name:"Белпочта"},removeTags:{amenity:"post_office",brand:"Белпочта","brand:wikidata":"Q2662336","brand:wikipedia":"en:Belposhta",name:"Белпочта"},matchScore:2,suggestion:true},"amenity/post_office/Казпочта":{name:"Казпочта",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q746263"},addTags:{amenity:"post_office",brand:"Казпочта","brand:wikidata":"Q746263","brand:wikipedia":"ru:Казпочта",name:"Казпочта"},removeTags:{amenity:"post_office",brand:"Казпочта","brand:wikidata":"Q746263","brand:wikipedia":"ru:Казпочта",name:"Казпочта"},matchScore:2,suggestion:true},"amenity/post_office/Нова Пошта №1":{name:"Нова Пошта №1",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q12133863"},addTags:{amenity:"post_office",brand:"Нова Пошта №1","brand:wikidata":"Q12133863","brand:wikipedia":"uk:Нова пошта",name:"Нова Пошта №1"},removeTags:{amenity:"post_office",brand:"Нова Пошта №1","brand:wikidata":"Q12133863","brand:wikipedia":"uk:Нова пошта",name:"Нова Пошта №1"},matchScore:2,suggestion:true},"amenity/post_office/Почта России":{name:"Почта России",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1502763"},addTags:{amenity:"post_office",brand:"Почта России","brand:wikidata":"Q1502763","brand:wikipedia":"ru:Почта России",name:"Почта России"},removeTags:{amenity:"post_office",brand:"Почта России","brand:wikidata":"Q1502763","brand:wikipedia":"ru:Почта России",name:"Почта России"},matchScore:2,suggestion:true},"amenity/post_office/Укрпошта":{name:"Укрпошта",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q2470783"},addTags:{amenity:"post_office",brand:"Укрпошта","brand:wikidata":"Q2470783","brand:wikipedia":"en:Ukrposhta",name:"Укрпошта"},removeTags:{amenity:"post_office",brand:"Укрпошта","brand:wikidata":"Q2470783","brand:wikipedia":"en:Ukrposhta",name:"Укрпошта"},matchScore:2,suggestion:true},"amenity/post_office/中国邮政":{name:"中国邮政",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1066476"},addTags:{amenity:"post_office",brand:"中国邮政","brand:en":"China Post","brand:wikidata":"Q1066476","brand:wikipedia":"en:China Post",name:"中国邮政","name:en":"China Post"},removeTags:{amenity:"post_office",brand:"中国邮政","brand:en":"China Post","brand:wikidata":"Q1066476","brand:wikipedia":"en:China Post",name:"中国邮政","name:en":"China Post"},matchScore:2,suggestion:true},"amenity/public_bookcase/Little Free Library":{name:"Little Free Library",icon:"maki-library",geometry:["point","area"],tags:{amenity:"public_bookcase","brand:wikidata":"Q6650101"},addTags:{amenity:"public_bookcase",brand:"Little Free Library","brand:wikidata":"Q6650101","brand:wikipedia":"en:Little Free Library",name:"Little Free Library"},removeTags:{amenity:"public_bookcase",brand:"Little Free Library","brand:wikidata":"Q6650101","brand:wikipedia":"en:Little Free Library",name:"Little Free Library"},matchScore:2,suggestion:true},"amenity/restaurant/100 Montaditos":{name:"100 Montaditos",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q8355805"},addTags:{amenity:"restaurant",brand:"100 Montaditos","brand:wikidata":"Q8355805","brand:wikipedia":"en:Cervecería 100 Montaditos",name:"100 Montaditos"},removeTags:{amenity:"restaurant",brand:"100 Montaditos","brand:wikidata":"Q8355805","brand:wikipedia":"en:Cervecería 100 Montaditos",name:"100 Montaditos"},matchScore:2,suggestion:true},"amenity/restaurant/italian/ASK Italian":{name:"ASK Italian",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q4807056"},addTags:{amenity:"restaurant",brand:"ASK Italian","brand:wikipedia":"en:ASK Italian","brand:wikidata":"Q4807056",cuisine:"italian",name:"ASK Italian"},removeTags:{amenity:"restaurant",brand:"ASK Italian","brand:wikipedia":"en:ASK Italian","brand:wikidata":"Q4807056",cuisine:"italian",name:"ASK Italian"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/american/Applebee’s Neighborhood Grill & Bar":{name:"Applebee’s Neighborhood Grill & Bar",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q621532"},addTags:{amenity:"restaurant",brand:"Applebee’s Neighborhood Grill & Bar","brand:wikidata":"Q621532","brand:wikipedia":"en:Applebee's",cuisine:"american",name:"Applebee’s Neighborhood Grill & Bar"},removeTags:{amenity:"restaurant",brand:"Applebee’s Neighborhood Grill & Bar","brand:wikidata":"Q621532","brand:wikipedia":"en:Applebee's",cuisine:"american",name:"Applebee’s Neighborhood Grill & Bar"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Autogrill":{name:"Autogrill",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q786790"},addTags:{amenity:"restaurant",brand:"Autogrill","brand:wikidata":"Q786790","brand:wikipedia":"en:Autogrill",name:"Autogrill"},removeTags:{amenity:"restaurant",brand:"Autogrill","brand:wikidata":"Q786790","brand:wikipedia":"en:Autogrill",name:"Autogrill"},matchScore:2,suggestion:true},"amenity/restaurant/Bella Italia":{name:"Bella Italia",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4883362"},addTags:{amenity:"restaurant",brand:"Bella Italia","brand:wikidata":"Q4883362","brand:wikipedia":"en:Bella Italia",name:"Bella Italia"},removeTags:{amenity:"restaurant",brand:"Bella Italia","brand:wikidata":"Q4883362","brand:wikipedia":"en:Bella Italia",name:"Bella Italia"},matchScore:2,suggestion:true},"amenity/restaurant/Big Boy":{name:"Big Boy",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4386779"},addTags:{amenity:"restaurant",brand:"Big Boy","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",cuisine:"burger",name:"Big Boy"},removeTags:{amenity:"restaurant",brand:"Big Boy","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",cuisine:"burger",name:"Big Boy"},matchScore:2,suggestion:true},"amenity/restaurant/american/Black Bear Diner":{name:"Black Bear Diner",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q4920343"},addTags:{amenity:"restaurant",brand:"Black Bear Diner","brand:wikidata":"Q4920343","brand:wikipedia":"en:Black Bear Diner",cuisine:"american",name:"Black Bear Diner"},removeTags:{amenity:"restaurant",brand:"Black Bear Diner","brand:wikidata":"Q4920343","brand:wikipedia":"en:Black Bear Diner",cuisine:"american",name:"Black Bear Diner"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/american/Bob Evans":{name:"Bob Evans",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q4932386"},addTags:{amenity:"restaurant",brand:"Bob Evans","brand:wikidata":"Q4932386","brand:wikipedia":"en:Bob Evans Restaurants",cuisine:"american",name:"Bob Evans"},removeTags:{amenity:"restaurant",brand:"Bob Evans","brand:wikidata":"Q4932386","brand:wikipedia":"en:Bob Evans Restaurants",cuisine:"american",name:"Bob Evans"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/seafood/Bonefish Grill":{name:"Bonefish Grill",icon:"maki-restaurant-seafood",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"seafood","brand:wikidata":"Q4941599"},addTags:{amenity:"restaurant",brand:"Bonefish Grill","brand:wikidata":"Q4941599","brand:wikipedia":"en:Bonefish Grill",cuisine:"seafood",name:"Bonefish Grill"},removeTags:{amenity:"restaurant",brand:"Bonefish Grill","brand:wikidata":"Q4941599","brand:wikipedia":"en:Bonefish Grill",cuisine:"seafood",name:"Bonefish Grill"},reference:{key:"cuisine",value:"seafood"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Boston Pizza":{name:"Boston Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q894578"},addTags:{amenity:"restaurant",brand:"Boston Pizza","brand:wikidata":"Q894578","brand:wikipedia":"en:Boston Pizza",cuisine:"pizza",name:"Boston Pizza"},removeTags:{amenity:"restaurant",brand:"Boston Pizza","brand:wikidata":"Q894578","brand:wikipedia":"en:Boston Pizza",cuisine:"pizza",name:"Boston Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Grill":{name:"Buffalo Grill",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q944655"},addTags:{amenity:"restaurant",brand:"Buffalo Grill","brand:wikidata":"Q944655","brand:wikipedia":"en:Buffalo Grill",cuisine:"steak_house",name:"Buffalo Grill"},removeTags:{amenity:"restaurant",brand:"Buffalo Grill","brand:wikidata":"Q944655","brand:wikipedia":"en:Buffalo Grill",cuisine:"steak_house",name:"Buffalo Grill"},matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Wild Wings":{name:"Buffalo Wild Wings",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q509255"},addTags:{amenity:"restaurant",brand:"Buffalo Wild Wings","brand:wikidata":"Q509255","brand:wikipedia":"en:Buffalo Wild Wings",cuisine:"wings",name:"Buffalo Wild Wings"},removeTags:{amenity:"restaurant",brand:"Buffalo Wild Wings","brand:wikidata":"Q509255","brand:wikipedia":"en:Buffalo Wild Wings",cuisine:"wings",name:"Buffalo Wild Wings"},matchScore:2,suggestion:true},"amenity/restaurant/mexican/Cafe Rio":{name:"Cafe Rio",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"mexican","brand:wikidata":"Q5017108"},addTags:{amenity:"restaurant",brand:"Cafe Rio","brand:wikidata":"Q5017108","brand:wikipedia":"en:Cafe Rio",cuisine:"mexican",name:"Cafe Rio"},removeTags:{amenity:"restaurant",brand:"Cafe Rio","brand:wikidata":"Q5017108","brand:wikipedia":"en:Cafe Rio",cuisine:"mexican",name:"Cafe Rio"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/California Pizza Kitchen":{name:"California Pizza Kitchen",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q15109854"},addTags:{amenity:"restaurant",brand:"California Pizza Kitchen","brand:wikidata":"Q15109854","brand:wikipedia":"en:California Pizza Kitchen",cuisine:"pizza",name:"California Pizza Kitchen"},removeTags:{amenity:"restaurant",brand:"California Pizza Kitchen","brand:wikidata":"Q15109854","brand:wikipedia":"en:California Pizza Kitchen",cuisine:"pizza",name:"California Pizza Kitchen"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Carluccio's":{name:"Carluccio's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q25111797"},addTags:{amenity:"restaurant",brand:"Carluccio's","brand:wikidata":"Q25111797","brand:wikipedia":"en:Carluccio's Ltd",cuisine:"italian",name:"Carluccio's"},removeTags:{amenity:"restaurant",brand:"Carluccio's","brand:wikidata":"Q25111797","brand:wikipedia":"en:Carluccio's Ltd",cuisine:"italian",name:"Carluccio's"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Carrabba's Italian Grill":{name:"Carrabba's Italian Grill",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q5045999"},addTags:{amenity:"restaurant",brand:"Carrabba's Italian Grill","brand:wikidata":"Q5045999","brand:wikipedia":"en:Carrabba's Italian Grill",cuisine:"italian",name:"Carrabba's Italian Grill"},removeTags:{amenity:"restaurant",brand:"Carrabba's Italian Grill","brand:wikidata":"Q5045999","brand:wikipedia":"en:Carrabba's Italian Grill",cuisine:"italian",name:"Carrabba's Italian Grill"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/american/Cheesecake Factory":{name:"Cheesecake Factory",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q1045842"},addTags:{amenity:"restaurant",brand:"Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",cuisine:"american",name:"Cheesecake Factory"},removeTags:{amenity:"restaurant",brand:"Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",cuisine:"american",name:"Cheesecake Factory"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Chili's":{name:"Chili's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1072948"},addTags:{amenity:"restaurant",brand:"Chili's","brand:wikidata":"Q1072948","brand:wikipedia":"en:Chili's",cuisine:"tex-mex",name:"Chili's"},removeTags:{amenity:"restaurant",brand:"Chili's","brand:wikidata":"Q1072948","brand:wikipedia":"en:Chili's",cuisine:"tex-mex",name:"Chili's"},matchScore:2,suggestion:true},"amenity/restaurant/Chiquito":{name:"Chiquito",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5101775"},addTags:{amenity:"restaurant",brand:"Chiquito","brand:wikidata":"Q5101775","brand:wikipedia":"en:Chiquito (restaurant)",cuisine:"tex-mex",name:"Chiquito"},removeTags:{amenity:"restaurant",brand:"Chiquito","brand:wikidata":"Q5101775","brand:wikipedia":"en:Chiquito (restaurant)",cuisine:"tex-mex",name:"Chiquito"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Chuck E. Cheese's":{name:"Chuck E. Cheese's",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q2438391"},addTags:{amenity:"restaurant",brand:"Chuck E. Cheese's","brand:wikidata":"Q2438391","brand:wikipedia":"en:Chuck E. Cheese's",cuisine:"pizza",name:"Chuck E. Cheese's"},removeTags:{amenity:"restaurant",brand:"Chuck E. Cheese's","brand:wikidata":"Q2438391","brand:wikipedia":"en:Chuck E. Cheese's",cuisine:"pizza",name:"Chuck E. Cheese's"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Cici's Pizza":{name:"Cici's Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q2972189"},addTags:{amenity:"restaurant",brand:"Cici's Pizza","brand:wikidata":"Q2972189","brand:wikipedia":"en:Cicis",cuisine:"pizza",name:"Cici's Pizza"},removeTags:{amenity:"restaurant",brand:"Cici's Pizza","brand:wikidata":"Q2972189","brand:wikipedia":"en:Cicis",cuisine:"pizza",name:"Cici's Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/french/Courtepaille":{name:"Courtepaille",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"french","brand:wikidata":"Q3116688"},addTags:{amenity:"restaurant",brand:"Courtepaille","brand:wikidata":"Q3116688","brand:wikipedia":"fr:Grill Courtepaille",cuisine:"french",name:"Courtepaille"},removeTags:{amenity:"restaurant",brand:"Courtepaille","brand:wikidata":"Q3116688","brand:wikipedia":"fr:Grill Courtepaille",cuisine:"french",name:"Courtepaille"},reference:{key:"cuisine",value:"french"},matchScore:2,suggestion:true},"amenity/restaurant/american/Cracker Barrel":{name:"Cracker Barrel",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q4492609"},addTags:{amenity:"restaurant",brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",cuisine:"american",name:"Cracker Barrel"},removeTags:{amenity:"restaurant",brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",cuisine:"american",name:"Cracker Barrel"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/american/Denny's":{name:"Denny's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q1189695"},addTags:{amenity:"restaurant",brand:"Denny's","brand:wikidata":"Q1189695","brand:wikipedia":"en:Denny's",cuisine:"american",name:"Denny's"},removeTags:{amenity:"restaurant",brand:"Denny's","brand:wikidata":"Q1189695","brand:wikipedia":"en:Denny's",cuisine:"american",name:"Denny's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Dickey's Barbecue Pit":{name:"Dickey's Barbecue Pit",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q19880747"},addTags:{amenity:"restaurant",brand:"Dickey's Barbecue Pit","brand:wikidata":"Q19880747","brand:wikipedia":"en:Dickey's Barbecue Pit",cuisine:"barbecue",name:"Dickey's Barbecue Pit"},removeTags:{amenity:"restaurant",brand:"Dickey's Barbecue Pit","brand:wikidata":"Q19880747","brand:wikipedia":"en:Dickey's Barbecue Pit",cuisine:"barbecue",name:"Dickey's Barbecue Pit"},matchScore:2,suggestion:true},"amenity/restaurant/italian/East Side Mario's":{name:"East Side Mario's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q5329375"},addTags:{amenity:"restaurant",brand:"East Side Mario's","brand:wikidata":"Q5329375","brand:wikipedia":"en:East Side Mario's",cuisine:"italian",name:"East Side Mario's"},removeTags:{amenity:"restaurant",brand:"East Side Mario's","brand:wikidata":"Q5329375","brand:wikipedia":"en:East Side Mario's",cuisine:"italian",name:"East Side Mario's"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/Famous Dave's":{name:"Famous Dave's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5433448"},addTags:{amenity:"restaurant",brand:"Famous Dave's","brand:wikidata":"Q5433448","brand:wikipedia":"en:Famous Dave's",cuisine:"barbecue",name:"Famous Dave's"},removeTags:{amenity:"restaurant",brand:"Famous Dave's","brand:wikidata":"Q5433448","brand:wikipedia":"en:Famous Dave's",cuisine:"barbecue",name:"Famous Dave's"},matchScore:2,suggestion:true},"amenity/restaurant/french/Flunch":{name:"Flunch",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"french","brand:wikidata":"Q629326"},addTags:{amenity:"restaurant",brand:"Flunch","brand:wikidata":"Q629326","brand:wikipedia":"en:Flunch",cuisine:"french",name:"Flunch"},removeTags:{amenity:"restaurant",brand:"Flunch","brand:wikidata":"Q629326","brand:wikipedia":"en:Flunch",cuisine:"french",name:"Flunch"},reference:{key:"cuisine",value:"french"},matchScore:2,suggestion:true},"amenity/restaurant/american/Foster's Hollywood":{name:"Foster's Hollywood",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q5864366"},addTags:{amenity:"restaurant",brand:"Foster's Hollywood","brand:wikidata":"Q5864366","brand:wikipedia":"en:Foster's Hollywood",cuisine:"american",name:"Foster's Hollywood"},removeTags:{amenity:"restaurant",brand:"Foster's Hollywood","brand:wikidata":"Q5864366","brand:wikipedia":"en:Foster's Hollywood",cuisine:"american",name:"Foster's Hollywood"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Frankie & Benny's":{name:"Frankie & Benny's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q5490892"},addTags:{amenity:"restaurant",brand:"Frankie & Benny's","brand:wikidata":"Q5490892","brand:wikipedia":"en:Frankie & Benny's",cuisine:"italian",name:"Frankie & Benny's"},removeTags:{amenity:"restaurant",brand:"Frankie & Benny's","brand:wikidata":"Q5490892","brand:wikipedia":"en:Frankie & Benny's",cuisine:"italian",name:"Frankie & Benny's"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/Freshii":{name:"Freshii",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5503051"},addTags:{amenity:"restaurant",brand:"Freshii","brand:wikidata":"Q5503051","brand:wikipedia":"en:Freshii",cuisine:"salad",name:"Freshii"},removeTags:{amenity:"restaurant",brand:"Freshii","brand:wikidata":"Q5503051","brand:wikipedia":"en:Freshii",cuisine:"salad",name:"Freshii"},matchScore:2,suggestion:true},"amenity/restaurant/american/Friendly's":{name:"Friendly's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q1464513"},addTags:{amenity:"restaurant",brand:"Friendly's","brand:wikidata":"Q1464513","brand:wikipedia":"en:Friendly's",cuisine:"american",name:"Friendly's"},removeTags:{amenity:"restaurant",brand:"Friendly's","brand:wikidata":"Q1464513","brand:wikipedia":"en:Friendly's",cuisine:"american",name:"Friendly's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Fuddruckers":{name:"Fuddruckers",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5507056"},addTags:{amenity:"restaurant",brand:"Fuddruckers","brand:wikidata":"Q5507056","brand:wikipedia":"en:Fuddruckers",cuisine:"burger",name:"Fuddruckers"},removeTags:{amenity:"restaurant",brand:"Fuddruckers","brand:wikidata":"Q5507056","brand:wikipedia":"en:Fuddruckers",cuisine:"burger",name:"Fuddruckers"},matchScore:2,suggestion:true},"amenity/restaurant/american/Golden Corral":{name:"Golden Corral",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q4039560"},addTags:{amenity:"restaurant",brand:"Golden Corral","brand:wikidata":"Q4039560","brand:wikipedia":"en:Golden Corral",cuisine:"american",name:"Golden Corral"},removeTags:{amenity:"restaurant",brand:"Golden Corral","brand:wikidata":"Q4039560","brand:wikipedia":"en:Golden Corral",cuisine:"american",name:"Golden Corral"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Gourmet Burger Kitchen":{name:"Gourmet Burger Kitchen",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5588445"},addTags:{amenity:"restaurant",brand:"Gourmet Burger Kitchen","brand:wikidata":"Q5588445","brand:wikipedia":"en:Gourmet Burger Kitchen",cuisine:"burger",name:"Gourmet Burger Kitchen"},removeTags:{amenity:"restaurant",brand:"Gourmet Burger Kitchen","brand:wikidata":"Q5588445","brand:wikipedia":"en:Gourmet Burger Kitchen",cuisine:"burger",name:"Gourmet Burger Kitchen"},matchScore:2,suggestion:true},"amenity/restaurant/american/Hard Rock Cafe":{name:"Hard Rock Cafe",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q918151"},addTags:{amenity:"restaurant",brand:"Hard Rock Cafe","brand:wikidata":"Q918151","brand:wikipedia":"en:Hard Rock Cafe",cuisine:"american",name:"Hard Rock Cafe"},removeTags:{amenity:"restaurant",brand:"Hard Rock Cafe","brand:wikidata":"Q918151","brand:wikipedia":"en:Hard Rock Cafe",cuisine:"american",name:"Hard Rock Cafe"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/american/Harvester":{name:"Harvester",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q5676915"},addTags:{amenity:"restaurant",brand:"Harvester","brand:wikidata":"Q5676915","brand:wikipedia":"en:Harvester (restaurant)",cuisine:"american",name:"Harvester"},removeTags:{amenity:"restaurant",brand:"Harvester","brand:wikidata":"Q5676915","brand:wikipedia":"en:Harvester (restaurant)",cuisine:"american",name:"Harvester"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Hippopotamus":{name:"Hippopotamus",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3136174"},addTags:{amenity:"restaurant",brand:"Hippopotamus","brand:wikidata":"Q3136174","brand:wikipedia":"fr:Hippopotamus (restaurant)",cuisine:"steak_house",name:"Hippopotamus"},removeTags:{amenity:"restaurant",brand:"Hippopotamus","brand:wikidata":"Q3136174","brand:wikipedia":"fr:Hippopotamus (restaurant)",cuisine:"steak_house",name:"Hippopotamus"},matchScore:2,suggestion:true},"amenity/restaurant/Hooters":{name:"Hooters",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1025921"},addTags:{amenity:"restaurant",brand:"Hooters","brand:wikidata":"Q1025921","brand:wikipedia":"en:Hooters",cuisine:"burger",name:"Hooters"},removeTags:{amenity:"restaurant",brand:"Hooters","brand:wikidata":"Q1025921","brand:wikipedia":"en:Hooters",cuisine:"burger",name:"Hooters"},matchScore:2,suggestion:true},"amenity/restaurant/american/Huddle House":{name:"Huddle House",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q5928324"},addTags:{amenity:"restaurant",brand:"Huddle House","brand:wikidata":"Q5928324","brand:wikipedia":"en:Huddle House",cuisine:"american",name:"Huddle House"},removeTags:{amenity:"restaurant",brand:"Huddle House","brand:wikidata":"Q5928324","brand:wikipedia":"en:Huddle House",cuisine:"american",name:"Huddle House"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/IHOP":{name:"IHOP",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1185675"},addTags:{amenity:"restaurant",brand:"IHOP","brand:wikidata":"Q1185675","brand:wikipedia":"en:IHOP",cuisine:"pancake",name:"IHOP"},removeTags:{amenity:"restaurant",brand:"IHOP","brand:wikidata":"Q1185675","brand:wikipedia":"en:IHOP",cuisine:"pancake",name:"IHOP"},matchScore:2,suggestion:true},"amenity/restaurant/american/IL Патио":{name:"IL Патио",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q4397763"},addTags:{amenity:"restaurant",brand:"IL Патио","brand:wikidata":"Q4397763","brand:wikipedia":"en:Росинтер",cuisine:"american",name:"IL Патио"},removeTags:{amenity:"restaurant",brand:"IL Патио","brand:wikidata":"Q4397763","brand:wikipedia":"en:Росинтер",cuisine:"american",name:"IL Патио"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Jason's Deli":{name:"Jason's Deli",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q16997641"},addTags:{amenity:"restaurant",brand:"Jason's Deli","brand:wikidata":"Q16997641","brand:wikipedia":"en:Jason's Deli",cuisine:"sandwich",name:"Jason's Deli"},removeTags:{amenity:"restaurant",brand:"Jason's Deli","brand:wikidata":"Q16997641","brand:wikipedia":"en:Jason's Deli",cuisine:"sandwich",name:"Jason's Deli"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Jet's Pizza":{name:"Jet's Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q16997713"},addTags:{amenity:"restaurant",brand:"Jet's Pizza","brand:wikidata":"Q16997713","brand:wikipedia":"en:Jet's Pizza",cuisine:"pizza",name:"Jet's Pizza"},removeTags:{amenity:"restaurant",brand:"Jet's Pizza","brand:wikidata":"Q16997713","brand:wikipedia":"en:Jet's Pizza",cuisine:"pizza",name:"Jet's Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/seafood/Joe's Crab Shack":{name:"Joe's Crab Shack",icon:"maki-restaurant-seafood",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"seafood","brand:wikidata":"Q6208210"},addTags:{amenity:"restaurant",brand:"Joe's Crab Shack","brand:wikidata":"Q6208210","brand:wikipedia":"en:Joe's Crab Shack",cuisine:"seafood",name:"Joe's Crab Shack"},removeTags:{amenity:"restaurant",brand:"Joe's Crab Shack","brand:wikidata":"Q6208210","brand:wikipedia":"en:Joe's Crab Shack",cuisine:"seafood",name:"Joe's Crab Shack"},reference:{key:"cuisine",value:"seafood"},matchScore:2,suggestion:true},"amenity/restaurant/american/Kelsey's":{name:"Kelsey's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q6386459"},addTags:{amenity:"restaurant",brand:"Kelsey's","brand:wikidata":"Q6386459","brand:wikipedia":"en:Kelseys Original Roadhouse",cuisine:"american",name:"Kelsey's"},removeTags:{amenity:"restaurant",brand:"Kelsey's","brand:wikidata":"Q6386459","brand:wikipedia":"en:Kelseys Original Roadhouse",cuisine:"american",name:"Kelsey's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Kudu":{name:"Kudu",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q6441777"},addTags:{amenity:"restaurant",brand:"Kudu","brand:wikidata":"Q6441777","brand:wikipedia":"en:Kudu (restaurant)",cuisine:"sandwich",name:"Kudu"},removeTags:{amenity:"restaurant",brand:"Kudu","brand:wikidata":"Q6441777","brand:wikipedia":"en:Kudu (restaurant)",cuisine:"sandwich",name:"Kudu"},matchScore:2,suggestion:true},"amenity/restaurant/Logan's Roadhouse":{name:"Logan's Roadhouse",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q6666872"},addTags:{amenity:"restaurant",brand:"Logan's Roadhouse","brand:wikidata":"Q6666872","brand:wikipedia":"en:Logan's Roadhouse",cuisine:"america",name:"Logan's Roadhouse"},removeTags:{amenity:"restaurant",brand:"Logan's Roadhouse","brand:wikidata":"Q6666872","brand:wikipedia":"en:Logan's Roadhouse",cuisine:"america",name:"Logan's Roadhouse"},matchScore:2,suggestion:true},"amenity/restaurant/LongHorn Steakhouse":{name:"LongHorn Steakhouse",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3259007"},addTags:{amenity:"restaurant",brand:"LongHorn Steakhouse","brand:wikidata":"Q3259007","brand:wikipedia":"en:LongHorn Steakhouse",cuisine:"steak_house",name:"LongHorn Steakhouse"},removeTags:{amenity:"restaurant",brand:"LongHorn Steakhouse","brand:wikidata":"Q3259007","brand:wikipedia":"en:LongHorn Steakhouse",cuisine:"steak_house",name:"LongHorn Steakhouse"},matchScore:2,suggestion:true},"amenity/restaurant/Loving Hut":{name:"Loving Hut",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3491655"},addTags:{amenity:"restaurant",brand:"Loving Hut","brand:wikidata":"Q3491655","brand:wikipedia":"en:Loving Hut",name:"Loving Hut"},removeTags:{amenity:"restaurant",brand:"Loving Hut","brand:wikidata":"Q3491655","brand:wikipedia":"en:Loving Hut",name:"Loving Hut"},matchScore:2,suggestion:true},"amenity/restaurant/Léon de Bruxelles":{name:"Léon de Bruxelles",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q21041507"},addTags:{amenity:"restaurant",brand:"Léon de Bruxelles","brand:wikidata":"Q21041507","brand:wikipedia":"en:Léon de Bruxelles",cuisine:"friture",name:"Léon de Bruxelles"},removeTags:{amenity:"restaurant",brand:"Léon de Bruxelles","brand:wikidata":"Q21041507","brand:wikipedia":"en:Léon de Bruxelles",cuisine:"friture",name:"Léon de Bruxelles"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/MOD Pizza":{name:"MOD Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q19903469"},addTags:{amenity:"restaurant",brand:"MOD Pizza","brand:wikidata":"Q19903469","brand:wikipedia":"en:MOD Pizza",cuisine:"pizza",name:"MOD Pizza"},removeTags:{amenity:"restaurant",brand:"MOD Pizza","brand:wikidata":"Q19903469","brand:wikipedia":"en:MOD Pizza",cuisine:"pizza",name:"MOD Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Marco's Pizza":{name:"Marco's Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q6757382"},addTags:{amenity:"restaurant",brand:"Marco's Pizza","brand:wikidata":"Q6757382","brand:wikipedia":"en:Marco's Pizza",cuisine:"pizza",name:"Marco's Pizza"},removeTags:{amenity:"restaurant",brand:"Marco's Pizza","brand:wikidata":"Q6757382","brand:wikipedia":"en:Marco's Pizza",cuisine:"pizza",name:"Marco's Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/asian/Max's Restaurant":{name:"Max's Restaurant",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"asian","brand:wikidata":"Q6794477"},addTags:{amenity:"restaurant",brand:"Max's Restaurant","brand:wikidata":"Q6794477","brand:wikipedia":"en:Max's of Manila",cuisine:"asian",name:"Max's Restaurant"},removeTags:{amenity:"restaurant",brand:"Max's Restaurant","brand:wikidata":"Q6794477","brand:wikipedia":"en:Max's of Manila",cuisine:"asian",name:"Max's Restaurant"},reference:{key:"cuisine",value:"asian"},matchScore:2,suggestion:true},"amenity/restaurant/McAlister's Deli":{name:"McAlister's Deli",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q17020829"},addTags:{amenity:"restaurant",brand:"McAlister's Deli","brand:wikidata":"Q17020829","brand:wikipedia":"en:McAlister's Deli",cuisine:"sandwich",name:"McAlister's Deli"},removeTags:{amenity:"restaurant",brand:"McAlister's Deli","brand:wikidata":"Q17020829","brand:wikipedia":"en:McAlister's Deli",cuisine:"sandwich",name:"McAlister's Deli"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Mellow Mushroom":{name:"Mellow Mushroom",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q17021360"},addTags:{amenity:"restaurant",brand:"Mellow Mushroom","brand:wikidata":"Q17021360","brand:wikipedia":"en:Mellow Mushroom",cuisine:"pizza",name:"Mellow Mushroom"},removeTags:{amenity:"restaurant",brand:"Mellow Mushroom","brand:wikidata":"Q17021360","brand:wikipedia":"en:Mellow Mushroom",cuisine:"pizza",name:"Mellow Mushroom"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/french/Mimi's Cafe":{name:"Mimi's Cafe",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"french","brand:wikidata":"Q17022081"},addTags:{amenity:"restaurant",brand:"Mimi's Cafe",cuisine:"french","brand:wikidata":"Q17022081","brand:wikipedia":"en:Mimi's Cafe",name:"Mimi's Cafe"},removeTags:{amenity:"restaurant",brand:"Mimi's Cafe",cuisine:"french","brand:wikidata":"Q17022081","brand:wikipedia":"en:Mimi's Cafe",name:"Mimi's Cafe"},reference:{key:"cuisine",value:"french"},matchScore:2,suggestion:true},"amenity/restaurant/Nando's":{name:"Nando's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3472954"},addTags:{amenity:"restaurant",brand:"Nando's","brand:wikidata":"Q3472954","brand:wikipedia":"en:Nando's",cuisine:"chicken;portuguese",name:"Nando's"},removeTags:{amenity:"restaurant",brand:"Nando's","brand:wikidata":"Q3472954","brand:wikipedia":"en:Nando's",cuisine:"chicken;portuguese",name:"Nando's"},matchScore:2,suggestion:true},"amenity/restaurant/Noodles & Company":{name:"Noodles & Company",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7049673"},addTags:{amenity:"restaurant",brand:"Noodles & Company","brand:wikidata":"Q7049673","brand:wikipedia":"en:Noodles & Company",cuisine:"pasta",name:"Noodles & Company"},removeTags:{amenity:"restaurant",brand:"Noodles & Company","brand:wikidata":"Q7049673","brand:wikipedia":"en:Noodles & Company",cuisine:"pasta",name:"Noodles & Company"},matchScore:2,suggestion:true},"amenity/restaurant/american/O'Charley's":{name:"O'Charley's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q7071703"},addTags:{amenity:"restaurant",brand:"O'Charley's","brand:wikidata":"Q7071703","brand:wikipedia":"en:O'Charley's",cuisine:"american",name:"O'Charley's"},removeTags:{amenity:"restaurant",brand:"O'Charley's","brand:wikidata":"Q7071703","brand:wikipedia":"en:O'Charley's",cuisine:"american",name:"O'Charley's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Old Chicago":{name:"Old Chicago",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q5180522"},addTags:{amenity:"restaurant",brand:"Old Chicago","brand:wikidata":"Q5180522","brand:wikipedia":"en:CraftWorks Restaurants & Breweries",cuisine:"pizza",name:"Old Chicago"},removeTags:{amenity:"restaurant",brand:"Old Chicago","brand:wikidata":"Q5180522","brand:wikipedia":"en:CraftWorks Restaurants & Breweries",cuisine:"pizza",name:"Old Chicago"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/american/Old Wild West":{name:"Old Wild West",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q25402475"},addTags:{amenity:"restaurant",brand:"Old Wild West","brand:wikidata":"Q25402475","brand:wikipedia":"it:Old Wild West",cuisine:"american",name:"Old Wild West"},removeTags:{amenity:"restaurant",brand:"Old Wild West","brand:wikidata":"Q25402475","brand:wikipedia":"it:Old Wild West",cuisine:"american",name:"Old Wild West"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Olive Garden":{name:"Olive Garden",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q3045312"},addTags:{amenity:"restaurant",brand:"Olive Garden","brand:wikidata":"Q3045312","brand:wikipedia":"en:Olive Garden",cuisine:"italian",name:"Olive Garden"},removeTags:{amenity:"restaurant",brand:"Olive Garden","brand:wikidata":"Q3045312","brand:wikipedia":"en:Olive Garden",cuisine:"italian",name:"Olive Garden"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/american/Outback Steakhouse":{name:"Outback Steakhouse",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q1064893"},addTags:{amenity:"restaurant",brand:"Outback Steakhouse","brand:wikidata":"Q1064893","brand:wikipedia":"en:Outback Steakhouse",cuisine:"american",name:"Outback Steakhouse"},removeTags:{amenity:"restaurant",brand:"Outback Steakhouse","brand:wikidata":"Q1064893","brand:wikipedia":"en:Outback Steakhouse",cuisine:"american",name:"Outback Steakhouse"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/asian/P.F. Chang's":{name:"P.F. Chang's",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"asian","brand:wikidata":"Q5360181"},addTags:{amenity:"restaurant",brand:"P.F. Chang's","brand:wikidata":"Q5360181","brand:wikipedia":"en:P. F. Chang's China Bistro",cuisine:"asian",name:"P.F. Chang's"},removeTags:{amenity:"restaurant",brand:"P.F. Chang's","brand:wikidata":"Q5360181","brand:wikipedia":"en:P. F. Chang's China Bistro",cuisine:"asian",name:"P.F. Chang's"},reference:{key:"cuisine",value:"asian"},matchScore:2,suggestion:true},"amenity/restaurant/asian/Pei Wei":{name:"Pei Wei",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"asian","brand:wikidata":"Q7160898"},addTags:{amenity:"restaurant",brand:"Pei Wei","brand:wikidata":"Q7160898","brand:wikipedia":"en:Pei Wei Asian Diner",cuisine:"asian",name:"Pei Wei"},removeTags:{amenity:"restaurant",brand:"Pei Wei","brand:wikidata":"Q7160898","brand:wikipedia":"en:Pei Wei Asian Diner",cuisine:"asian",name:"Pei Wei"},reference:{key:"cuisine",value:"asian"},matchScore:2,suggestion:true},"amenity/restaurant/american/Perkins":{name:"Perkins",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q7169056"},addTags:{amenity:"restaurant",brand:"Perkins","brand:wikidata":"Q7169056","brand:wikipedia":"en:Perkins Restaurant and Bakery",cuisine:"american",name:"Perkins"},removeTags:{amenity:"restaurant",brand:"Perkins","brand:wikidata":"Q7169056","brand:wikipedia":"en:Perkins Restaurant and Bakery",cuisine:"american",name:"Perkins"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pizza Factory":{name:"Pizza Factory",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q39054369"},addTags:{amenity:"restaurant",brand:"Pizza Factory","brand:wikidata":"Q39054369","brand:wikipedia":"en:Pizza Factory",cuisine:"pizza",name:"Pizza Factory"},removeTags:{amenity:"restaurant",brand:"Pizza Factory","brand:wikidata":"Q39054369","brand:wikipedia":"en:Pizza Factory",cuisine:"pizza",name:"Pizza Factory"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pizza Hut":{name:"Pizza Hut",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q191615"},addTags:{amenity:"restaurant",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut"},removeTags:{amenity:"restaurant",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pizza Ranch":{name:"Pizza Ranch",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q7199978"},addTags:{amenity:"restaurant",brand:"Pizza Ranch","brand:wikidata":"Q7199978","brand:wikipedia":"en:Pizza Ranch",cuisine:"pizza",name:"Pizza Ranch"},removeTags:{amenity:"restaurant",brand:"Pizza Ranch","brand:wikidata":"Q7199978","brand:wikipedia":"en:Pizza Ranch",cuisine:"pizza",name:"Pizza Ranch"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/PizzaExpress":{name:"PizzaExpress",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q662845"},addTags:{amenity:"restaurant",brand:"PizzaExpress","brand:wikipedia":"en:PizzaExpress","brand:wikidata":"Q662845",cuisine:"pizza",name:"PizzaExpress"},removeTags:{amenity:"restaurant",brand:"PizzaExpress","brand:wikipedia":"en:PizzaExpress","brand:wikidata":"Q662845",cuisine:"pizza",name:"PizzaExpress"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/french/Poivre Rouge":{name:"Poivre Rouge",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"french","brand:wikidata":"Q7316076"},addTags:{amenity:"restaurant",brand:"Poivre Rouge","brand:wikidata":"Q7316076","brand:wikipedia":"fr:Poivre Rouge (restauration)",cuisine:"french",name:"Poivre Rouge"},removeTags:{amenity:"restaurant",brand:"Poivre Rouge","brand:wikidata":"Q7316076","brand:wikipedia":"fr:Poivre Rouge (restauration)",cuisine:"french",name:"Poivre Rouge"},reference:{key:"cuisine",value:"french"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Prezzo":{name:"Prezzo",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q7242489"},addTags:{amenity:"restaurant",brand:"Prezzo","brand:wikidata":"Q7242489","brand:wikipedia":"en:Prezzo (restaurant)",cuisine:"italian",name:"Prezzo"},removeTags:{amenity:"restaurant",brand:"Prezzo","brand:wikidata":"Q7242489","brand:wikipedia":"en:Prezzo (restaurant)",cuisine:"italian",name:"Prezzo"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/seafood/Red Lobster":{name:"Red Lobster",icon:"maki-restaurant-seafood",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"seafood","brand:wikidata":"Q846301"},addTags:{amenity:"restaurant",brand:"Red Lobster","brand:wikidata":"Q846301","brand:wikipedia":"en:Red Lobster",cuisine:"seafood",name:"Red Lobster"},removeTags:{amenity:"restaurant",brand:"Red Lobster","brand:wikidata":"Q846301","brand:wikipedia":"en:Red Lobster",cuisine:"seafood",name:"Red Lobster"},reference:{key:"cuisine",value:"seafood"},matchScore:2,suggestion:true},"amenity/restaurant/Red Robin":{name:"Red Robin",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7304886"},addTags:{amenity:"restaurant",brand:"Red Robin","brand:wikidata":"Q7304886","brand:wikipedia":"en:Red Robin",cuisine:"burger",name:"Red Robin"},removeTags:{amenity:"restaurant",brand:"Red Robin","brand:wikidata":"Q7304886","brand:wikipedia":"en:Red Robin",cuisine:"burger",name:"Red Robin"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Round Table Pizza":{name:"Round Table Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q7371139"},addTags:{amenity:"restaurant",brand:"Round Table Pizza","brand:wikidata":"Q7371139","brand:wikipedia":"en:Round Table Pizza",cuisine:"pizza",name:"Round Table Pizza"},removeTags:{amenity:"restaurant",brand:"Round Table Pizza","brand:wikidata":"Q7371139","brand:wikipedia":"en:Round Table Pizza",cuisine:"pizza",name:"Round Table Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/Ruby Tuesday":{name:"Ruby Tuesday",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7376400"},addTags:{amenity:"restaurant",brand:"Ruby Tuesday","brand:wikidata":"Q7376400","brand:wikipedia":"en:Ruby Tuesday (restaurant)",cuisine:"america",name:"Ruby Tuesday"},removeTags:{amenity:"restaurant",brand:"Ruby Tuesday","brand:wikidata":"Q7376400","brand:wikipedia":"en:Ruby Tuesday (restaurant)",cuisine:"america",name:"Ruby Tuesday"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Shakey's":{name:"Shakey's",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q6134929"},addTags:{amenity:"restaurant",brand:"Shakey's","brand:wikidata":"Q6134929","brand:wikipedia":"en:Shakey's Pizza",cuisine:"pizza",name:"Shakey's"},removeTags:{amenity:"restaurant",brand:"Shakey's","brand:wikidata":"Q6134929","brand:wikipedia":"en:Shakey's Pizza",cuisine:"pizza",name:"Shakey's"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/american/Shari's":{name:"Shari's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q7489612"},addTags:{amenity:"restaurant",brand:"Shari's","brand:wikidata":"Q7489612","brand:wikipedia":"en:Shari's Cafe & Pies",cuisine:"american",name:"Shari's"},removeTags:{amenity:"restaurant",brand:"Shari's","brand:wikidata":"Q7489612","brand:wikipedia":"en:Shari's Cafe & Pies",cuisine:"american",name:"Shari's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/american/Shoney's":{name:"Shoney's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q7500392"},addTags:{amenity:"restaurant",brand:"Shoney's","brand:wikidata":"Q7500392","brand:wikipedia":"en:Shoney's",cuisine:"american",name:"Shoney's"},removeTags:{amenity:"restaurant",brand:"Shoney's","brand:wikidata":"Q7500392","brand:wikipedia":"en:Shoney's",cuisine:"american",name:"Shoney's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Sizzler":{name:"Sizzler",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1848822"},addTags:{amenity:"restaurant",brand:"Sizzler","brand:wikidata":"Q1848822","brand:wikipedia":"en:Sizzler",name:"Sizzler"},removeTags:{amenity:"restaurant",brand:"Sizzler","brand:wikidata":"Q1848822","brand:wikipedia":"en:Sizzler",name:"Sizzler"},matchScore:2,suggestion:true},"amenity/restaurant/american/Skyline Chili":{name:"Skyline Chili",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q151224"},addTags:{amenity:"restaurant",brand:"Skyline Chili","brand:wikidata":"Q151224","brand:wikipedia":"en:Skyline Chili",cuisine:"american",name:"Skyline Chili"},removeTags:{amenity:"restaurant",brand:"Skyline Chili","brand:wikidata":"Q151224","brand:wikipedia":"en:Skyline Chili",cuisine:"american",name:"Skyline Chili"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Smitty's":{name:"Smitty's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7545728"},addTags:{amenity:"restaurant",brand:"Smitty's","brand:wikidata":"Q7545728","brand:wikipedia":"en:Smitty's",cuisine:"pancake",name:"Smitty's"},removeTags:{amenity:"restaurant",brand:"Smitty's","brand:wikidata":"Q7545728","brand:wikipedia":"en:Smitty's",cuisine:"pancake",name:"Smitty's"},matchScore:2,suggestion:true},"amenity/restaurant/Spur":{name:"Spur",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7581546"},addTags:{amenity:"restaurant",brand:"Spur","brand:wikidata":"Q7581546","brand:wikipedia":"en:Spur Steak Ranches",cuisine:"steak_house",name:"Spur"},removeTags:{amenity:"restaurant",brand:"Spur","brand:wikidata":"Q7581546","brand:wikipedia":"en:Spur Steak Ranches",cuisine:"steak_house",name:"Spur"},matchScore:2,suggestion:true},"amenity/restaurant/Steak 'n Shake":{name:"Steak 'n Shake",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7605233"},addTags:{amenity:"restaurant",brand:"Steak 'n Shake","brand:wikidata":"Q7605233","brand:wikipedia":"en:Steak 'n Shake",cuisine:"burger",name:"Steak 'n Shake"},removeTags:{amenity:"restaurant",brand:"Steak 'n Shake","brand:wikidata":"Q7605233","brand:wikipedia":"en:Steak 'n Shake",cuisine:"burger",name:"Steak 'n Shake"},matchScore:2,suggestion:true},"amenity/restaurant/Sunset Grill":{name:"Sunset Grill",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7641264"},addTags:{amenity:"restaurant",brand:"Sunset Grill","brand:wikidata":"Q7641264","brand:wikipedia":"en:Sunset Grill (restaurant)",name:"Sunset Grill"},removeTags:{amenity:"restaurant",brand:"Sunset Grill","brand:wikidata":"Q7641264","brand:wikipedia":"en:Sunset Grill (restaurant)",name:"Sunset Grill"},matchScore:2,suggestion:true},"amenity/restaurant/Swiss Chalet":{name:"Swiss Chalet",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q2372909"},addTags:{amenity:"restaurant",brand:"Swiss Chalet","brand:wikidata":"Q2372909","brand:wikipedia":"en:Swiss Chalet",cuisine:"chicken",name:"Swiss Chalet"},removeTags:{amenity:"restaurant",brand:"Swiss Chalet","brand:wikidata":"Q2372909","brand:wikipedia":"en:Swiss Chalet",cuisine:"chicken",name:"Swiss Chalet"},matchScore:2,suggestion:true},"amenity/restaurant/american/TGI Friday's":{name:"TGI Friday's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q1524184"},addTags:{amenity:"restaurant",brand:"TGI Friday's","brand:wikidata":"Q1524184","brand:wikipedia":"en:TGI Fridays",cuisine:"american",name:"TGI Friday's"},removeTags:{amenity:"restaurant",brand:"TGI Friday's","brand:wikidata":"Q1524184","brand:wikipedia":"en:TGI Fridays",cuisine:"american",name:"TGI Friday's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Texas Roadhouse":{name:"Texas Roadhouse",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7707945"},addTags:{amenity:"restaurant",brand:"Texas Roadhouse","brand:wikidata":"Q7707945","brand:wikipedia":"en:Texas Roadhouse",cuisine:"steak_house",name:"Texas Roadhouse"},removeTags:{amenity:"restaurant",brand:"Texas Roadhouse","brand:wikidata":"Q7707945","brand:wikipedia":"en:Texas Roadhouse",cuisine:"steak_house",name:"Texas Roadhouse"},matchScore:2,suggestion:true},"amenity/restaurant/The Cheesecake Factory":{name:"The Cheesecake Factory",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1045842"},addTags:{amenity:"restaurant",brand:"The Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",cuisine:"cake",name:"The Cheesecake Factory"},removeTags:{amenity:"restaurant",brand:"The Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",cuisine:"cake",name:"The Cheesecake Factory"},matchScore:2,suggestion:true},"amenity/restaurant/The Keg":{name:"The Keg",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7744066"},addTags:{amenity:"restaurant",brand:"The Keg","brand:wikidata":"Q7744066","brand:wikipedia":"en:The Keg",cuisine:"steak_house",name:"The Keg"},removeTags:{amenity:"restaurant",brand:"The Keg","brand:wikidata":"Q7744066","brand:wikipedia":"en:The Keg",cuisine:"steak_house",name:"The Keg"},matchScore:2,suggestion:true},"amenity/restaurant/Toby Carvery":{name:"Toby Carvery",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7811777"},addTags:{amenity:"restaurant",brand:"Toby Carvery","brand:wikidata":"Q7811777","brand:wikipedia":"en:Toby Carvery",name:"Toby Carvery"},removeTags:{amenity:"restaurant",brand:"Toby Carvery","brand:wikidata":"Q7811777","brand:wikipedia":"en:Toby Carvery",name:"Toby Carvery"},matchScore:2,suggestion:true},"amenity/restaurant/mexican/Toks":{name:"Toks",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"mexican","brand:wikidata":"Q48835586"},addTags:{amenity:"restaurant",brand:"Toks","brand:wikidata":"Q48835586","brand:wikipedia":"en:Toks",cuisine:"mexican",name:"Toks"},removeTags:{amenity:"restaurant",brand:"Toks","brand:wikidata":"Q48835586","brand:wikipedia":"en:Toks",cuisine:"mexican",name:"Toks"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/restaurant/Tony Roma's":{name:"Tony Roma's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q2213883"},addTags:{amenity:"restaurant",brand:"Tony Roma's","brand:wikidata":"Q2213883","brand:wikipedia":"en:Tony Roma's",cuisine:"barbecue",name:"Tony Roma's"},removeTags:{amenity:"restaurant",brand:"Tony Roma's","brand:wikidata":"Q2213883","brand:wikipedia":"en:Tony Roma's",cuisine:"barbecue",name:"Tony Roma's"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Vapiano":{name:"Vapiano",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q506252"},addTags:{amenity:"restaurant",brand:"Vapiano","brand:wikidata":"Q506252","brand:wikipedia":"en:Vapiano",cuisine:"italian",name:"Vapiano"},removeTags:{amenity:"restaurant",brand:"Vapiano","brand:wikidata":"Q506252","brand:wikipedia":"en:Vapiano",cuisine:"italian",name:"Vapiano"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/american/Village Inn":{name:"Village Inn",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q7930659"},addTags:{amenity:"restaurant",brand:"Village Inn","brand:wikidata":"Q7930659","brand:wikipedia":"en:Village Inn",cuisine:"american",name:"Village Inn"},removeTags:{amenity:"restaurant",brand:"Village Inn","brand:wikidata":"Q7930659","brand:wikipedia":"en:Village Inn",cuisine:"american",name:"Village Inn"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Vips":{name:"Vips",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q12599540"},addTags:{amenity:"restaurant",brand:"Vips","brand:wikidata":"Q12599540","brand:wikipedia":"en:VIPS (restaurant)",name:"Vips"},removeTags:{amenity:"restaurant",brand:"Vips","brand:wikidata":"Q12599540","brand:wikipedia":"en:VIPS (restaurant)",name:"Vips"},matchScore:2,suggestion:true},"amenity/restaurant/american/Waffle House":{name:"Waffle House",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q1701206"},addTags:{amenity:"restaurant",brand:"Waffle House","brand:wikidata":"Q1701206","brand:wikipedia":"en:Waffle House",cuisine:"american",name:"Waffle House"},removeTags:{amenity:"restaurant",brand:"Waffle House","brand:wikidata":"Q1701206","brand:wikipedia":"en:Waffle House",cuisine:"american",name:"Waffle House"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/asian/Wagamama":{name:"Wagamama",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"asian","brand:wikidata":"Q503715"},addTags:{amenity:"restaurant",brand:"Wagamama","brand:wikidata":"Q503715","brand:wikipedia":"en:Wagamama",cuisine:"asian",name:"Wagamama"},removeTags:{amenity:"restaurant",brand:"Wagamama","brand:wikidata":"Q503715","brand:wikipedia":"en:Wagamama",cuisine:"asian",name:"Wagamama"},reference:{key:"cuisine",value:"asian"},matchScore:2,suggestion:true},"amenity/restaurant/japanese/Wasabi":{name:"Wasabi",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"japanese","brand:wikidata":"Q23891278"},addTags:{amenity:"restaurant",brand:"Wasabi","brand:wikidata":"Q23891278","brand:wikipedia":"en:Wasabi (restaurant)",cuisine:"japanese",name:"Wasabi"},removeTags:{amenity:"restaurant",brand:"Wasabi","brand:wikidata":"Q23891278","brand:wikipedia":"en:Wasabi (restaurant)",cuisine:"japanese",name:"Wasabi"},reference:{key:"cuisine",value:"japanese"},matchScore:2,suggestion:true},"amenity/restaurant/White Spot":{name:"White Spot",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7995414"},addTags:{amenity:"restaurant",brand:"White Spot","brand:wikidata":"Q7995414","brand:wikipedia":"en:White Spot",cuisine:"burger",name:"White Spot"},removeTags:{amenity:"restaurant",brand:"White Spot","brand:wikidata":"Q7995414","brand:wikipedia":"en:White Spot",cuisine:"burger",name:"White Spot"},matchScore:2,suggestion:true},"amenity/restaurant/Wingstop":{name:"Wingstop",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q8025339"},addTags:{amenity:"restaurant",brand:"Wingstop","brand:wikidata":"Q8025339","brand:wikipedia":"en:Wingstop",cuisine:"wings",name:"Wingstop"},removeTags:{amenity:"restaurant",brand:"Wingstop","brand:wikidata":"Q8025339","brand:wikipedia":"en:Wingstop",cuisine:"wings",name:"Wingstop"},matchScore:2,suggestion:true},"amenity/restaurant/sushi/YO! Sushi":{name:"YO! Sushi",icon:"fas-fish",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"sushi","brand:wikidata":"Q3105441"},addTags:{amenity:"restaurant",brand:"YO! Sushi","brand:wikidata":"Q3105441","brand:wikipedia":"en:YO! Sushi",cuisine:"sushi",name:"YO! Sushi"},removeTags:{amenity:"restaurant",brand:"YO! Sushi","brand:wikidata":"Q3105441","brand:wikipedia":"en:YO! Sushi",cuisine:"sushi",name:"YO! Sushi"},reference:{key:"cuisine",value:"sushi"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Zizzi":{name:"Zizzi",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q8072944"},addTags:{amenity:"restaurant",brand:"Zizzi","brand:wikidata":"Q8072944","brand:wikipedia":"en:Zizzi",cuisine:"italian",name:"Zizzi"},removeTags:{amenity:"restaurant",brand:"Zizzi","brand:wikidata":"Q8072944","brand:wikipedia":"en:Zizzi",cuisine:"italian",name:"Zizzi"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/はなまるうどん":{name:"はなまるうどん",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11275674"},addTags:{amenity:"restaurant",brand:"はなまるうどん","brand:en":"Hanamarūdon","brand:wikidata":"Q11275674","brand:wikipedia":"ja:はなまるうどん",name:"はなまるうどん","name:en":"Hanamarūdon"},removeTags:{amenity:"restaurant",brand:"はなまるうどん","brand:en":"Hanamarūdon","brand:wikidata":"Q11275674","brand:wikipedia":"ja:はなまるうどん",name:"はなまるうどん","name:en":"Hanamarūdon"},matchScore:2,suggestion:true},"amenity/restaurant/びっくりドンキー":{name:"びっくりドンキー",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11276815"},addTags:{amenity:"restaurant",brand:"びっくりドンキー","brand:en":"Bikkuri Donkey","brand:wikidata":"Q11276815","brand:wikipedia":"ja:びっくりドンキー",name:"びっくりドンキー","name:en":"Bikkuri Donkey"},removeTags:{amenity:"restaurant",brand:"びっくりドンキー","brand:en":"Bikkuri Donkey","brand:wikidata":"Q11276815","brand:wikipedia":"ja:びっくりドンキー",name:"びっくりドンキー","name:en":"Bikkuri Donkey"},matchScore:2,suggestion:true},"amenity/restaurant/やよい軒":{name:"やよい軒",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11280577"},addTags:{amenity:"restaurant",brand:"やよい軒","brand:en":"YAYOI","brand:wikidata":"Q11280577","brand:wikipedia":"ja:やよい軒",name:"やよい軒","name:en":"YAYOI"},removeTags:{amenity:"restaurant",brand:"やよい軒","brand:en":"YAYOI","brand:wikidata":"Q11280577","brand:wikipedia":"ja:やよい軒",name:"やよい軒","name:en":"YAYOI"},matchScore:2,suggestion:true},"amenity/restaurant/ガスト":{name:"ガスト",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11253593"},addTags:{amenity:"restaurant",brand:"ガスト","brand:en":"Gusto","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",name:"ガスト","name:en":"Gusto"},removeTags:{amenity:"restaurant",brand:"ガスト","brand:en":"Gusto","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",name:"ガスト","name:en":"Gusto"},matchScore:2,suggestion:true},"amenity/restaurant/ココス":{name:"ココス",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11301951"},addTags:{amenity:"restaurant",brand:"ココス","brand:en":"Coco's","brand:wikidata":"Q11301951","brand:wikipedia":"ja:ココスジャパン",name:"ココス","name:en":"Coco's"},removeTags:{amenity:"restaurant",brand:"ココス","brand:en":"Coco's","brand:wikidata":"Q11301951","brand:wikipedia":"ja:ココスジャパン",name:"ココス","name:en":"Coco's"},matchScore:2,suggestion:true},"amenity/restaurant/サイゼリヤ":{name:"サイゼリヤ",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q886564"},addTags:{amenity:"restaurant",brand:"サイゼリヤ","brand:en":"Saizeriya","brand:wikidata":"Q886564","brand:wikipedia":"en:Saizeriya",name:"サイゼリヤ","name:en":"Saizeriya"},removeTags:{amenity:"restaurant",brand:"サイゼリヤ","brand:en":"Saizeriya","brand:wikidata":"Q886564","brand:wikipedia":"en:Saizeriya",name:"サイゼリヤ","name:en":"Saizeriya"},matchScore:2,suggestion:true},"amenity/restaurant/ジョイフル":{name:"ジョイフル",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11310517"},addTags:{amenity:"restaurant",brand:"ジョイフル","brand:en":"Joyfull","brand:wikidata":"Q11310517","brand:wikipedia":"ja:ジョイフル",name:"ジョイフル","name:en":"Joyfull"},removeTags:{amenity:"restaurant",brand:"ジョイフル","brand:en":"Joyfull","brand:wikidata":"Q11310517","brand:wikipedia":"ja:ジョイフル",name:"ジョイフル","name:en":"Joyfull"},matchScore:2,suggestion:true},"amenity/restaurant/ジョナサン":{name:"ジョナサン",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11310628"},addTags:{amenity:"restaurant",brand:"ジョナサン","brand:en":"Jonathan's","brand:wikidata":"Q11310628","brand:wikipedia":"ja:ジョナサン (ファミリーレストラン)",name:"ジョナサン","name:en":"Jonathan's"},removeTags:{amenity:"restaurant",brand:"ジョナサン","brand:en":"Jonathan's","brand:wikidata":"Q11310628","brand:wikipedia":"ja:ジョナサン (ファミリーレストラン)",name:"ジョナサン","name:en":"Jonathan's"},matchScore:2,suggestion:true},"amenity/restaurant/ジョリーパスタ":{name:"ジョリーパスタ",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q10852718"},addTags:{amenity:"restaurant",brand:"ジョリーパスタ","brand:en":"Jolly-Pasta","brand:wikidata":"Q10852718","brand:wikipedia":"ja:ジョリーパスタ",name:"ジョリーパスタ","name:en":"Jolly-Pasta"},removeTags:{amenity:"restaurant",brand:"ジョリーパスタ","brand:en":"Jolly-Pasta","brand:wikidata":"Q10852718","brand:wikipedia":"ja:ジョリーパスタ",name:"ジョリーパスタ","name:en":"Jolly-Pasta"},matchScore:2,suggestion:true},"amenity/restaurant/デニーズ":{name:"デニーズ",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11320661"},addTags:{amenity:"restaurant",brand:"デニーズ","brand:en":"Denny's","brand:wikidata":"Q11320661","brand:wikipedia":"ja:デニーズ (日本)",name:"デニーズ","name:en":"Denny's"},removeTags:{amenity:"restaurant",brand:"デニーズ","brand:en":"Denny's","brand:wikidata":"Q11320661","brand:wikipedia":"ja:デニーズ (日本)",name:"デニーズ","name:en":"Denny's"},matchScore:2,suggestion:true},"amenity/restaurant/バーミヤン":{name:"バーミヤン",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11328598"},addTags:{amenity:"restaurant",brand:"バーミヤン","brand:en":"Bamiyan","brand:wikidata":"Q11328598","brand:wikipedia":"ja:バーミヤン (レストランチェーン)",name:"バーミヤン","name:en":"Bamiyan"},removeTags:{amenity:"restaurant",brand:"バーミヤン","brand:en":"Bamiyan","brand:wikidata":"Q11328598","brand:wikipedia":"ja:バーミヤン (レストランチェーン)",name:"バーミヤン","name:en":"Bamiyan"},matchScore:2,suggestion:true},"amenity/restaurant/ビッグボーイ":{name:"ビッグボーイ",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4386779"},addTags:{amenity:"restaurant",brand:"ビッグボーイ","brand:en":"Big Boy Restaurants","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",name:"ビッグボーイ","name:en":"Big Boy Restaurants"},removeTags:{amenity:"restaurant",brand:"ビッグボーイ","brand:en":"Big Boy Restaurants","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",name:"ビッグボーイ","name:en":"Big Boy Restaurants"},matchScore:2,suggestion:true},"amenity/restaurant/リンガーハット":{name:"リンガーハット",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7334856"},addTags:{amenity:"restaurant",brand:"リンガーハット","brand:en":"Ringer Hut","brand:wikidata":"Q7334856","brand:wikipedia":"en:Ringer Hut",name:"リンガーハット","name:en":"Ringer Hut"},removeTags:{amenity:"restaurant",brand:"リンガーハット","brand:en":"Ringer Hut","brand:wikidata":"Q7334856","brand:wikipedia":"en:Ringer Hut",name:"リンガーハット","name:en":"Ringer Hut"},matchScore:2,suggestion:true},"amenity/restaurant/ロイヤルホスト":{name:"ロイヤルホスト",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11120884"},addTags:{amenity:"restaurant",brand:"ロイヤルホスト","brand:en":"Royal Host","brand:wikidata":"Q11120884","brand:wikipedia":"ja:ロイヤルホスト",name:"ロイヤルホスト","name:en":"Royal Host"},removeTags:{amenity:"restaurant",brand:"ロイヤルホスト","brand:en":"Royal Host","brand:wikidata":"Q11120884","brand:wikipedia":"ja:ロイヤルホスト",name:"ロイヤルホスト","name:en":"Royal Host"},matchScore:2,suggestion:true},"amenity/restaurant/noodle/丸亀製麺":{name:"丸亀製麺",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"noodle","brand:wikidata":"Q10877253"},addTags:{amenity:"restaurant",brand:"丸亀製麺","brand:en":"Marugame Seimen","brand:wikidata":"Q10877253","brand:wikipedia":"ja:丸亀製麺",cuisine:"noodle",name:"丸亀製麺","name:en":"Marugame Seimen","name:ko":"마루가메 제면"},removeTags:{amenity:"restaurant",brand:"丸亀製麺","brand:en":"Marugame Seimen","brand:wikidata":"Q10877253","brand:wikipedia":"ja:丸亀製麺",cuisine:"noodle",name:"丸亀製麺","name:en":"Marugame Seimen","name:ko":"마루가메 제면"},reference:{key:"cuisine",value:"noodle"},matchScore:2,suggestion:true},"amenity/restaurant/八方雲集":{name:"八方雲集",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q28417381"},addTags:{amenity:"restaurant",brand:"八方雲集","brand:wikidata":"Q28417381","brand:wikipedia":"zh:八方雲集",name:"八方雲集"},removeTags:{amenity:"restaurant",brand:"八方雲集","brand:wikidata":"Q28417381","brand:wikipedia":"zh:八方雲集",name:"八方雲集"},matchScore:2,suggestion:true},"amenity/restaurant/和食さと":{name:"和食さと",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11304897"},addTags:{amenity:"restaurant",brand:"和食さと","brand:en":"Washoku Sato","brand:wikidata":"Q11304897","brand:wikipedia":"ja:SRSホールディングス",name:"和食さと","name:en":"Washoku Sato"},removeTags:{amenity:"restaurant",brand:"和食さと","brand:en":"Washoku Sato","brand:wikidata":"Q11304897","brand:wikipedia":"ja:SRSホールディングス",name:"和食さと","name:en":"Washoku Sato"},matchScore:2,suggestion:true},"amenity/restaurant/夢庵":{name:"夢庵",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11253593"},addTags:{amenity:"restaurant",brand:"夢庵","brand:en":"Yumean","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",name:"夢庵","name:en":"Yumean"},removeTags:{amenity:"restaurant",brand:"夢庵","brand:en":"Yumean","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",name:"夢庵","name:en":"Yumean"},matchScore:2,suggestion:true},"amenity/restaurant/japanese/大戸屋":{name:"大戸屋",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"japanese","brand:wikidata":"Q11435522"},addTags:{amenity:"restaurant",brand:"大戸屋","brand:en":"Ootoya","brand:wikidata":"Q11435522","brand:wikipedia":"ja:大戸屋ホールディングス",cuisine:"japanese",name:"大戸屋","name:en":"Ootoya"},removeTags:{amenity:"restaurant",brand:"大戸屋","brand:en":"Ootoya","brand:wikidata":"Q11435522","brand:wikipedia":"ja:大戸屋ホールディングス",cuisine:"japanese",name:"大戸屋","name:en":"Ootoya"},reference:{key:"cuisine",value:"japanese"},matchScore:2,suggestion:true},"amenity/restaurant/大阪王将":{name:"大阪王将",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q48743717"},addTags:{amenity:"restaurant",brand:"大阪王将","brand:en":"Osaka Ohsho","brand:wikidata":"Q48743717","brand:wikipedia":"ja:大阪王将",name:"大阪王将","name:en":"Osaka Ohsho"},removeTags:{amenity:"restaurant",brand:"大阪王将","brand:en":"Osaka Ohsho","brand:wikidata":"Q48743717","brand:wikipedia":"ja:大阪王将",name:"大阪王将","name:en":"Osaka Ohsho"},matchScore:2,suggestion:true},"amenity/restaurant/天下一品":{name:"天下一品",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11442172"},addTags:{amenity:"restaurant",brand:"天下一品","brand:en":"Tenkaippin","brand:wikidata":"Q11442172","brand:wikipedia":"en:Tenkaippin",name:"天下一品","name:en":"Tenkaippin"},removeTags:{amenity:"restaurant",brand:"天下一品","brand:en":"Tenkaippin","brand:wikidata":"Q11442172","brand:wikipedia":"en:Tenkaippin",name:"天下一品","name:en":"Tenkaippin"},matchScore:2,suggestion:true},"amenity/restaurant/安楽亭":{name:"安楽亭",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11450866"},addTags:{amenity:"restaurant",brand:"安楽亭","brand:en":"Anrakutei","brand:wikidata":"Q11450866","brand:wikipedia":"ja:安楽亭",cuisine:"barbecue",name:"安楽亭","name:en":"Anrakutei"},removeTags:{amenity:"restaurant",brand:"安楽亭","brand:en":"Anrakutei","brand:wikidata":"Q11450866","brand:wikipedia":"ja:安楽亭",cuisine:"barbecue",name:"安楽亭","name:en":"Anrakutei"},matchScore:2,suggestion:true},"amenity/restaurant/noodle/日高屋":{name:"日高屋",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"noodle","brand:wikidata":"Q11326050"},addTags:{amenity:"restaurant",brand:"日高屋","brand:en":"Hidakaya","brand:wikidata":"Q11326050","brand:wikipedia":"ja:ハイデイ日高",cuisine:"noodle",name:"日高屋","name:en":"Hidakaya"},removeTags:{amenity:"restaurant",brand:"日高屋","brand:en":"Hidakaya","brand:wikidata":"Q11326050","brand:wikipedia":"ja:ハイデイ日高",cuisine:"noodle",name:"日高屋","name:en":"Hidakaya"},reference:{key:"cuisine",value:"noodle"},matchScore:2,suggestion:true},"amenity/restaurant/永和豆漿":{name:"永和豆漿",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11131335"},addTags:{amenity:"restaurant",brand:"永和豆漿","brand:wikidata":"Q11131335","brand:wikipedia":"zh:永和豆浆",name:"永和豆漿"},removeTags:{amenity:"restaurant",brand:"永和豆漿","brand:wikidata":"Q11131335","brand:wikipedia":"zh:永和豆浆",name:"永和豆漿"},matchScore:2,suggestion:true},"amenity/restaurant/牛角":{name:"牛角",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11349387"},addTags:{amenity:"restaurant",brand:"牛角","brand:en":"Gyū-Kaku","brand:wikidata":"Q11349387","brand:wikipedia":"en:Gyu-Kaku",cuisine:"barbecue",name:"牛角","name:en":"Gyū-Kaku"},removeTags:{amenity:"restaurant",brand:"牛角","brand:en":"Gyū-Kaku","brand:wikidata":"Q11349387","brand:wikipedia":"en:Gyu-Kaku",cuisine:"barbecue",name:"牛角","name:en":"Gyū-Kaku"},matchScore:2,suggestion:true},"amenity/restaurant/餃子の王将":{name:"餃子の王将",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11666805"},addTags:{amenity:"restaurant",brand:"餃子の王将","brand:en":"Gyoza no Ohsho","brand:wikidata":"Q11666805","brand:wikipedia":"en:Gyoza no Ohsho",name:"餃子の王将","name:en":"Gyoza no Ohsho"},removeTags:{amenity:"restaurant",brand:"餃子の王将","brand:en":"Gyoza no Ohsho","brand:wikidata":"Q11666805","brand:wikipedia":"en:Gyoza no Ohsho",name:"餃子の王将","name:en":"Gyoza no Ohsho"},matchScore:2,suggestion:true},"amenity/vending_machine/parcel_pickup_dropoff/DHL Packstation":{name:"DHL Packstation",icon:"temaki-vending_machine",geometry:["point"],tags:{amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in","brand:wikidata":"Q489815"},addTags:{amenity:"vending_machine",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL Packstation",operator:"DHL",vending:"parcel_pickup;parcel_mail_in"},removeTags:{amenity:"vending_machine",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL Packstation",operator:"DHL",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},matchScore:2,suggestion:true},"amenity/vending_machine/public_transport_tickets/KKM":{name:"KKM",icon:"temaki-vending_machine",geometry:["point"],tags:{amenity:"vending_machine",vending:"public_transport_tickets","brand:wikidata":"Q57515549"},addTags:{amenity:"vending_machine",brand:"KKM","brand:wikidata":"Q57515549",name:"KKM",vending:"public_transport_tickets"},removeTags:{amenity:"vending_machine",brand:"KKM","brand:wikidata":"Q57515549",name:"KKM",vending:"public_transport_tickets"},reference:{key:"vending",value:"public_transport_tickets"},matchScore:2,suggestion:true},"amenity/vending_machine/parcel_pickup_dropoff/Paczkomat InPost":{name:"Paczkomat InPost",icon:"temaki-vending_machine",geometry:["point"],tags:{amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in","brand:wikidata":"Q3182097"},addTags:{amenity:"vending_machine",brand:"InPost","brand:wikidata":"Q3182097","brand:wikipedia":"pl:InPost",name:"Paczkomat InPost",vending:"parcel_pickup;parcel_mail_in"},removeTags:{amenity:"vending_machine",brand:"InPost","brand:wikidata":"Q3182097","brand:wikipedia":"pl:InPost",name:"Paczkomat InPost",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},matchScore:2,suggestion:true},"amenity/vending_machine/Redbox":{name:"Redbox",icon:"temaki-vending_machine",geometry:["point"],tags:{amenity:"vending_machine","brand:wikidata":"Q7305489"},addTags:{amenity:"vending_machine",brand:"Redbox","brand:wikidata":"Q7305489","brand:wikipedia":"en:Redbox",name:"Redbox"},removeTags:{amenity:"vending_machine",brand:"Redbox","brand:wikidata":"Q7305489","brand:wikipedia":"en:Redbox",name:"Redbox"},matchScore:2,suggestion:true},"amenity/vending_machine/Robidog":{name:"Robidog",icon:"temaki-vending_machine",geometry:["point"],tags:{amenity:"vending_machine","brand:wikidata":"Q2159689"},addTags:{amenity:"vending_machine",brand:"Robidog","brand:wikidata":"Q2159689","brand:wikipedia":"de:Robidog",name:"Robidog"},removeTags:{amenity:"vending_machine",brand:"Robidog","brand:wikidata":"Q2159689","brand:wikipedia":"de:Robidog",name:"Robidog"},matchScore:2,suggestion:true},"amenity/vending_machine/Tobaccoland":{name:"Tobaccoland",icon:"temaki-vending_machine",geometry:["point"],tags:{amenity:"vending_machine","brand:wikidata":"Q1439872"},addTags:{amenity:"vending_machine",brand:"Tobaccoland","brand:wikidata":"Q1439872","brand:wikipedia":"de:Tobaccoland Automatengesellschaft",name:"Tobaccoland"},removeTags:{amenity:"vending_machine",brand:"Tobaccoland","brand:wikidata":"Q1439872","brand:wikipedia":"de:Tobaccoland Automatengesellschaft",name:"Tobaccoland"},matchScore:2,suggestion:true},"amenity/veterinary/Banfield Pet Hospital":{name:"Banfield Pet Hospital",icon:"temaki-veterinary_care",geometry:["point","area"],tags:{amenity:"veterinary","brand:wikidata":"Q2882416"},addTags:{amenity:"veterinary",brand:"Banfield Pet Hospital","brand:wikidata":"Q2882416","brand:wikipedia":"en:Banfield Pet Hospital",name:"Banfield Pet Hospital"},removeTags:{amenity:"veterinary",brand:"Banfield Pet Hospital","brand:wikidata":"Q2882416","brand:wikipedia":"en:Banfield Pet Hospital",name:"Banfield Pet Hospital"},matchScore:2,suggestion:true},"leisure/fitness_centre/24 Hour Fitness":{name:"24 Hour Fitness",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q4631849"},addTags:{brand:"24 Hour Fitness","brand:wikidata":"Q4631849","brand:wikipedia":"en:24 Hour Fitness",leisure:"fitness_centre",name:"24 Hour Fitness"},removeTags:{brand:"24 Hour Fitness","brand:wikidata":"Q4631849","brand:wikipedia":"en:24 Hour Fitness",leisure:"fitness_centre",name:"24 Hour Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/Anytime Fitness":{name:"Anytime Fitness",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q4778364"},addTags:{brand:"Anytime Fitness","brand:wikidata":"Q4778364","brand:wikipedia":"en:Anytime Fitness",leisure:"fitness_centre",name:"Anytime Fitness"},removeTags:{brand:"Anytime Fitness","brand:wikidata":"Q4778364","brand:wikipedia":"en:Anytime Fitness",leisure:"fitness_centre",name:"Anytime Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/Curves":{name:"Curves",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q5196080"},addTags:{brand:"Curves","brand:wikidata":"Q5196080","brand:wikipedia":"en:Curves International",leisure:"fitness_centre",name:"Curves"},removeTags:{brand:"Curves","brand:wikidata":"Q5196080","brand:wikipedia":"en:Curves International",leisure:"fitness_centre",name:"Curves"},matchScore:2,suggestion:true},"leisure/fitness_centre/Gold's Gym":{name:"Gold's Gym",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q1536234"},addTags:{brand:"Gold's Gym","brand:wikidata":"Q1536234","brand:wikipedia":"en:Gold's Gym",leisure:"fitness_centre",name:"Gold's Gym"},removeTags:{brand:"Gold's Gym","brand:wikidata":"Q1536234","brand:wikipedia":"en:Gold's Gym",leisure:"fitness_centre",name:"Gold's Gym"},matchScore:2,suggestion:true},"leisure/fitness_centre/LA Fitness":{name:"LA Fitness",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q6457180"},addTags:{brand:"LA Fitness","brand:wikidata":"Q6457180","brand:wikipedia":"en:LA Fitness",leisure:"fitness_centre",name:"LA Fitness"},removeTags:{brand:"LA Fitness","brand:wikidata":"Q6457180","brand:wikipedia":"en:LA Fitness",leisure:"fitness_centre",name:"LA Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/Planet Fitness":{name:"Planet Fitness",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q7201095"},addTags:{brand:"Planet Fitness","brand:wikidata":"Q7201095","brand:wikipedia":"en:Planet Fitness",leisure:"fitness_centre",name:"Planet Fitness"},removeTags:{brand:"Planet Fitness","brand:wikidata":"Q7201095","brand:wikipedia":"en:Planet Fitness",leisure:"fitness_centre",name:"Planet Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/PureGym":{name:"PureGym",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q18345898"},addTags:{brand:"PureGym","brand:wikidata":"Q18345898","brand:wikipedia":"en:PureGym",leisure:"fitness_centre",name:"PureGym"},removeTags:{brand:"PureGym","brand:wikidata":"Q18345898","brand:wikipedia":"en:PureGym",leisure:"fitness_centre",name:"PureGym"},matchScore:2,suggestion:true},"leisure/fitness_centre/Snap Fitness":{name:"Snap Fitness",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q7547254"},addTags:{brand:"Snap Fitness","brand:wikidata":"Q7547254","brand:wikipedia":"en:Snap Fitness",leisure:"fitness_centre",name:"Snap Fitness"},removeTags:{brand:"Snap Fitness","brand:wikidata":"Q7547254","brand:wikipedia":"en:Snap Fitness",leisure:"fitness_centre",name:"Snap Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/YMCA":{name:"YMCA",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q157169"},addTags:{brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",leisure:"fitness_centre",name:"YMCA"},removeTags:{brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",leisure:"fitness_centre",name:"YMCA"},matchScore:2,suggestion:true},"shop/alcohol/Alko":{name:"Alko",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q1849187"},addTags:{brand:"Alko","brand:wikidata":"Q1849187","brand:wikipedia":"en:Alko",name:"Alko",shop:"alcohol"},removeTags:{brand:"Alko","brand:wikidata":"Q1849187","brand:wikipedia":"en:Alko",name:"Alko",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/BC Liquor Store":{name:"BC Liquor Store",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q43079557"},addTags:{brand:"BC Liquor Store","brand:wikidata":"Q43079557","brand:wikipedia":"en:BC Liquor Stores",name:"BC Liquor Store",shop:"alcohol"},removeTags:{brand:"BC Liquor Store","brand:wikidata":"Q43079557","brand:wikipedia":"en:BC Liquor Stores",name:"BC Liquor Store",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/BWS":{name:"BWS",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q4836848"},addTags:{brand:"BWS","brand:wikidata":"Q4836848","brand:wikipedia":"en:BWS (liquor retailer)",name:"BWS",shop:"alcohol"},removeTags:{brand:"BWS","brand:wikidata":"Q4836848","brand:wikipedia":"en:BWS (liquor retailer)",name:"BWS",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Bargain Booze":{name:"Bargain Booze",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q16971315"},addTags:{brand:"Bargain Booze","brand:wikidata":"Q16971315","brand:wikipedia":"en:Bargain Booze",name:"Bargain Booze",shop:"alcohol"},removeTags:{brand:"Bargain Booze","brand:wikidata":"Q16971315","brand:wikipedia":"en:Bargain Booze",name:"Bargain Booze",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/BevMo!":{name:"BevMo!",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q4899308"},addTags:{brand:"BevMo!","brand:wikidata":"Q4899308","brand:wikipedia":"en:BevMo!",name:"BevMo!",shop:"alcohol"},removeTags:{brand:"BevMo!","brand:wikidata":"Q4899308","brand:wikipedia":"en:BevMo!",name:"BevMo!",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Dan Murphy's":{name:"Dan Murphy's",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q5214075"},addTags:{brand:"Dan Murphy's","brand:wikidata":"Q5214075","brand:wikipedia":"en:Dan Murphy's",name:"Dan Murphy's",shop:"alcohol"},removeTags:{brand:"Dan Murphy's","brand:wikidata":"Q5214075","brand:wikipedia":"en:Dan Murphy's",name:"Dan Murphy's",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Gall & Gall":{name:"Gall & Gall",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q13639185"},addTags:{brand:"Gall & Gall","brand:wikidata":"Q13639185","brand:wikipedia":"nl:Gall & Gall",name:"Gall & Gall",shop:"alcohol"},removeTags:{brand:"Gall & Gall","brand:wikidata":"Q13639185","brand:wikipedia":"nl:Gall & Gall",name:"Gall & Gall",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/LCBO":{name:"LCBO",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q845263"},addTags:{brand:"LCBO","brand:wikidata":"Q845263","brand:wikipedia":"en:Liquor Control Board of Ontario",name:"LCBO",shop:"alcohol"},removeTags:{brand:"LCBO","brand:wikidata":"Q845263","brand:wikipedia":"en:Liquor Control Board of Ontario",name:"LCBO",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Liquorland":{name:"Liquorland",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q2283837"},addTags:{brand:"Liquorland","brand:wikidata":"Q2283837","brand:wikipedia":"en:Liquorland",name:"Liquorland",shop:"alcohol"},removeTags:{brand:"Liquorland","brand:wikidata":"Q2283837","brand:wikipedia":"en:Liquorland",name:"Liquorland",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Nicolas":{name:"Nicolas",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q3340012"},addTags:{brand:"Nicolas","brand:wikidata":"Q3340012","brand:wikipedia":"en:Nicolas (wine retailer)",name:"Nicolas",shop:"alcohol"},removeTags:{brand:"Nicolas","brand:wikidata":"Q3340012","brand:wikipedia":"en:Nicolas (wine retailer)",name:"Nicolas",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/SAQ":{name:"SAQ",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q3488077"},addTags:{brand:"SAQ","brand:wikidata":"Q3488077","brand:wikipedia":"en:Société des alcools du Québec",name:"SAQ",shop:"alcohol"},removeTags:{brand:"SAQ","brand:wikidata":"Q3488077","brand:wikipedia":"en:Société des alcools du Québec",name:"SAQ",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Spec's":{name:"Spec's",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q7574415"},addTags:{brand:"Spec's","brand:wikidata":"Q7574415","brand:wikipedia":"en:Spec's Wine, Spirits & Finer Foods",name:"Spec's",shop:"alcohol"},removeTags:{brand:"Spec's","brand:wikidata":"Q7574415","brand:wikipedia":"en:Spec's Wine, Spirits & Finer Foods",name:"Spec's",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Systembolaget":{name:"Systembolaget",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q1476113"},addTags:{brand:"Systembolaget","brand:wikidata":"Q1476113","brand:wikipedia":"en:Systembolaget",name:"Systembolaget",shop:"alcohol"},removeTags:{brand:"Systembolaget","brand:wikidata":"Q1476113","brand:wikipedia":"en:Systembolaget",name:"Systembolaget",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/The Beer Store":{name:"The Beer Store",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q16243674"},addTags:{brand:"The Beer Store","brand:wikidata":"Q16243674","brand:wikipedia":"en:The Beer Store",name:"The Beer Store",shop:"alcohol"},removeTags:{brand:"The Beer Store","brand:wikidata":"Q16243674","brand:wikipedia":"en:The Beer Store",name:"The Beer Store",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Total Wine":{name:"Total Wine",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q7828084"},addTags:{brand:"Total Wine","brand:wikidata":"Q7828084","brand:wikipedia":"en:Total Wine & More",name:"Total Wine",shop:"alcohol"},removeTags:{brand:"Total Wine","brand:wikidata":"Q7828084","brand:wikipedia":"en:Total Wine & More",name:"Total Wine",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Vinmonopolet":{name:"Vinmonopolet",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q1740534"},addTags:{brand:"Vinmonopolet","brand:wikidata":"Q1740534","brand:wikipedia":"en:Vinmonopolet",name:"Vinmonopolet",shop:"alcohol"},removeTags:{brand:"Vinmonopolet","brand:wikidata":"Q1740534","brand:wikipedia":"en:Vinmonopolet",name:"Vinmonopolet",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Virginia ABC":{name:"Virginia ABC",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q7934236"},addTags:{brand:"Virginia ABC","brand:wikidata":"Q7934236","brand:wikipedia":"en:Virginia Alcoholic Beverage Control Authority",name:"Virginia ABC",shop:"alcohol"},removeTags:{brand:"Virginia ABC","brand:wikidata":"Q7934236","brand:wikipedia":"en:Virginia Alcoholic Beverage Control Authority",name:"Virginia ABC",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Красное & Белое":{name:"Красное & Белое",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q24933790"},addTags:{brand:"Красное & Белое","brand:en":"Red&White","brand:wikidata":"Q24933790","brand:wikipedia":"en:Red&White",name:"Красное & Белое","name:en":"Red&White",shop:"alcohol"},removeTags:{brand:"Красное & Белое","brand:en":"Red&White","brand:wikidata":"Q24933790","brand:wikipedia":"en:Red&White",name:"Красное & Белое","name:en":"Red&White",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Лион":{name:"Лион",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q3241775"},addTags:{brand:"Лион","brand:wikidata":"Q3241775","brand:wikipedia":"en:Lion (Australasian company)",name:"Лион",shop:"alcohol"},removeTags:{brand:"Лион","brand:wikidata":"Q3241775","brand:wikipedia":"en:Lion (Australasian company)",name:"Лион",shop:"alcohol"},matchScore:2,suggestion:true},"shop/baby_goods/Babies R Us":{name:"Babies R Us",icon:"maki-shop",geometry:["point","area"],tags:{shop:"baby_goods","brand:wikidata":"Q696334"},addTags:{brand:"Babies R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Babies R Us",shop:"baby_goods"},removeTags:{brand:"Babies R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Babies R Us",shop:"baby_goods"},matchScore:2,suggestion:true},"shop/baby_goods/BabyOne":{name:"BabyOne",icon:"maki-shop",geometry:["point","area"],tags:{shop:"baby_goods","brand:wikidata":"Q57540408"},addTags:{brand:"BabyOne","brand:wikidata":"Q57540408",name:"BabyOne",shop:"baby_goods"},removeTags:{brand:"BabyOne","brand:wikidata":"Q57540408",name:"BabyOne",shop:"baby_goods"},matchScore:2,suggestion:true},"shop/baby_goods/Mothercare":{name:"Mothercare",icon:"maki-shop",geometry:["point","area"],tags:{shop:"baby_goods","brand:wikidata":"Q136738"},addTags:{brand:"Mothercare","brand:wikidata":"Q136738","brand:wikipedia":"en:Mothercare",name:"Mothercare",shop:"baby_goods"},removeTags:{brand:"Mothercare","brand:wikidata":"Q136738","brand:wikipedia":"en:Mothercare",name:"Mothercare",shop:"baby_goods"},matchScore:2,suggestion:true},"shop/bakery/Anker":{name:"Anker",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q557116"},addTags:{brand:"Anker","brand:wikidata":"Q557116","brand:wikipedia":"de:Ankerbrot",name:"Anker",shop:"bakery"},removeTags:{brand:"Anker","brand:wikidata":"Q557116","brand:wikipedia":"de:Ankerbrot",name:"Anker",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Backwerk":{name:"Backwerk",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q798298"},addTags:{brand:"BackWerk","brand:wikidata":"Q798298","brand:wikipedia":"de:BackWerk",name:"Backwerk",shop:"bakery"},removeTags:{brand:"BackWerk","brand:wikidata":"Q798298","brand:wikipedia":"de:BackWerk",name:"Backwerk",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Bakers Delight":{name:"Bakers Delight",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q4849261"},addTags:{brand:"Bakers Delight","brand:wikidata":"Q4849261","brand:wikipedia":"en:Bakers Delight",name:"Bakers Delight",shop:"bakery"},removeTags:{brand:"Bakers Delight","brand:wikidata":"Q4849261","brand:wikipedia":"en:Bakers Delight",name:"Bakers Delight",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Bakker Bart":{name:"Bakker Bart",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q2177445"},addTags:{brand:"Bakker Bart","brand:wikidata":"Q2177445","brand:wikipedia":"nl:Bakker Bart",name:"Bakker Bart",shop:"bakery"},removeTags:{brand:"Bakker Bart","brand:wikidata":"Q2177445","brand:wikipedia":"nl:Bakker Bart",name:"Bakker Bart",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Banette":{name:"Banette",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q2882405"},addTags:{brand:"Banette","brand:wikidata":"Q2882405","brand:wikipedia":"fr:Banette (entreprise)",name:"Banette",shop:"bakery"},removeTags:{brand:"Banette","brand:wikidata":"Q2882405","brand:wikipedia":"fr:Banette (entreprise)",name:"Banette",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Bäckerei Fuchs":{name:"Bäckerei Fuchs",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q42825993"},addTags:{brand:"Bäckerei Fuchs","brand:wikidata":"Q42825993","brand:wikipedia":"de:Harald Fuchs Bäckerei – Konditorei",name:"Bäckerei Fuchs",shop:"bakery"},removeTags:{brand:"Bäckerei Fuchs","brand:wikidata":"Q42825993","brand:wikipedia":"de:Harald Fuchs Bäckerei – Konditorei",name:"Bäckerei Fuchs",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Cooplands":{name:"Cooplands",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q5167971"},addTags:{brand:"Cooplands","brand:wikidata":"Q5167971","brand:wikipedia":"en:Cooplands",name:"Cooplands",shop:"bakery"},removeTags:{brand:"Cooplands","brand:wikidata":"Q5167971","brand:wikipedia":"en:Cooplands",name:"Cooplands",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Der Beck":{name:"Der Beck",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1192443"},addTags:{brand:"Der Beck","brand:wikidata":"Q1192443","brand:wikipedia":"en:Der Beck",name:"Der Beck",shop:"bakery"},removeTags:{brand:"Der Beck","brand:wikidata":"Q1192443","brand:wikipedia":"en:Der Beck",name:"Der Beck",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Ditsch":{name:"Ditsch",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q911573"},addTags:{brand:"Ditsch","brand:wikidata":"Q911573","brand:wikipedia":"en:Ditsch",name:"Ditsch",shop:"bakery"},removeTags:{brand:"Ditsch","brand:wikidata":"Q911573","brand:wikipedia":"en:Ditsch",name:"Ditsch",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Fornetti":{name:"Fornetti",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1003020"},addTags:{brand:"Fornetti","brand:wikidata":"Q1003020","brand:wikipedia":"en:Fornetti",name:"Fornetti",shop:"bakery"},removeTags:{brand:"Fornetti","brand:wikidata":"Q1003020","brand:wikipedia":"en:Fornetti",name:"Fornetti",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Goldilocks":{name:"Goldilocks",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q5580198"},addTags:{brand:"Goldilocks","brand:wikidata":"Q5580198","brand:wikipedia":"en:Goldilocks Bakeshop",name:"Goldilocks",shop:"bakery"},removeTags:{brand:"Goldilocks","brand:wikidata":"Q5580198","brand:wikipedia":"en:Goldilocks Bakeshop",name:"Goldilocks",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Greggs":{name:"Greggs",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q3403981"},addTags:{brand:"Greggs","brand:wikidata":"Q3403981","brand:wikipedia":"en:Greggs",name:"Greggs",shop:"bakery"},removeTags:{brand:"Greggs","brand:wikidata":"Q3403981","brand:wikipedia":"en:Greggs",name:"Greggs",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Hofpfisterei":{name:"Hofpfisterei",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1623217"},addTags:{brand:"Hofpfisterei","brand:wikidata":"Q1623217","brand:wikipedia":"en:Hofpfisterei",name:"Hofpfisterei",shop:"bakery"},removeTags:{brand:"Hofpfisterei","brand:wikidata":"Q1623217","brand:wikipedia":"en:Hofpfisterei",name:"Hofpfisterei",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Ihle":{name:"Ihle",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q881821"},addTags:{brand:"Ihle","brand:wikidata":"Q881821","brand:wikipedia":"en:Ihle",name:"Ihle",shop:"bakery"},removeTags:{brand:"Ihle","brand:wikidata":"Q881821","brand:wikipedia":"en:Ihle",name:"Ihle",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/K&U Bäckerei":{name:"K&U Bäckerei",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1719433"},addTags:{brand:"K&U Bäckerei","brand:wikidata":"Q1719433","brand:wikipedia":"de:K & U Bäckerei",name:"K&U Bäckerei",shop:"bakery"},removeTags:{brand:"K&U Bäckerei","brand:wikidata":"Q1719433","brand:wikipedia":"de:K & U Bäckerei",name:"K&U Bäckerei",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Kamps":{name:"Kamps",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1723381"},addTags:{brand:"Kamps","brand:wikidata":"Q1723381","brand:wikipedia":"de:Kamps (Unternehmen)",name:"Kamps",shop:"bakery"},removeTags:{brand:"Kamps","brand:wikidata":"Q1723381","brand:wikipedia":"de:Kamps (Unternehmen)",name:"Kamps",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/La Mie Câline":{name:"La Mie Câline",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q3210704"},addTags:{brand:"La Mie Câline","brand:wikidata":"Q3210704","brand:wikipedia":"fr:La Mie câline",name:"La Mie Câline",shop:"bakery"},removeTags:{brand:"La Mie Câline","brand:wikidata":"Q3210704","brand:wikipedia":"fr:La Mie câline",name:"La Mie Câline",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Le Crobag":{name:"Le Crobag",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1558025"},addTags:{brand:"Le Crobag","brand:wikidata":"Q1558025","brand:wikipedia":"de:Le Crobag",name:"Le Crobag",shop:"bakery"},removeTags:{brand:"Le Crobag","brand:wikidata":"Q1558025","brand:wikipedia":"de:Le Crobag",name:"Le Crobag",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Lila Bäcker":{name:"Lila Bäcker",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q57516591"},addTags:{brand:"Lila Bäcker","brand:wikidata":"Q57516591",name:"Lila Bäcker",shop:"bakery"},removeTags:{brand:"Lila Bäcker","brand:wikidata":"Q57516591",name:"Lila Bäcker",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Musmanni":{name:"Musmanni",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q19382082"},addTags:{brand:"Musmanni","brand:wikidata":"Q19382082","brand:wikipedia":"no:Musmanni",name:"Musmanni",shop:"bakery"},removeTags:{brand:"Musmanni","brand:wikidata":"Q19382082","brand:wikipedia":"no:Musmanni",name:"Musmanni",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Paul":{name:"Paul",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q3370417"},addTags:{brand:"Paul","brand:wikidata":"Q3370417","brand:wikipedia":"en:Paul (bakery)",name:"Paul",shop:"bakery"},removeTags:{brand:"Paul","brand:wikidata":"Q3370417","brand:wikipedia":"en:Paul (bakery)",name:"Paul",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Red Ribbon":{name:"Red Ribbon",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q7304789"},addTags:{brand:"Red Ribbon","brand:wikidata":"Q7304789","brand:wikipedia":"en:Red Ribbon Bakeshop",name:"Red Ribbon",shop:"bakery"},removeTags:{brand:"Red Ribbon","brand:wikidata":"Q7304789","brand:wikipedia":"en:Red Ribbon Bakeshop",name:"Red Ribbon",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Ronde des Pains":{name:"Ronde des Pains",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q3441707"},addTags:{brand:"Ronde des Pains","brand:wikidata":"Q3441707","brand:wikipedia":"fr:Ronde des Pains",name:"Ronde des Pains",shop:"bakery"},removeTags:{brand:"Ronde des Pains","brand:wikidata":"Q3441707","brand:wikipedia":"fr:Ronde des Pains",name:"Ronde des Pains",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Sehne":{name:"Sehne",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1314761"},addTags:{brand:"Sehne","brand:wikidata":"Q1314761","brand:wikipedia":"de:Sehne Backwaren",name:"Sehne",shop:"bakery"},removeTags:{brand:"Sehne","brand:wikidata":"Q1314761","brand:wikipedia":"de:Sehne Backwaren",name:"Sehne",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Steinecke":{name:"Steinecke",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q57516278"},addTags:{brand:"Steinecke","brand:wikidata":"Q57516278",name:"Steinecke",shop:"bakery"},removeTags:{brand:"Steinecke","brand:wikidata":"Q57516278",name:"Steinecke",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Ströck":{name:"Ströck",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q2357607"},addTags:{brand:"Ströck","brand:wikidata":"Q2357607","brand:wikipedia":"de:Ströck-Brot",name:"Ströck",shop:"bakery"},removeTags:{brand:"Ströck","brand:wikidata":"Q2357607","brand:wikipedia":"de:Ströck-Brot",name:"Ströck",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Wiener Feinbäcker":{name:"Wiener Feinbäcker",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q15854357"},addTags:{brand:"Wiener Feinbäcker","brand:wikidata":"Q15854357","brand:wikipedia":"de:Wiener Feinbäckerei Heberer",name:"Wiener Feinbäcker",shop:"bakery"},removeTags:{brand:"Wiener Feinbäcker","brand:wikidata":"Q15854357","brand:wikipedia":"de:Wiener Feinbäckerei Heberer",name:"Wiener Feinbäcker",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/von Allwörden":{name:"von Allwörden",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q60411349"},addTags:{brand:"von Allwörden","brand:wikidata":"Q60411349","brand:wikipedia":"nds:Heinrich von Allwörden GmbH",name:"von Allwörden",shop:"bakery"},removeTags:{brand:"von Allwörden","brand:wikidata":"Q60411349","brand:wikipedia":"nds:Heinrich von Allwörden GmbH",name:"von Allwörden",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/뚜레쥬르":{name:"뚜레쥬르",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q3535609"},addTags:{brand:"뚜레쥬르","brand:en":"Tous Les Jours","brand:wikidata":"Q3535609","brand:wikipedia":"ko:뚜레쥬르",name:"뚜레쥬르","name:en":"Tous Les Jours",shop:"bakery"},removeTags:{brand:"뚜레쥬르","brand:en":"Tous Les Jours","brand:wikidata":"Q3535609","brand:wikipedia":"ko:뚜레쥬르",name:"뚜레쥬르","name:en":"Tous Les Jours",shop:"bakery"},matchScore:2,suggestion:true},"shop/beauty/Bath & Body Works":{name:"Bath & Body Works",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beauty","brand:wikidata":"Q810773"},addTags:{brand:"Bath & Body Works","brand:wikidata":"Q810773","brand:wikipedia":"en:Bath & Body Works",name:"Bath & Body Works",shop:"beauty"},removeTags:{brand:"Bath & Body Works","brand:wikidata":"Q810773","brand:wikipedia":"en:Bath & Body Works",name:"Bath & Body Works",shop:"beauty"},matchScore:2,suggestion:true},"shop/beauty/European Wax Center":{name:"European Wax Center",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beauty","brand:wikidata":"Q5413426"},addTags:{brand:"European Wax Center","brand:wikidata":"Q5413426","brand:wikipedia":"en:European Wax Center",name:"European Wax Center",shop:"beauty"},removeTags:{brand:"European Wax Center","brand:wikidata":"Q5413426","brand:wikipedia":"en:European Wax Center",name:"European Wax Center",shop:"beauty"},matchScore:2,suggestion:true},"shop/beauty/Ulta Beauty":{name:"Ulta Beauty",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beauty","brand:wikidata":"Q7880076"},addTags:{brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"Ulta Beauty",shop:"beauty"},removeTags:{brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"Ulta Beauty",shop:"beauty"},matchScore:2,suggestion:true},"shop/beauty/Yves Rocher":{name:"Yves Rocher",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beauty","brand:wikidata":"Q28496595"},addTags:{brand:"Yves Rocher","brand:wikidata":"Q28496595","brand:wikipedia":"fr:Yves Rocher (entreprise)",name:"Yves Rocher",shop:"beauty"},removeTags:{brand:"Yves Rocher","brand:wikidata":"Q28496595","brand:wikipedia":"fr:Yves Rocher (entreprise)",name:"Yves Rocher",shop:"beauty"},matchScore:2,suggestion:true},"shop/bed/Dreams":{name:"Dreams",icon:"maki-lodging",geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q5306688"},addTags:{brand:"Dreams","brand:wikidata":"Q5306688","brand:wikipedia":"en:Dreams (bed retailer)",name:"Dreams",shop:"bed"},removeTags:{brand:"Dreams","brand:wikidata":"Q5306688","brand:wikipedia":"en:Dreams (bed retailer)",name:"Dreams",shop:"bed"},matchScore:2,suggestion:true},"shop/bed/Matratzen Concord":{name:"Matratzen Concord",icon:"maki-lodging",geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q18629057"},addTags:{brand:"Matratzen Concord","brand:wikidata":"Q18629057","brand:wikipedia":"de:Matratzen Concord",name:"Matratzen Concord",shop:"bed"},removeTags:{brand:"Matratzen Concord","brand:wikidata":"Q18629057","brand:wikipedia":"de:Matratzen Concord",name:"Matratzen Concord",shop:"bed"},matchScore:2,suggestion:true},"shop/bed/Mattress Firm":{name:"Mattress Firm",icon:"maki-lodging",geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q6791878"},addTags:{brand:"Mattress Firm","brand:wikidata":"Q6791878","brand:wikipedia":"en:Mattress Firm",name:"Mattress Firm",shop:"bed"},removeTags:{brand:"Mattress Firm","brand:wikidata":"Q6791878","brand:wikipedia":"en:Mattress Firm",name:"Mattress Firm",shop:"bed"},matchScore:2,suggestion:true},"shop/bed/Sleep Number":{name:"Sleep Number",icon:"maki-lodging",geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q7447640"},addTags:{brand:"Sleep Number","brand:wikidata":"Q7447640","brand:wikipedia":"en:Sleep Number",name:"Sleep Number",shop:"bed"},removeTags:{brand:"Sleep Number","brand:wikidata":"Q7447640","brand:wikipedia":"en:Sleep Number",name:"Sleep Number",shop:"bed"},matchScore:2,suggestion:true},"shop/bed/Sleepy's":{name:"Sleepy's",icon:"maki-lodging",geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q17088336"},addTags:{brand:"Sleepy's","brand:wikidata":"Q17088336","brand:wikipedia":"en:Sleepy's",name:"Sleepy's",shop:"bed"},removeTags:{brand:"Sleepy's","brand:wikidata":"Q17088336","brand:wikipedia":"en:Sleepy's",name:"Sleepy's",shop:"bed"},matchScore:2,suggestion:true},"shop/beverages/Dursty":{name:"Dursty",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q1267518"},addTags:{brand:"Dursty","brand:wikidata":"Q1267518","brand:wikipedia":"de:Dursty Getränkemärkte",name:"Dursty",shop:"beverages"},removeTags:{brand:"Dursty","brand:wikidata":"Q1267518","brand:wikipedia":"de:Dursty Getränkemärkte",name:"Dursty",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Edeka Getränkemarkt":{name:"Edeka Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q57450576"},addTags:{brand:"Edeka Getränkemarkt","brand:wikidata":"Q57450576",name:"Edeka Getränkemarkt",shop:"beverages"},removeTags:{brand:"Edeka Getränkemarkt","brand:wikidata":"Q57450576",name:"Edeka Getränkemarkt",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Fristo":{name:"Fristo",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q1465151"},addTags:{brand:"Fristo","brand:wikidata":"Q1465151","brand:wikipedia":"de:Fristo",name:"Fristo",shop:"beverages"},removeTags:{brand:"Fristo","brand:wikidata":"Q1465151","brand:wikipedia":"de:Fristo",name:"Fristo",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Fristo Getränkemarkt":{name:"Fristo Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q1465151"},addTags:{brand:"Fristo Getränkemarkt","brand:wikidata":"Q1465151","brand:wikipedia":"de:Fristo",name:"Fristo Getränkemarkt",shop:"beverages"},removeTags:{brand:"Fristo Getränkemarkt","brand:wikidata":"Q1465151","brand:wikipedia":"de:Fristo",name:"Fristo Getränkemarkt",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Getränke Hoffmann":{name:"Getränke Hoffmann",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q19284021"},addTags:{brand:"Getränke Hoffmann","brand:wikidata":"Q19284021","brand:wikipedia":"de:Getränke Hoffmann",name:"Getränke Hoffmann",shop:"beverages"},removeTags:{brand:"Getränke Hoffmann","brand:wikidata":"Q19284021","brand:wikipedia":"de:Getränke Hoffmann",name:"Getränke Hoffmann",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Hol'ab":{name:"Hol'ab",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q57557270"},addTags:{brand:"Hol'ab","brand:wikidata":"Q57557270",name:"Hol'ab",shop:"beverages"},removeTags:{brand:"Hol'ab","brand:wikidata":"Q57557270",name:"Hol'ab",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Orterer Getränkemarkt":{name:"Orterer Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q23787118"},addTags:{brand:"Orterer Getränkemarkt","brand:wikidata":"Q23787118","brand:wikipedia":"de:Orterer Gruppe",name:"Orterer Getränkemarkt",shop:"beverages"},removeTags:{brand:"Orterer Getränkemarkt","brand:wikidata":"Q23787118","brand:wikipedia":"de:Orterer Gruppe",name:"Orterer Getränkemarkt",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Rewe Getränkemarkt":{name:"Rewe Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q57519344"},addTags:{brand:"Rewe Getränkemarkt","brand:wikidata":"Q57519344",name:"Rewe Getränkemarkt",shop:"beverages"},removeTags:{brand:"Rewe Getränkemarkt","brand:wikidata":"Q57519344",name:"Rewe Getränkemarkt",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Trinkgut":{name:"Trinkgut",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q2453627"},addTags:{brand:"Trinkgut","brand:wikidata":"Q2453627","brand:wikipedia":"de:Trinkgut",name:"Trinkgut",shop:"beverages"},removeTags:{brand:"Trinkgut","brand:wikidata":"Q2453627","brand:wikipedia":"de:Trinkgut",name:"Trinkgut",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/清心福全":{name:"清心福全",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q10391229"},addTags:{brand:"清心福全","brand:wikidata":"Q10391229","brand:wikipedia":"zh:清心福全冷飲站",name:"清心福全",shop:"beverages"},removeTags:{brand:"清心福全","brand:wikidata":"Q10391229","brand:wikipedia":"zh:清心福全冷飲站",name:"清心福全",shop:"beverages"},matchScore:2,suggestion:true},"shop/bicycle/Evans Cycles":{name:"Evans Cycles",icon:"maki-bicycle",geometry:["point","area"],tags:{shop:"bicycle","brand:wikidata":"Q5415901"},addTags:{brand:"Evans Cycles","brand:wikidata":"Q5415901","brand:wikipedia":"en:Evans Cycles",name:"Evans Cycles",shop:"bicycle"},removeTags:{brand:"Evans Cycles","brand:wikidata":"Q5415901","brand:wikipedia":"en:Evans Cycles",name:"Evans Cycles",shop:"bicycle"},matchScore:2,suggestion:true},"shop/bicycle/Fri BikeShop":{name:"Fri BikeShop",icon:"maki-bicycle",geometry:["point","area"],tags:{shop:"bicycle","brand:wikidata":"Q26721030"},addTags:{brand:"Fri BikeShop","brand:wikidata":"Q26721030",name:"Fri BikeShop",shop:"bicycle"},removeTags:{brand:"Fri BikeShop","brand:wikidata":"Q26721030",name:"Fri BikeShop",shop:"bicycle"},matchScore:2,suggestion:true},"shop/bicycle/サイクルベースあさひ":{name:"サイクルベースあさひ",icon:"maki-bicycle",geometry:["point","area"],tags:{shop:"bicycle","brand:wikidata":"Q11257202"},addTags:{brand:"サイクルベースあさひ","brand:wikidata":"Q11257202","brand:wikipedia":"ja:あさひ (企業)",name:"サイクルベースあさひ",shop:"bicycle"},removeTags:{brand:"サイクルベースあさひ","brand:wikidata":"Q11257202","brand:wikipedia":"ja:あさひ (企業)",name:"サイクルベースあさひ",shop:"bicycle"},matchScore:2,suggestion:true},"shop/bookmaker/Betfred":{name:"Betfred",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q4897425"},addTags:{brand:"Betfred","brand:wikidata":"Q4897425","brand:wikipedia":"en:Betfred",name:"Betfred",shop:"bookmaker"},removeTags:{brand:"Betfred","brand:wikidata":"Q4897425","brand:wikipedia":"en:Betfred",name:"Betfred",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Coral":{name:"Coral",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q54621344"},addTags:{brand:"Coral","brand:wikidata":"Q54621344","brand:wikipedia":"en:Coral (bookmaker)",name:"Coral",shop:"bookmaker"},removeTags:{brand:"Coral","brand:wikidata":"Q54621344","brand:wikipedia":"en:Coral (bookmaker)",name:"Coral",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Fortuna":{name:"Fortuna",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q25857973"},addTags:{brand:"Fortuna","brand:wikidata":"Q25857973","brand:wikipedia":"en:Fortuna Entertainment Group",name:"Fortuna",shop:"bookmaker"},removeTags:{brand:"Fortuna","brand:wikidata":"Q25857973","brand:wikipedia":"en:Fortuna Entertainment Group",name:"Fortuna",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Ladbrokes":{name:"Ladbrokes",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q1799875"},addTags:{brand:"Ladbrokes","brand:wikidata":"Q1799875","brand:wikipedia":"en:Ladbrokes Coral",name:"Ladbrokes",shop:"bookmaker"},removeTags:{brand:"Ladbrokes","brand:wikidata":"Q1799875","brand:wikipedia":"en:Ladbrokes Coral",name:"Ladbrokes",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Paddy Power":{name:"Paddy Power",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q3888718"},addTags:{brand:"Paddy Power","brand:wikidata":"Q3888718","brand:wikipedia":"en:Paddy Power",name:"Paddy Power",shop:"bookmaker"},removeTags:{brand:"Paddy Power","brand:wikidata":"Q3888718","brand:wikipedia":"en:Paddy Power",name:"Paddy Power",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Tipico":{name:"Tipico",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q15851003"},addTags:{brand:"Tipico","brand:wikidata":"Q15851003","brand:wikipedia":"en:Tipico",name:"Tipico",shop:"bookmaker"},removeTags:{brand:"Tipico","brand:wikidata":"Q15851003","brand:wikipedia":"en:Tipico",name:"Tipico",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/William Hill":{name:"William Hill",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q4053147"},addTags:{brand:"William Hill","brand:wikidata":"Q4053147","brand:wikipedia":"en:William Hill (bookmaker)",name:"William Hill",shop:"bookmaker"},removeTags:{brand:"William Hill","brand:wikidata":"Q4053147","brand:wikipedia":"en:William Hill (bookmaker)",name:"William Hill",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/ΟΠΑΠ":{name:"ΟΠΑΠ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q2007823"},addTags:{brand:"ΟΠΑΠ","brand:en":"OPAP","brand:wikidata":"Q2007823","brand:wikipedia":"en:OPAP",name:"ΟΠΑΠ","name:en":"OPAP",shop:"bookmaker"},removeTags:{brand:"ΟΠΑΠ","brand:en":"OPAP","brand:wikidata":"Q2007823","brand:wikipedia":"en:OPAP",name:"ΟΠΑΠ","name:en":"OPAP",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Фонбет":{name:"Фонбет",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q49137910"},addTags:{brand:"Фонбет","brand:wikidata":"Q49137910","brand:wikipedia":"ru:Фонбет",name:"Фонбет",shop:"bookmaker"},removeTags:{brand:"Фонбет","brand:wikidata":"Q49137910","brand:wikipedia":"ru:Фонбет",name:"Фонбет",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/books/Akademibokhandeln":{name:"Akademibokhandeln",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q10403918"},addTags:{brand:"Akademibokhandeln","brand:wikidata":"Q10403918","brand:wikipedia":"sv:Akademibokhandeln",name:"Akademibokhandeln",shop:"books"},removeTags:{brand:"Akademibokhandeln","brand:wikidata":"Q10403918","brand:wikipedia":"sv:Akademibokhandeln",name:"Akademibokhandeln",shop:"books"},matchScore:2,suggestion:true},"shop/books/Barnes & Noble":{name:"Barnes & Noble",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q795454"},addTags:{brand:"Barnes & Noble","brand:wikidata":"Q795454","brand:wikipedia":"en:Barnes & Noble",name:"Barnes & Noble",shop:"books"},removeTags:{brand:"Barnes & Noble","brand:wikidata":"Q795454","brand:wikipedia":"en:Barnes & Noble",name:"Barnes & Noble",shop:"books"},matchScore:2,suggestion:true},"shop/books/Bruna":{name:"Bruna",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q3317555"},addTags:{brand:"Bruna","brand:wikidata":"Q3317555","brand:wikipedia":"nl:Bruna (retail chain)",name:"Bruna",shop:"books"},removeTags:{brand:"Bruna","brand:wikidata":"Q3317555","brand:wikipedia":"nl:Bruna (retail chain)",name:"Bruna",shop:"books"},matchScore:2,suggestion:true},"shop/books/Chapters":{name:"Chapters",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q5073540"},addTags:{brand:"Chapters","brand:wikidata":"Q5073540","brand:wikipedia":"en:Chapters",name:"Chapters",shop:"books"},removeTags:{brand:"Chapters","brand:wikidata":"Q5073540","brand:wikipedia":"en:Chapters",name:"Chapters",shop:"books"},matchScore:2,suggestion:true},"shop/books/Empik":{name:"Empik",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q3045978"},addTags:{brand:"Empik","brand:wikidata":"Q3045978","brand:wikipedia":"en:Empik",name:"Empik",shop:"books"},removeTags:{brand:"Empik","brand:wikidata":"Q3045978","brand:wikipedia":"en:Empik",name:"Empik",shop:"books"},matchScore:2,suggestion:true},"shop/books/Fnac":{name:"Fnac",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q676585"},addTags:{brand:"Fnac","brand:wikidata":"Q676585","brand:wikipedia":"en:Fnac",name:"Fnac",shop:"books"},removeTags:{brand:"Fnac","brand:wikidata":"Q676585","brand:wikipedia":"en:Fnac",name:"Fnac",shop:"books"},matchScore:2,suggestion:true},"shop/books/Half Price Books":{name:"Half Price Books",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q5641744"},addTags:{brand:"Half Price Books","brand:wikidata":"Q5641744","brand:wikipedia":"en:Half Price Books",name:"Half Price Books",shop:"books"},removeTags:{brand:"Half Price Books","brand:wikidata":"Q5641744","brand:wikipedia":"en:Half Price Books",name:"Half Price Books",shop:"books"},matchScore:2,suggestion:true},"shop/books/Hugendubel":{name:"Hugendubel",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q1634142"},addTags:{brand:"Hugendubel","brand:wikidata":"Q1634142","brand:wikipedia":"en:Hugendubel",name:"Hugendubel",shop:"books"},removeTags:{brand:"Hugendubel","brand:wikidata":"Q1634142","brand:wikipedia":"en:Hugendubel",name:"Hugendubel",shop:"books"},matchScore:2,suggestion:true},"shop/books/National Book Store":{name:"National Book Store",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q6971094"},addTags:{brand:"National Book Store","brand:wikidata":"Q6971094","brand:wikipedia":"en:National Book Store",name:"National Book Store",shop:"books"},removeTags:{brand:"National Book Store","brand:wikidata":"Q6971094","brand:wikipedia":"en:National Book Store",name:"National Book Store",shop:"books"},matchScore:2,suggestion:true},"shop/books/Standaard Boekhandel":{name:"Standaard Boekhandel",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q3496554"},addTags:{brand:"Standaard Boekhandel","brand:wikidata":"Q3496554","brand:wikipedia":"nl:Standaard Boekhandel",name:"Standaard Boekhandel",shop:"books"},removeTags:{brand:"Standaard Boekhandel","brand:wikidata":"Q3496554","brand:wikipedia":"nl:Standaard Boekhandel",name:"Standaard Boekhandel",shop:"books"},matchScore:2,suggestion:true},"shop/books/TSUTAYA":{name:"TSUTAYA",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q5193457"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"books"},removeTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"books"},matchScore:2,suggestion:true},"shop/books/Thalia":{name:"Thalia",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q2408854"},addTags:{brand:"Thalia","brand:wikidata":"Q2408854","brand:wikipedia":"de:Thalia Bücher",name:"Thalia",shop:"books"},removeTags:{brand:"Thalia","brand:wikidata":"Q2408854","brand:wikipedia":"de:Thalia Bücher",name:"Thalia",shop:"books"},matchScore:2,suggestion:true},"shop/books/The Works":{name:"The Works",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q7775853"},addTags:{brand:"The Works","brand:wikidata":"Q7775853","brand:wikipedia":"en:The Works (retailer)",name:"The Works",shop:"books"},removeTags:{brand:"The Works","brand:wikidata":"Q7775853","brand:wikipedia":"en:The Works (retailer)",name:"The Works",shop:"books"},matchScore:2,suggestion:true},"shop/books/Waterstones":{name:"Waterstones",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q151779"},addTags:{brand:"Waterstones","brand:wikidata":"Q151779","brand:wikipedia":"en:Waterstones",name:"Waterstones",shop:"books"},removeTags:{brand:"Waterstones","brand:wikidata":"Q151779","brand:wikipedia":"en:Waterstones",name:"Waterstones",shop:"books"},matchScore:2,suggestion:true},"shop/books/Weltbild":{name:"Weltbild",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q883522"},addTags:{brand:"Weltbild","brand:wikidata":"Q883522","brand:wikipedia":"en:Weltbild Publishing Group",name:"Weltbild",shop:"books"},removeTags:{brand:"Weltbild","brand:wikidata":"Q883522","brand:wikipedia":"en:Weltbild Publishing Group",name:"Weltbild",shop:"books"},matchScore:2,suggestion:true},"shop/books/Буквоед":{name:"Буквоед",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q4098549"},addTags:{brand:"Буквоед","brand:wikidata":"Q4098549","brand:wikipedia":"ru:Буквоед",name:"Буквоед",shop:"books"},removeTags:{brand:"Буквоед","brand:wikidata":"Q4098549","brand:wikipedia":"ru:Буквоед",name:"Буквоед",shop:"books"},matchScore:2,suggestion:true},"shop/books/Читай-город":{name:"Читай-город",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q4516645"},addTags:{brand:"Читай-город","brand:wikidata":"Q4516645","brand:wikipedia":"ru:Читай-город",name:"Читай-город",shop:"books"},removeTags:{brand:"Читай-город","brand:wikidata":"Q4516645","brand:wikipedia":"ru:Читай-город",name:"Читай-город",shop:"books"},matchScore:2,suggestion:true},"shop/books/ブックオフ":{name:"ブックオフ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q893011"},addTags:{brand:"ブックオフ","brand:en":"Book Off","brand:wikidata":"Q893011","brand:wikipedia":"en:Book Off",name:"ブックオフ","name:en":"Book Off",shop:"books"},removeTags:{brand:"ブックオフ","brand:en":"Book Off","brand:wikidata":"Q893011","brand:wikipedia":"en:Book Off",name:"ブックオフ","name:en":"Book Off",shop:"books"},matchScore:2,suggestion:true},"shop/books/新华书店":{name:"新华书店",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q6124193"},addTags:{brand:"新华书店","brand:en":"Xinhua Bookstore","brand:wikidata":"Q6124193","brand:wikipedia":"en:Xinhua Bookstore",name:"新华书店","name:en":"Xinhua Bookstore",shop:"books"},removeTags:{brand:"新华书店","brand:en":"Xinhua Bookstore","brand:wikidata":"Q6124193","brand:wikipedia":"en:Xinhua Bookstore",name:"新华书店","name:en":"Xinhua Bookstore",shop:"books"},matchScore:2,suggestion:true},"shop/butcher/Coqivoire":{name:"Coqivoire",icon:"fas-bacon",geometry:["point","area"],tags:{shop:"butcher","brand:wikidata":"Q60183284"},addTags:{brand:"Coqivoire","brand:wikidata":"Q60183284",butcher:"poultry",name:"Coqivoire",shop:"butcher"},removeTags:{brand:"Coqivoire","brand:wikidata":"Q60183284",butcher:"poultry",name:"Coqivoire",shop:"butcher"},matchScore:2,suggestion:true},"shop/butcher/Foani":{name:"Foani",icon:"fas-bacon",geometry:["point","area"],tags:{shop:"butcher","brand:wikidata":"Q60183335"},addTags:{brand:"Foani","brand:wikidata":"Q60183335",butcher:"poultry",name:"Foani",shop:"butcher"},removeTags:{brand:"Foani","brand:wikidata":"Q60183335",butcher:"poultry",name:"Foani",shop:"butcher"},matchScore:2,suggestion:true},"shop/butcher/Vinzenzmurr":{name:"Vinzenzmurr",icon:"fas-bacon",geometry:["point","area"],tags:{shop:"butcher","brand:wikidata":"Q2527361"},addTags:{brand:"Vinzenzmurr","brand:wikidata":"Q2527361","brand:wikipedia":"de:Vinzenzmurr",name:"Vinzenzmurr",shop:"butcher"},removeTags:{brand:"Vinzenzmurr","brand:wikidata":"Q2527361","brand:wikipedia":"de:Vinzenzmurr",name:"Vinzenzmurr",shop:"butcher"},matchScore:2,suggestion:true},"shop/butcher/Великолукский мясокомбинат":{name:"Великолукский мясокомбинат",icon:"fas-bacon",geometry:["point","area"],tags:{shop:"butcher","brand:wikidata":"Q18401767"},addTags:{brand:"Великолукский мясокомбинат","brand:wikidata":"Q18401767","brand:wikipedia":"ru:Великолукский мясокомбинат",name:"Великолукский мясокомбинат",shop:"butcher"},removeTags:{brand:"Великолукский мясокомбинат","brand:wikidata":"Q18401767","brand:wikipedia":"ru:Великолукский мясокомбинат",name:"Великолукский мясокомбинат",shop:"butcher"},matchScore:2,suggestion:true},"shop/butcher/Родинна ковбаска":{name:"Родинна ковбаска",icon:"fas-bacon",geometry:["point","area"],tags:{shop:"butcher","brand:wikidata":"Q30969660"},addTags:{brand:"Родинна ковбаска","brand:en":"Rodynna-kovbaska","brand:wikidata":"Q30969660","brand:wikipedia":"uk:ТзОВ «Барком»",name:"Родинна ковбаска","name:en":"Rodynna-kovbaska",shop:"butcher"},removeTags:{brand:"Родинна ковбаска","brand:en":"Rodynna-kovbaska","brand:wikidata":"Q30969660","brand:wikipedia":"uk:ТзОВ «Барком»",name:"Родинна ковбаска","name:en":"Rodynna-kovbaska",shop:"butcher"},matchScore:2,suggestion:true},"shop/car_parts/Advance Auto Parts":{name:"Advance Auto Parts",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q4686051"},addTags:{brand:"Advance Auto Parts","brand:wikidata":"Q4686051","brand:wikipedia":"en:Advance Auto Parts",name:"Advance Auto Parts",shop:"car_parts"},removeTags:{brand:"Advance Auto Parts","brand:wikidata":"Q4686051","brand:wikipedia":"en:Advance Auto Parts",name:"Advance Auto Parts",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/AutoZone":{name:"AutoZone",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q4826087"},addTags:{brand:"AutoZone","brand:wikidata":"Q4826087","brand:wikipedia":"en:AutoZone",name:"AutoZone",shop:"car_parts"},removeTags:{brand:"AutoZone","brand:wikidata":"Q4826087","brand:wikipedia":"en:AutoZone",name:"AutoZone",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/Halfords":{name:"Halfords",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q3398786"},addTags:{brand:"Halfords","brand:wikidata":"Q3398786","brand:wikipedia":"en:Halfords",name:"Halfords","service:bicycle:retail":"yes",shop:"car_parts"},removeTags:{brand:"Halfords","brand:wikidata":"Q3398786","brand:wikipedia":"en:Halfords",name:"Halfords","service:bicycle:retail":"yes",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/NAPA Auto Parts":{name:"NAPA Auto Parts",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q6970842"},addTags:{brand:"NAPA Auto Parts","brand:wikidata":"Q6970842","brand:wikipedia":"en:National Automotive Parts Association",name:"NAPA Auto Parts",shop:"car_parts"},removeTags:{brand:"NAPA Auto Parts","brand:wikidata":"Q6970842","brand:wikipedia":"en:National Automotive Parts Association",name:"NAPA Auto Parts",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/O'Reilly Auto Parts":{name:"O'Reilly Auto Parts",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q7071951"},addTags:{brand:"O'Reilly Auto Parts","brand:wikidata":"Q7071951","brand:wikipedia":"en:O'Reilly Auto Parts",name:"O'Reilly Auto Parts",shop:"car_parts"},removeTags:{brand:"O'Reilly Auto Parts","brand:wikidata":"Q7071951","brand:wikipedia":"en:O'Reilly Auto Parts",name:"O'Reilly Auto Parts",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/Repco":{name:"Repco",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q173425"},addTags:{brand:"Repco","brand:wikidata":"Q173425","brand:wikipedia":"en:Repco",name:"Repco",shop:"car_parts"},removeTags:{brand:"Repco","brand:wikidata":"Q173425","brand:wikipedia":"en:Repco",name:"Repco",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/Supercheap Auto":{name:"Supercheap Auto",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q7643119"},addTags:{brand:"Supercheap Auto","brand:wikidata":"Q7643119","brand:wikipedia":"en:Supercheap Auto",name:"Supercheap Auto",shop:"car_parts"},removeTags:{brand:"Supercheap Auto","brand:wikidata":"Q7643119","brand:wikipedia":"en:Supercheap Auto",name:"Supercheap Auto",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/Автомир":{name:"Автомир",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q4056321"},addTags:{brand:"Автомир","brand:wikidata":"Q4056321","brand:wikipedia":"ru:Автомир (автодилер)",name:"Автомир",shop:"car_parts"},removeTags:{brand:"Автомир","brand:wikidata":"Q4056321","brand:wikipedia":"ru:Автомир (автодилер)",name:"Автомир",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/イエローハット":{name:"イエローハット",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q11285915"},addTags:{brand:"イエローハット","brand:wikidata":"Q11285915","brand:wikipedia":"ja:イエローハット",name:"イエローハット",shop:"car_parts"},removeTags:{brand:"イエローハット","brand:wikidata":"Q11285915","brand:wikipedia":"ja:イエローハット",name:"イエローハット",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/オートバックス":{name:"オートバックス",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q7886426"},addTags:{brand:"オートバックス","brand:wikidata":"Q7886426","brand:wikipedia":"ja:オートバックスセブン",name:"オートバックス",shop:"car_parts"},removeTags:{brand:"オートバックス","brand:wikidata":"Q7886426","brand:wikipedia":"ja:オートバックスセブン",name:"オートバックス",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/タイヤ館":{name:"タイヤ館",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q11315808"},addTags:{brand:"タイヤ館","brand:wikidata":"Q11315808","brand:wikipedia":"ja:タイヤ館",name:"タイヤ館",shop:"car_parts"},removeTags:{brand:"タイヤ館","brand:wikidata":"Q11315808","brand:wikipedia":"ja:タイヤ館",name:"タイヤ館",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_repair/A.T.U":{name:"A.T.U",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q784721"},addTags:{brand:"A.T.U","brand:wikidata":"Q784721","brand:wikipedia":"de:Auto-Teile-Unger",name:"A.T.U",shop:"car_repair"},removeTags:{brand:"A.T.U","brand:wikidata":"Q784721","brand:wikipedia":"de:Auto-Teile-Unger",name:"A.T.U",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/ATS Euromaster":{name:"ATS Euromaster",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q4654920"},addTags:{brand:"ATS Euromaster","brand:wikidata":"Q4654920","brand:wikipedia":"en:ATS Euromaster",name:"ATS Euromaster",shop:"car_repair"},removeTags:{brand:"ATS Euromaster","brand:wikidata":"Q4654920","brand:wikipedia":"en:ATS Euromaster",name:"ATS Euromaster",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Bosch Car Service":{name:"Bosch Car Service",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q234021"},addTags:{brand:"Bosch Car Service","brand:wikidata":"Q234021","brand:wikipedia":"de:Robert Bosch GmbH",name:"Bosch Car Service",shop:"car_repair"},removeTags:{brand:"Bosch Car Service","brand:wikidata":"Q234021","brand:wikipedia":"de:Robert Bosch GmbH",name:"Bosch Car Service",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Carglass":{name:"Carglass",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q1035997"},addTags:{brand:"Carglass","brand:wikidata":"Q1035997","brand:wikipedia":"de:Carglass",name:"Carglass",shop:"car_repair"},removeTags:{brand:"Carglass","brand:wikidata":"Q1035997","brand:wikipedia":"de:Carglass",name:"Carglass",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Feu Vert":{name:"Feu Vert",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3070922"},addTags:{brand:"Feu Vert","brand:wikidata":"Q3070922","brand:wikipedia":"fr:Feu Vert (entreprise)",name:"Feu Vert",shop:"car_repair"},removeTags:{brand:"Feu Vert","brand:wikidata":"Q3070922","brand:wikipedia":"fr:Feu Vert (entreprise)",name:"Feu Vert",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Firestone":{name:"Firestone",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q420837"},addTags:{brand:"Firestone","brand:wikidata":"Q420837","brand:wikipedia":"en:Firestone Tire and Rubber Company",name:"Firestone",shop:"car_repair"},removeTags:{brand:"Firestone","brand:wikidata":"Q420837","brand:wikipedia":"en:Firestone Tire and Rubber Company",name:"Firestone",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Ford":{name:"Ford",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q44294"},addTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car_repair"},removeTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Goodyear":{name:"Goodyear",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q620875"},addTags:{brand:"Goodyear","brand:wikidata":"Q620875","brand:wikipedia":"en:Goodyear Tire and Rubber Company",name:"Goodyear",shop:"car_repair"},removeTags:{brand:"Goodyear","brand:wikidata":"Q620875","brand:wikipedia":"en:Goodyear Tire and Rubber Company",name:"Goodyear",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Grease Monkey":{name:"Grease Monkey",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q5598563"},addTags:{brand:"Grease Monkey","brand:wikidata":"Q5598563","brand:wikipedia":"en:Grease Monkey (business)",name:"Grease Monkey",shop:"car_repair"},removeTags:{brand:"Grease Monkey","brand:wikidata":"Q5598563","brand:wikipedia":"en:Grease Monkey (business)",name:"Grease Monkey",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Halfords Autocentre":{name:"Halfords Autocentre",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q5641894"},addTags:{brand:"Halfords Auocentre","brand:wikidata":"Q5641894","brand:wikipedia":"en:Halfords Autocentre",name:"Halfords Autocentre",shop:"car_repair"},removeTags:{brand:"Halfords Auocentre","brand:wikidata":"Q5641894","brand:wikipedia":"en:Halfords Autocentre",name:"Halfords Autocentre",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Jiffy Lube":{name:"Jiffy Lube",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q6192247"},addTags:{brand:"Jiffy Lube","brand:wikidata":"Q6192247","brand:wikipedia":"en:Jiffy Lube",name:"Jiffy Lube",shop:"car_repair"},removeTags:{brand:"Jiffy Lube","brand:wikidata":"Q6192247","brand:wikipedia":"en:Jiffy Lube",name:"Jiffy Lube",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Kwik Fit":{name:"Kwik Fit",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q958053"},addTags:{brand:"Kwik Fit","brand:wikidata":"Q958053","brand:wikipedia":"en:Kwik Fit",name:"Kwik Fit",shop:"car_repair"},removeTags:{brand:"Kwik Fit","brand:wikidata":"Q958053","brand:wikipedia":"en:Kwik Fit",name:"Kwik Fit",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Meineke":{name:"Meineke",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q6810159"},addTags:{brand:"Meineke","brand:wikidata":"Q6810159","brand:wikipedia":"en:Meineke Car Care Centers",name:"Meineke",shop:"car_repair"},removeTags:{brand:"Meineke","brand:wikidata":"Q6810159","brand:wikipedia":"en:Meineke Car Care Centers",name:"Meineke",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Mekonomen":{name:"Mekonomen",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q10580079"},addTags:{brand:"Mekonomen","brand:wikidata":"Q10580079","brand:wikipedia":"sv:Mekonomen",name:"Mekonomen",shop:"car_repair"},removeTags:{brand:"Mekonomen","brand:wikidata":"Q10580079","brand:wikipedia":"sv:Mekonomen",name:"Mekonomen",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Midas":{name:"Midas",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3312613"},addTags:{brand:"Midas","brand:wikidata":"Q3312613","brand:wikipedia":"en:Midas (automotive service)",name:"Midas",shop:"car_repair"},removeTags:{brand:"Midas","brand:wikidata":"Q3312613","brand:wikipedia":"en:Midas (automotive service)",name:"Midas",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Mr. Lube":{name:"Mr. Lube",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q17104067"},addTags:{brand:"Mr. Lube","brand:wikidata":"Q17104067","brand:wikipedia":"en:Mr. Lube",name:"Mr. Lube",shop:"car_repair"},removeTags:{brand:"Mr. Lube","brand:wikidata":"Q17104067","brand:wikipedia":"en:Mr. Lube",name:"Mr. Lube",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Norauto":{name:"Norauto",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3317698"},addTags:{brand:"Norauto","brand:wikidata":"Q3317698","brand:wikipedia":"en:Mobivia Groupe",name:"Norauto",shop:"car_repair"},removeTags:{brand:"Norauto","brand:wikidata":"Q3317698","brand:wikipedia":"en:Mobivia Groupe",name:"Norauto",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Pep Boys":{name:"Pep Boys",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3375007"},addTags:{brand:"Pep Boys","brand:wikidata":"Q3375007","brand:wikipedia":"en:Pep Boys",name:"Pep Boys",shop:"car_repair"},removeTags:{brand:"Pep Boys","brand:wikidata":"Q3375007","brand:wikipedia":"en:Pep Boys",name:"Pep Boys",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Peugeot":{name:"Peugeot",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q6742"},addTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car_repair"},removeTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Point S":{name:"Point S",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3393358"},addTags:{brand:"Point S","brand:wikidata":"Q3393358","brand:wikipedia":"fr:Point S",name:"Point S",shop:"car_repair"},removeTags:{brand:"Point S","brand:wikidata":"Q3393358","brand:wikipedia":"fr:Point S",name:"Point S",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Renault":{name:"Renault",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q6686"},addTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car_repair"},removeTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Roady":{name:"Roady",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3434112"},addTags:{brand:"Roady","brand:wikidata":"Q3434112","brand:wikipedia":"en:Roady (Mousquetaires)",name:"Roady",shop:"car_repair"},removeTags:{brand:"Roady","brand:wikidata":"Q3434112","brand:wikipedia":"en:Roady (Mousquetaires)",name:"Roady",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Safelite AutoGlass":{name:"Safelite AutoGlass",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q28797369"},addTags:{brand:"Safelite AutoGlass","brand:wikidata":"Q28797369","brand:wikipedia":"en:Safelite",operator:"Belron","operator:wikidata":"Q785614","operator:wikipedia":"en:Belron",name:"Safelite AutoGlass",shop:"car_repair"},removeTags:{brand:"Safelite AutoGlass","brand:wikidata":"Q28797369","brand:wikipedia":"en:Safelite",operator:"Belron","operator:wikidata":"Q785614","operator:wikipedia":"en:Belron",name:"Safelite AutoGlass",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Toyota":{name:"Toyota",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q53268"},addTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car_repair"},removeTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Valvoline":{name:"Valvoline",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q7912852"},addTags:{brand:"Valvoline","brand:wikidata":"Q7912852","brand:wikipedia":"en:Valvoline Instant Oil Change",name:"Valvoline",shop:"car_repair"},removeTags:{brand:"Valvoline","brand:wikidata":"Q7912852","brand:wikipedia":"en:Valvoline Instant Oil Change",name:"Valvoline",shop:"car_repair"},matchScore:2,suggestion:true},"shop/carpet/Carpetright":{name:"Carpetright",icon:"maki-shop",geometry:["point","area"],tags:{shop:"carpet","brand:wikidata":"Q5045782"},addTags:{brand:"Carpetright","brand:wikidata":"Q5045782","brand:wikipedia":"en:Carpetright",name:"Carpetright",shop:"carpet"},removeTags:{brand:"Carpetright","brand:wikidata":"Q5045782","brand:wikipedia":"en:Carpetright",name:"Carpetright",shop:"carpet"},matchScore:2,suggestion:true},"shop/car/Audi":{name:"Audi",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q23317"},addTags:{brand:"Audi","brand:wikidata":"Q23317","brand:wikipedia":"en:Audi",name:"Audi",shop:"car"},removeTags:{brand:"Audi","brand:wikidata":"Q23317","brand:wikipedia":"en:Audi",name:"Audi",shop:"car"},matchScore:2,suggestion:true},"shop/car/BMW":{name:"BMW",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q26678"},addTags:{brand:"BMW","brand:wikidata":"Q26678","brand:wikipedia":"en:BMW",name:"BMW",shop:"car"},removeTags:{brand:"BMW","brand:wikidata":"Q26678","brand:wikipedia":"en:BMW",name:"BMW",shop:"car"},matchScore:2,suggestion:true},"shop/car/Chevrolet":{name:"Chevrolet",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q29570"},addTags:{brand:"Chevrolet","brand:wikidata":"Q29570","brand:wikipedia":"en:Chevrolet",name:"Chevrolet",shop:"car"},removeTags:{brand:"Chevrolet","brand:wikidata":"Q29570","brand:wikipedia":"en:Chevrolet",name:"Chevrolet",shop:"car"},matchScore:2,suggestion:true},"shop/car/Dacia":{name:"Dacia",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q27460"},addTags:{brand:"Dacia","brand:wikidata":"Q27460","brand:wikipedia":"en:Automobile Dacia",name:"Dacia",shop:"car"},removeTags:{brand:"Dacia","brand:wikidata":"Q27460","brand:wikipedia":"en:Automobile Dacia",name:"Dacia",shop:"car"},matchScore:2,suggestion:true},"shop/car/Fiat":{name:"Fiat",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q27597"},addTags:{brand:"Fiat","brand:wikidata":"Q27597","brand:wikipedia":"en:Fiat Automobiles",name:"Fiat",shop:"car"},removeTags:{brand:"Fiat","brand:wikidata":"Q27597","brand:wikipedia":"en:Fiat Automobiles",name:"Fiat",shop:"car"},matchScore:2,suggestion:true},"shop/car/Ford":{name:"Ford",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q44294"},addTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car"},removeTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car"},matchScore:2,suggestion:true},"shop/car/Honda":{name:"Honda",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q9584"},addTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"car"},removeTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"car"},matchScore:2,suggestion:true},"shop/car/Hyundai":{name:"Hyundai",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q55931"},addTags:{brand:"Hyundai","brand:wikidata":"Q55931","brand:wikipedia":"en:Hyundai Motor Company",name:"Hyundai",shop:"car"},removeTags:{brand:"Hyundai","brand:wikidata":"Q55931","brand:wikipedia":"en:Hyundai Motor Company",name:"Hyundai",shop:"car"},matchScore:2,suggestion:true},"shop/car/Isuzu":{name:"Isuzu",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q29803"},addTags:{brand:"Isuzu","brand:wikidata":"Q29803","brand:wikipedia":"en:Isuzu Motors",name:"Isuzu",shop:"car"},removeTags:{brand:"Isuzu","brand:wikidata":"Q29803","brand:wikipedia":"en:Isuzu Motors",name:"Isuzu",shop:"car"},matchScore:2,suggestion:true},"shop/car/Kia":{name:"Kia",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q35349"},addTags:{brand:"Kia","brand:wikidata":"Q35349","brand:wikipedia":"en:Kia Motors",name:"Kia",shop:"car"},removeTags:{brand:"Kia","brand:wikidata":"Q35349","brand:wikipedia":"en:Kia Motors",name:"Kia",shop:"car"},matchScore:2,suggestion:true},"shop/car/Land Rover":{name:"Land Rover",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q35907"},addTags:{brand:"Land Rover","brand:wikidata":"Q35907","brand:wikipedia":"en:Land Rover",name:"Land Rover",shop:"car"},removeTags:{brand:"Land Rover","brand:wikidata":"Q35907","brand:wikipedia":"en:Land Rover",name:"Land Rover",shop:"car"},matchScore:2,suggestion:true},"shop/car/Lexus":{name:"Lexus",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q35919"},addTags:{brand:"Lexus","brand:wikidata":"Q35919","brand:wikipedia":"en:Lexus",name:"Lexus",shop:"car"},removeTags:{brand:"Lexus","brand:wikidata":"Q35919","brand:wikipedia":"en:Lexus",name:"Lexus",shop:"car"},matchScore:2,suggestion:true},"shop/car/Mazda":{name:"Mazda",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q35996"},addTags:{brand:"Mazda","brand:wikidata":"Q35996","brand:wikipedia":"en:Mazda",name:"Mazda",shop:"car"},removeTags:{brand:"Mazda","brand:wikidata":"Q35996","brand:wikipedia":"en:Mazda",name:"Mazda",shop:"car"},matchScore:2,suggestion:true},"shop/car/Mercedes-Benz":{name:"Mercedes-Benz",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q36008"},addTags:{brand:"Mercedes-Benz","brand:wikidata":"Q36008","brand:wikipedia":"en:Mercedes-Benz",name:"Mercedes-Benz",shop:"car"},removeTags:{brand:"Mercedes-Benz","brand:wikidata":"Q36008","brand:wikipedia":"en:Mercedes-Benz",name:"Mercedes-Benz",shop:"car"},matchScore:2,suggestion:true},"shop/car/Mitsubishi":{name:"Mitsubishi",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q36033"},addTags:{brand:"Mitsubishi","brand:wikidata":"Q36033","brand:wikipedia":"en:Mitsubishi Motors",name:"Mitsubishi",shop:"car"},removeTags:{brand:"Mitsubishi","brand:wikidata":"Q36033","brand:wikipedia":"en:Mitsubishi Motors",name:"Mitsubishi",shop:"car"},matchScore:2,suggestion:true},"shop/car/Netz":{name:"Netz",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q11325416"},addTags:{brand:"Netz","brand:wikidata":"Q11325416","brand:wikipedia":"ja:ネッツ店",name:"Netz",shop:"car"},removeTags:{brand:"Netz","brand:wikidata":"Q11325416","brand:wikipedia":"ja:ネッツ店",name:"Netz",shop:"car"},matchScore:2,suggestion:true},"shop/car/Nissan":{name:"Nissan",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q20165"},addTags:{brand:"Nissan","brand:wikidata":"Q20165","brand:wikipedia":"ja:日産自動車",name:"Nissan",shop:"car"},removeTags:{brand:"Nissan","brand:wikidata":"Q20165","brand:wikipedia":"ja:日産自動車",name:"Nissan",shop:"car"},matchScore:2,suggestion:true},"shop/car/Opel":{name:"Opel",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q40966"},addTags:{brand:"Opel","brand:wikidata":"Q40966","brand:wikipedia":"en:Opel",name:"Opel",shop:"car"},removeTags:{brand:"Opel","brand:wikidata":"Q40966","brand:wikipedia":"en:Opel",name:"Opel",shop:"car"},matchScore:2,suggestion:true},"shop/car/Peugeot":{name:"Peugeot",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q6742"},addTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car"},removeTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car"},matchScore:2,suggestion:true},"shop/car/Porsche":{name:"Porsche",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q40993"},addTags:{brand:"Porsche","brand:wikidata":"Q40993","brand:wikipedia":"en:Porsche",name:"Porsche",shop:"car"},removeTags:{brand:"Porsche","brand:wikidata":"Q40993","brand:wikipedia":"en:Porsche",name:"Porsche",shop:"car"},matchScore:2,suggestion:true},"shop/car/Renault":{name:"Renault",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q6686"},addTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car"},removeTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car"},matchScore:2,suggestion:true},"shop/car/Seat":{name:"Seat",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q188217"},addTags:{brand:"Seat","brand:wikidata":"Q188217","brand:wikipedia":"en:SEAT",name:"Seat",shop:"car"},removeTags:{brand:"Seat","brand:wikidata":"Q188217","brand:wikipedia":"en:SEAT",name:"Seat",shop:"car"},matchScore:2,suggestion:true},"shop/car/Skoda":{name:"Skoda",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q29637"},addTags:{brand:"Skoda","brand:wikidata":"Q29637","brand:wikipedia":"en:Škoda Auto",name:"Skoda",shop:"car"},removeTags:{brand:"Skoda","brand:wikidata":"Q29637","brand:wikipedia":"en:Škoda Auto",name:"Skoda",shop:"car"},matchScore:2,suggestion:true},"shop/car/Subaru":{name:"Subaru",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q172741"},addTags:{brand:"Subaru","brand:wikidata":"Q172741","brand:wikipedia":"en:Subaru",name:"Subaru",shop:"car"},removeTags:{brand:"Subaru","brand:wikidata":"Q172741","brand:wikipedia":"en:Subaru",name:"Subaru",shop:"car"},matchScore:2,suggestion:true},"shop/car/Suzuki":{name:"Suzuki",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q181642"},addTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"car"},removeTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"car"},matchScore:2,suggestion:true},"shop/car/Tesla":{name:"Tesla",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q478214"},addTags:{brand:"Tesla","brand:wikidata":"Q478214","brand:wikipedia":"en:Tesla, Inc.",name:"Tesla",shop:"car"},removeTags:{brand:"Tesla","brand:wikidata":"Q478214","brand:wikipedia":"en:Tesla, Inc.",name:"Tesla",shop:"car"},matchScore:2,suggestion:true},"shop/car/Toyota":{name:"Toyota",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q53268"},addTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car"},removeTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car"},matchScore:2,suggestion:true},"shop/car/Volkswagen":{name:"Volkswagen",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q246"},addTags:{brand:"Volkswagen","brand:wikidata":"Q246","brand:wikipedia":"en:Volkswagen",name:"Volkswagen",shop:"car"},removeTags:{brand:"Volkswagen","brand:wikidata":"Q246","brand:wikipedia":"en:Volkswagen",name:"Volkswagen",shop:"car"},matchScore:2,suggestion:true},"shop/car/Volvo":{name:"Volvo",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q215293"},addTags:{brand:"Volvo","brand:wikidata":"Q215293","brand:wikipedia":"en:Volvo Cars",name:"Volvo",shop:"car"},removeTags:{brand:"Volvo","brand:wikidata":"Q215293","brand:wikipedia":"en:Volvo Cars",name:"Volvo",shop:"car"},matchScore:2,suggestion:true},"shop/car/ホンダ":{name:"ホンダ",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q9584"},addTags:{brand:"ホンダ","brand:en":"Honda","brand:wikidata":"Q9584","brand:wikipedia":"ja:本田技研工業",name:"ホンダ","name:en":"Honda",shop:"car"},removeTags:{brand:"ホンダ","brand:en":"Honda","brand:wikidata":"Q9584","brand:wikipedia":"ja:本田技研工業",name:"ホンダ","name:en":"Honda",shop:"car"},matchScore:2,suggestion:true},"shop/catalogue/Argos":{name:"Argos",icon:"maki-shop",geometry:["point","area"],tags:{shop:"catalogue","brand:wikidata":"Q4789707"},addTags:{brand:"Argos","brand:wikidata":"Q4789707","brand:wikipedia":"en:Argos (retailer)",name:"Argos",shop:"catalogue"},removeTags:{brand:"Argos","brand:wikidata":"Q4789707","brand:wikipedia":"en:Argos (retailer)",name:"Argos",shop:"catalogue"},matchScore:2,suggestion:true},"shop/charity/Age UK":{name:"Age UK",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q4691850"},addTags:{brand:"Age UK","brand:wikidata":"Q4691850","brand:wikipedia":"en:Age UK",name:"Age UK",shop:"charity"},removeTags:{brand:"Age UK","brand:wikidata":"Q4691850","brand:wikipedia":"en:Age UK",name:"Age UK",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Barnardo's":{name:"Barnardo's",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q2884670"},addTags:{brand:"Barnardo's","brand:wikidata":"Q2884670","brand:wikipedia":"en:Barnardo's",name:"Barnardo's",shop:"charity"},removeTags:{brand:"Barnardo's","brand:wikidata":"Q2884670","brand:wikipedia":"en:Barnardo's",name:"Barnardo's",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/British Heart Foundation":{name:"British Heart Foundation",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q4970039"},addTags:{brand:"British Heart Foundation","brand:wikidata":"Q4970039","brand:wikipedia":"en:British Heart Foundation",name:"British Heart Foundation",shop:"charity"},removeTags:{brand:"British Heart Foundation","brand:wikidata":"Q4970039","brand:wikipedia":"en:British Heart Foundation",name:"British Heart Foundation",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/British Red Cross":{name:"British Red Cross",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q4970966"},addTags:{brand:"British Red Cross","brand:wikidata":"Q4970966","brand:wikipedia":"en:British Red Cross",name:"British Red Cross",shop:"charity"},removeTags:{brand:"British Red Cross","brand:wikidata":"Q4970966","brand:wikipedia":"en:British Red Cross",name:"British Red Cross",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Cancer Research UK":{name:"Cancer Research UK",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q326079"},addTags:{brand:"Cancer Research UK","brand:wikidata":"Q326079","brand:wikipedia":"en:Cancer Research UK",name:"Cancer Research UK",shop:"charity"},removeTags:{brand:"Cancer Research UK","brand:wikidata":"Q326079","brand:wikipedia":"en:Cancer Research UK",name:"Cancer Research UK",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Goodwill":{name:"Goodwill",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q5583655"},addTags:{brand:"Goodwill","brand:wikidata":"Q5583655","brand:wikipedia":"en:Goodwill Industries",name:"Goodwill",shop:"charity"},removeTags:{brand:"Goodwill","brand:wikidata":"Q5583655","brand:wikipedia":"en:Goodwill Industries",name:"Goodwill",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Mind":{name:"Mind",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q3314763"},addTags:{brand:"Mind","brand:wikidata":"Q3314763","brand:wikipedia":"en:Mind (charity)",name:"Mind",shop:"charity"},removeTags:{brand:"Mind","brand:wikidata":"Q3314763","brand:wikipedia":"en:Mind (charity)",name:"Mind",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Myrorna":{name:"Myrorna",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q10592609"},addTags:{brand:"Myrorna","brand:wikidata":"Q10592609","brand:wikipedia":"sv:Myrorna",name:"Myrorna",shop:"charity"},removeTags:{brand:"Myrorna","brand:wikidata":"Q10592609","brand:wikipedia":"sv:Myrorna",name:"Myrorna",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Oxfam":{name:"Oxfam",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q267941"},addTags:{brand:"Oxfam","brand:wikidata":"Q267941","brand:wikipedia":"en:Oxfam",name:"Oxfam",shop:"charity"},removeTags:{brand:"Oxfam","brand:wikidata":"Q267941","brand:wikipedia":"en:Oxfam",name:"Oxfam",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/RSPCA":{name:"RSPCA",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q584819"},addTags:{brand:"RSPCA","brand:wikidata":"Q584819","brand:wikipedia":"en:Royal Society for the Prevention of Cruelty to Animals",name:"RSPCA",shop:"charity"},removeTags:{brand:"RSPCA","brand:wikidata":"Q584819","brand:wikipedia":"en:Royal Society for the Prevention of Cruelty to Animals",name:"RSPCA",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Salvation Army":{name:"Salvation Army",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q188307"},addTags:{brand:"Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"Salvation Army",shop:"charity"},removeTags:{brand:"Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"Salvation Army",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Scope":{name:"Scope",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q7434435"},addTags:{brand:"Scope","brand:wikidata":"Q7434435","brand:wikipedia":"en:Scope (charity)",name:"Scope",shop:"charity"},removeTags:{brand:"Scope","brand:wikidata":"Q7434435","brand:wikipedia":"en:Scope (charity)",name:"Scope",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Sue Ryder":{name:"Sue Ryder",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q7634271"},addTags:{brand:"Sue Ryder","brand:wikidata":"Q7634271","brand:wikipedia":"en:Sue Ryder (charity)",name:"Sue Ryder",shop:"charity"},removeTags:{brand:"Sue Ryder","brand:wikidata":"Q7634271","brand:wikipedia":"en:Sue Ryder (charity)",name:"Sue Ryder",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/The Salvation Army":{name:"The Salvation Army",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q188307"},addTags:{brand:"The Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"The Salvation Army",shop:"charity"},removeTags:{brand:"The Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"The Salvation Army",shop:"charity"},matchScore:2,suggestion:true},"shop/chemist/Bipa":{name:"Bipa",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q864933"},addTags:{brand:"Bipa","brand:wikidata":"Q864933","brand:wikipedia":"de:Bipa",name:"Bipa",shop:"chemist"},removeTags:{brand:"Bipa","brand:wikidata":"Q864933","brand:wikipedia":"de:Bipa",name:"Bipa",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Budnikowsky":{name:"Budnikowsky",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q1001516"},addTags:{brand:"Budnikowsky","brand:wikidata":"Q1001516","brand:wikipedia":"de:Budnikowsky",name:"Budnikowsky",shop:"chemist"},removeTags:{brand:"Budnikowsky","brand:wikidata":"Q1001516","brand:wikipedia":"de:Budnikowsky",name:"Budnikowsky",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Drogeria Natura":{name:"Drogeria Natura",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q9212032"},addTags:{brand:"Drogeria Natura","brand:wikidata":"Q9212032","brand:wikipedia":"pl:Drogerie Natura",name:"Drogeria Natura",shop:"chemist"},removeTags:{brand:"Drogeria Natura","brand:wikidata":"Q9212032","brand:wikipedia":"pl:Drogerie Natura",name:"Drogeria Natura",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Etos":{name:"Etos",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q2609459"},addTags:{brand:"Etos","brand:wikidata":"Q2609459","brand:wikipedia":"en:Etos",name:"Etos",shop:"chemist"},removeTags:{brand:"Etos","brand:wikidata":"Q2609459","brand:wikipedia":"en:Etos",name:"Etos",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Kruidvat":{name:"Kruidvat",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q2226366"},addTags:{brand:"Kruidvat","brand:wikidata":"Q2226366","brand:wikipedia":"en:Kruidvat",name:"Kruidvat",shop:"chemist"},removeTags:{brand:"Kruidvat","brand:wikidata":"Q2226366","brand:wikipedia":"en:Kruidvat",name:"Kruidvat",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Matas":{name:"Matas",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q6786143"},addTags:{brand:"Matas","brand:wikidata":"Q6786143","brand:wikipedia":"en:Matas (drug store)",name:"Matas",shop:"chemist"},removeTags:{brand:"Matas","brand:wikidata":"Q6786143","brand:wikipedia":"en:Matas (drug store)",name:"Matas",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Rossmann":{name:"Rossmann",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q316004"},addTags:{brand:"Rossmann","brand:wikidata":"Q316004","brand:wikipedia":"de:Dirk Rossmann GmbH",name:"Rossmann",shop:"chemist"},removeTags:{brand:"Rossmann","brand:wikidata":"Q316004","brand:wikipedia":"de:Dirk Rossmann GmbH",name:"Rossmann",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Teta":{name:"Teta",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q20860823"},addTags:{brand:"Teta","brand:wikidata":"Q20860823","brand:wikipedia":"cs:Teta drogerie",name:"Teta",shop:"chemist"},removeTags:{brand:"Teta","brand:wikidata":"Q20860823","brand:wikipedia":"cs:Teta drogerie",name:"Teta",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Trekpleister":{name:"Trekpleister",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q2551576"},addTags:{brand:"Trekpleister","brand:wikidata":"Q2551576","brand:wikipedia":"nl:Trekpleister (drogisterij)",name:"Trekpleister",shop:"chemist"},removeTags:{brand:"Trekpleister","brand:wikidata":"Q2551576","brand:wikipedia":"nl:Trekpleister (drogisterij)",name:"Trekpleister",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/dm":{name:"dm",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q266572"},addTags:{brand:"dm","brand:wikidata":"Q266572","brand:wikipedia":"en:Dm-drogerie markt",name:"dm",shop:"chemist"},removeTags:{brand:"dm","brand:wikidata":"Q266572","brand:wikipedia":"en:Dm-drogerie markt",name:"dm",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/康是美":{name:"康是美",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q11063876"},addTags:{brand:"康是美","brand:wikidata":"Q11063876","brand:wikipedia":"zh:康是美藥妝店",name:"康是美",shop:"chemist"},removeTags:{brand:"康是美","brand:wikidata":"Q11063876","brand:wikipedia":"zh:康是美藥妝店",name:"康是美",shop:"chemist"},matchScore:2,suggestion:true},"shop/chocolate/Cacau Show":{name:"Cacau Show",icon:"maki-shop",geometry:["point","area"],tags:{shop:"chocolate","brand:wikidata":"Q9671713"},addTags:{brand:"Cacau Show","brand:wikidata":"Q9671713","brand:wikipedia":"en:Cacau show",name:"Cacau Show",shop:"chocolate"},removeTags:{brand:"Cacau Show","brand:wikidata":"Q9671713","brand:wikipedia":"en:Cacau show",name:"Cacau Show",shop:"chocolate"},matchScore:2,suggestion:true},"shop/chocolate/Leonidas":{name:"Leonidas",icon:"maki-shop",geometry:["point","area"],tags:{shop:"chocolate","brand:wikidata":"Q80335"},addTags:{brand:"Leonidas","brand:wikidata":"Q80335","brand:wikipedia":"en:Leonidas (chocolate maker)",name:"Leonidas",shop:"chocolate"},removeTags:{brand:"Leonidas","brand:wikidata":"Q80335","brand:wikipedia":"en:Leonidas (chocolate maker)",name:"Leonidas",shop:"chocolate"},matchScore:2,suggestion:true},"shop/clothes/Abercrombie & Fitch":{name:"Abercrombie & Fitch",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q319344"},addTags:{brand:"Abercrombie & Fitch","brand:wikidata":"Q319344","brand:wikipedia":"en:Abercrombie & Fitch",name:"Abercrombie & Fitch",shop:"clothes"},removeTags:{brand:"Abercrombie & Fitch","brand:wikidata":"Q319344","brand:wikipedia":"en:Abercrombie & Fitch",name:"Abercrombie & Fitch",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Accessorize":{name:"Accessorize",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3069980"},addTags:{brand:"Accessorize","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Accessorize",shop:"clothes"},removeTags:{brand:"Accessorize","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Accessorize",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ackermans":{name:"Ackermans",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4674255"},addTags:{brand:"Ackermans","brand:wikidata":"Q4674255","brand:wikipedia":"en:Ackermans",name:"Ackermans",shop:"clothes"},removeTags:{brand:"Ackermans","brand:wikidata":"Q4674255","brand:wikipedia":"en:Ackermans",name:"Ackermans",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Aeropostale":{name:"Aeropostale",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q794565"},addTags:{brand:"Aeropostale","brand:wikidata":"Q794565","brand:wikipedia":"en:Aéropostale (clothing)",name:"Aeropostale",shop:"clothes"},removeTags:{brand:"Aeropostale","brand:wikidata":"Q794565","brand:wikipedia":"en:Aéropostale (clothing)",name:"Aeropostale",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/American Apparel":{name:"American Apparel",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q463378"},addTags:{brand:"American Apparel","brand:wikidata":"Q463378","brand:wikipedia":"en:American Apparel",name:"American Apparel",shop:"clothes"},removeTags:{brand:"American Apparel","brand:wikidata":"Q463378","brand:wikipedia":"en:American Apparel",name:"American Apparel",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/American Eagle Outfitters":{name:"American Eagle Outfitters",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2842931"},addTags:{brand:"American Eagle Outfitters","brand:wikidata":"Q2842931","brand:wikipedia":"en:American Eagle Outfitters",name:"American Eagle Outfitters",shop:"clothes"},removeTags:{brand:"American Eagle Outfitters","brand:wikidata":"Q2842931","brand:wikipedia":"en:American Eagle Outfitters",name:"American Eagle Outfitters",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ann Taylor":{name:"Ann Taylor",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4766699"},addTags:{brand:"Ann Taylor","brand:wikidata":"Q4766699","brand:wikipedia":"en:Ann Inc.",name:"Ann Taylor",shop:"clothes"},removeTags:{brand:"Ann Taylor","brand:wikidata":"Q4766699","brand:wikipedia":"en:Ann Inc.",name:"Ann Taylor",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Anthropologie":{name:"Anthropologie",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4773903"},addTags:{brand:"Anthropologie","brand:wikidata":"Q4773903","brand:wikipedia":"en:Anthropologie",name:"Anthropologie",shop:"clothes"},removeTags:{brand:"Anthropologie","brand:wikidata":"Q4773903","brand:wikipedia":"en:Anthropologie",name:"Anthropologie",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ardene":{name:"Ardene",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2860764"},addTags:{brand:"Ardene","brand:wikidata":"Q2860764","brand:wikipedia":"en:Ardene",name:"Ardene",shop:"clothes"},removeTags:{brand:"Ardene","brand:wikidata":"Q2860764","brand:wikipedia":"en:Ardene",name:"Ardene",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Armand Thiery":{name:"Armand Thiery",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2861975"},addTags:{brand:"Armand Thiery","brand:wikidata":"Q2861975","brand:wikipedia":"fr:Armand Thiery",name:"Armand Thiery",shop:"clothes"},removeTags:{brand:"Armand Thiery","brand:wikidata":"Q2861975","brand:wikipedia":"fr:Armand Thiery",name:"Armand Thiery",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Banana Republic":{name:"Banana Republic",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q806085"},addTags:{brand:"Banana Republic","brand:wikidata":"Q806085","brand:wikipedia":"en:Banana Republic",name:"Banana Republic",shop:"clothes"},removeTags:{brand:"Banana Republic","brand:wikidata":"Q806085","brand:wikipedia":"en:Banana Republic",name:"Banana Republic",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Bershka":{name:"Bershka",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q827258"},addTags:{brand:"Bershka","brand:wikidata":"Q827258","brand:wikipedia":"en:Bershka",name:"Bershka",shop:"clothes"},removeTags:{brand:"Bershka","brand:wikidata":"Q827258","brand:wikipedia":"en:Bershka",name:"Bershka",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Betty Barclay":{name:"Betty Barclay",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q850250"},addTags:{brand:"Betty Barclay","brand:wikidata":"Q850250","brand:wikipedia":"de:Betty Barclay",name:"Betty Barclay",shop:"clothes"},removeTags:{brand:"Betty Barclay","brand:wikidata":"Q850250","brand:wikipedia":"de:Betty Barclay",name:"Betty Barclay",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Big Star":{name:"Big Star",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q9171569"},addTags:{brand:"Big Star","brand:wikidata":"Q9171569","brand:wikipedia":"pl:Big Star Limited",name:"Big Star",shop:"clothes"},removeTags:{brand:"Big Star","brand:wikidata":"Q9171569","brand:wikipedia":"pl:Big Star Limited",name:"Big Star",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Bonita":{name:"Bonita",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q945463"},addTags:{brand:"Bonita","brand:wikidata":"Q945463","brand:wikipedia":"en:Bonia (fashion)",name:"Bonita",shop:"clothes"},removeTags:{brand:"Bonita","brand:wikidata":"Q945463","brand:wikipedia":"en:Bonia (fashion)",name:"Bonita",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Bonobo":{name:"Bonobo",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4942546"},addTags:{brand:"Bonobo","brand:wikidata":"Q4942546","brand:wikipedia":"en:Bonobos (apparel)",name:"Bonobo",shop:"clothes"},removeTags:{brand:"Bonobo","brand:wikidata":"Q4942546","brand:wikipedia":"en:Bonobos (apparel)",name:"Bonobo",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Brice":{name:"Brice",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2925067"},addTags:{brand:"Brice","brand:wikidata":"Q2925067","brand:wikipedia":"fr:Brice (enseigne)",name:"Brice",shop:"clothes"},removeTags:{brand:"Brice","brand:wikidata":"Q2925067","brand:wikipedia":"fr:Brice (enseigne)",name:"Brice",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Brooks Brothers":{name:"Brooks Brothers",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q929722"},addTags:{brand:"Brooks Brothers","brand:wikidata":"Q929722","brand:wikipedia":"en:Brooks Brothers",name:"Brooks Brothers",shop:"clothes"},removeTags:{brand:"Brooks Brothers","brand:wikidata":"Q929722","brand:wikipedia":"en:Brooks Brothers",name:"Brooks Brothers",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Burberry":{name:"Burberry",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q390107"},addTags:{brand:"Burberry","brand:wikidata":"Q390107","brand:wikipedia":"en:Burberry",name:"Burberry",shop:"clothes"},removeTags:{brand:"Burberry","brand:wikidata":"Q390107","brand:wikipedia":"en:Burberry",name:"Burberry",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Burlington Coat Factory":{name:"Burlington Coat Factory",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4999220"},addTags:{brand:"Burlington Coat Factory","brand:wikidata":"Q4999220","brand:wikipedia":"en:Burlington (department store)",name:"Burlington Coat Factory",shop:"clothes"},removeTags:{brand:"Burlington Coat Factory","brand:wikidata":"Q4999220","brand:wikipedia":"en:Burlington (department store)",name:"Burlington Coat Factory",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Burton":{name:"Burton",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5000795"},addTags:{brand:"Burton","brand:wikidata":"Q5000795","brand:wikipedia":"en:Burton (retailer)",name:"Burton",shop:"clothes"},removeTags:{brand:"Burton","brand:wikidata":"Q5000795","brand:wikipedia":"en:Burton (retailer)",name:"Burton",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/C&A":{name:"C&A",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q701338"},addTags:{brand:"C&A","brand:wikidata":"Q701338","brand:wikipedia":"en:C&A",name:"C&A",shop:"clothes"},removeTags:{brand:"C&A","brand:wikidata":"Q701338","brand:wikipedia":"en:C&A",name:"C&A",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/COS":{name:"COS",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q60772401"},addTags:{brand:"COS","brand:wikidata":"Q60772401","brand:wikipedia":"en:COS (Collection Of Style)",name:"COS",shop:"clothes"},removeTags:{brand:"COS","brand:wikidata":"Q60772401","brand:wikipedia":"en:COS (Collection Of Style)",name:"COS",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Calvin Klein":{name:"Calvin Klein",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1068628"},addTags:{brand:"Calvin Klein","brand:wikidata":"Q1068628","brand:wikipedia":"en:Calvin Klein",name:"Calvin Klein",shop:"clothes"},removeTags:{brand:"Calvin Klein","brand:wikidata":"Q1068628","brand:wikipedia":"en:Calvin Klein",name:"Calvin Klein",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Calzedonia":{name:"Calzedonia",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1027874"},addTags:{brand:"Calzedonia","brand:wikidata":"Q1027874","brand:wikipedia":"en:Calzedonia",name:"Calzedonia",shop:"clothes"},removeTags:{brand:"Calzedonia","brand:wikidata":"Q1027874","brand:wikipedia":"en:Calzedonia",name:"Calzedonia",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Camaïeu":{name:"Camaïeu",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2934647"},addTags:{brand:"Camaïeu","brand:wikidata":"Q2934647","brand:wikipedia":"en:Camaïeu (company)",name:"Camaïeu",shop:"clothes"},removeTags:{brand:"Camaïeu","brand:wikidata":"Q2934647","brand:wikipedia":"en:Camaïeu (company)",name:"Camaïeu",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Camp David":{name:"Camp David",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q50540636"},addTags:{brand:"Camp David","brand:wikidata":"Q50540636","brand:wikipedia":"en:Camp David (fashion)",name:"Camp David",shop:"clothes"},removeTags:{brand:"Camp David","brand:wikidata":"Q50540636","brand:wikipedia":"en:Camp David (fashion)",name:"Camp David",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Carter's":{name:"Carter's",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5047083"},addTags:{brand:"Carter's","brand:wikidata":"Q5047083","brand:wikipedia":"en:Carter's",name:"Carter's",shop:"clothes"},removeTags:{brand:"Carter's","brand:wikidata":"Q5047083","brand:wikipedia":"en:Carter's",name:"Carter's",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Cato":{name:"Cato",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q16956136"},addTags:{brand:"Cato","brand:wikidata":"Q16956136","brand:wikipedia":"en:Cato Corporation",name:"Cato",shop:"clothes"},removeTags:{brand:"Cato","brand:wikidata":"Q16956136","brand:wikipedia":"en:Cato Corporation",name:"Cato",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Celio":{name:"Celio",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2672003"},addTags:{brand:"Celio","brand:wikidata":"Q2672003","brand:wikipedia":"en:Celio (retailer)",name:"Celio",shop:"clothes"},removeTags:{brand:"Celio","brand:wikidata":"Q2672003","brand:wikipedia":"en:Celio (retailer)",name:"Celio",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Charles Vögele":{name:"Charles Vögele",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1066326"},addTags:{brand:"Charles Vögele","brand:wikidata":"Q1066326","brand:wikipedia":"de:Charles Vögele Holding",name:"Charles Vögele",shop:"clothes"},removeTags:{brand:"Charles Vögele","brand:wikidata":"Q1066326","brand:wikipedia":"de:Charles Vögele Holding",name:"Charles Vögele",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Charlotte Russe":{name:"Charlotte Russe",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5086126"},addTags:{brand:"Charlotte Russe","brand:wikidata":"Q5086126","brand:wikipedia":"en:Charlotte Russe (clothing retailer)",name:"Charlotte Russe",shop:"clothes"},removeTags:{brand:"Charlotte Russe","brand:wikidata":"Q5086126","brand:wikipedia":"en:Charlotte Russe (clothing retailer)",name:"Charlotte Russe",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Chico's":{name:"Chico's",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5096393"},addTags:{brand:"Chico's","brand:wikidata":"Q5096393","brand:wikipedia":"en:Chico's (clothing retailer)",name:"Chico's",shop:"clothes"},removeTags:{brand:"Chico's","brand:wikidata":"Q5096393","brand:wikipedia":"en:Chico's (clothing retailer)",name:"Chico's",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Christopher & Banks":{name:"Christopher & Banks",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5111816"},addTags:{brand:"Christopher & Banks","brand:wikidata":"Q5111816","brand:wikipedia":"en:Christopher & Banks",name:"Christopher & Banks",shop:"clothes"},removeTags:{brand:"Christopher & Banks","brand:wikidata":"Q5111816","brand:wikipedia":"en:Christopher & Banks",name:"Christopher & Banks",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Colin's":{name:"Colin's",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q28729658"},addTags:{brand:"Colin's","brand:wikidata":"Q28729658",name:"Colin's",shop:"clothes"},removeTags:{brand:"Colin's","brand:wikidata":"Q28729658",name:"Colin's",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Columbia":{name:"Columbia",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1112588"},addTags:{brand:"Columbia","brand:wikidata":"Q1112588","brand:wikipedia":"en:Columbia Sportswear",name:"Columbia",shop:"clothes"},removeTags:{brand:"Columbia","brand:wikidata":"Q1112588","brand:wikipedia":"en:Columbia Sportswear",name:"Columbia",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Cubus":{name:"Cubus",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3439593"},addTags:{brand:"Cubus","brand:wikidata":"Q3439593","brand:wikipedia":"no:Cubus",name:"Cubus",shop:"clothes"},removeTags:{brand:"Cubus","brand:wikidata":"Q3439593","brand:wikipedia":"no:Cubus",name:"Cubus",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/David's Bridal":{name:"David's Bridal",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5230388"},addTags:{brand:"David's Bridal","brand:wikidata":"Q5230388","brand:wikipedia":"en:David's Bridal",name:"David's Bridal",shop:"clothes"},removeTags:{brand:"David's Bridal","brand:wikidata":"Q5230388","brand:wikipedia":"en:David's Bridal",name:"David's Bridal",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Desigual":{name:"Desigual",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q83750"},addTags:{brand:"Desigual","brand:wikidata":"Q83750","brand:wikipedia":"en:Desigual",name:"Desigual",shop:"clothes"},removeTags:{brand:"Desigual","brand:wikidata":"Q83750","brand:wikipedia":"en:Desigual",name:"Desigual",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Devred":{name:"Devred",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3025542"},addTags:{brand:"Devred","brand:wikidata":"Q3025542","brand:wikipedia":"fr:Devred 1902",name:"Devred",shop:"clothes"},removeTags:{brand:"Devred","brand:wikidata":"Q3025542","brand:wikipedia":"fr:Devred 1902",name:"Devred",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Diesel":{name:"Diesel",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q158285"},addTags:{brand:"Diesel","brand:wikidata":"Q158285","brand:wikipedia":"en:Diesel (brand)",name:"Diesel",shop:"clothes"},removeTags:{brand:"Diesel","brand:wikidata":"Q158285","brand:wikipedia":"en:Diesel (brand)",name:"Diesel",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Diverse":{name:"Diverse",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q11694298"},addTags:{brand:"Diverse","brand:wikidata":"Q11694298","brand:wikipedia":"pl:Diverse",name:"Diverse",shop:"clothes"},removeTags:{brand:"Diverse","brand:wikidata":"Q11694298","brand:wikipedia":"pl:Diverse",name:"Diverse",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Dorothy Perkins":{name:"Dorothy Perkins",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5298588"},addTags:{brand:"Dorothy Perkins","brand:wikidata":"Q5298588","brand:wikipedia":"en:Dorothy Perkins",name:"Dorothy Perkins",shop:"clothes"},removeTags:{brand:"Dorothy Perkins","brand:wikidata":"Q5298588","brand:wikipedia":"en:Dorothy Perkins",name:"Dorothy Perkins",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Dress Barn":{name:"Dress Barn",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5307031"},addTags:{brand:"Dress Barn","brand:wikidata":"Q5307031","brand:wikipedia":"en:Ascena Retail Group",name:"Dress Barn",shop:"clothes"},removeTags:{brand:"Dress Barn","brand:wikidata":"Q5307031","brand:wikipedia":"en:Ascena Retail Group",name:"Dress Barn",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Dressmann":{name:"Dressmann",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3357081"},addTags:{brand:"Dressmann","brand:wikidata":"Q3357081","brand:wikipedia":"en:Dressmann",name:"Dressmann",shop:"clothes"},removeTags:{brand:"Dressmann","brand:wikidata":"Q3357081","brand:wikipedia":"en:Dressmann",name:"Dressmann",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Eddie Bauer":{name:"Eddie Bauer",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q842174"},addTags:{brand:"Eddie Bauer","brand:wikidata":"Q842174","brand:wikipedia":"en:Eddie Bauer",name:"Eddie Bauer",shop:"clothes"},removeTags:{brand:"Eddie Bauer","brand:wikidata":"Q842174","brand:wikipedia":"en:Eddie Bauer",name:"Eddie Bauer",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Engbers":{name:"Engbers",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1290088"},addTags:{brand:"Engbers","brand:wikidata":"Q1290088","brand:wikipedia":"de:Engbers",name:"Engbers",shop:"clothes"},removeTags:{brand:"Engbers","brand:wikidata":"Q1290088","brand:wikipedia":"de:Engbers",name:"Engbers",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ernsting's family":{name:"Ernsting's family",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1361016"},addTags:{brand:"Ernsting's family","brand:wikidata":"Q1361016","brand:wikipedia":"de:Ernsting’s family",name:"Ernsting's family",shop:"clothes"},removeTags:{brand:"Ernsting's family","brand:wikidata":"Q1361016","brand:wikipedia":"de:Ernsting’s family",name:"Ernsting's family",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Esprit":{name:"Esprit",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q532746"},addTags:{brand:"Esprit","brand:wikidata":"Q532746","brand:wikipedia":"en:Esprit Holdings",name:"Esprit",shop:"clothes"},removeTags:{brand:"Esprit","brand:wikidata":"Q532746","brand:wikipedia":"en:Esprit Holdings",name:"Esprit",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Etam":{name:"Etam",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3059202"},addTags:{brand:"Etam","brand:wikidata":"Q3059202","brand:wikipedia":"en:Etam Développement",name:"Etam",shop:"clothes"},removeTags:{brand:"Etam","brand:wikidata":"Q3059202","brand:wikipedia":"en:Etam Développement",name:"Etam",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Express":{name:"Express",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1384784"},addTags:{brand:"Express","brand:wikidata":"Q1384784","brand:wikipedia":"en:Express, Inc.",name:"Express",shop:"clothes"},removeTags:{brand:"Express","brand:wikidata":"Q1384784","brand:wikipedia":"en:Express, Inc.",name:"Express",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Fat Face":{name:"Fat Face",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5437186"},addTags:{brand:"Fat Face","brand:wikidata":"Q5437186","brand:wikipedia":"en:Fat Face",name:"Fat Face",shop:"clothes"},removeTags:{brand:"Fat Face","brand:wikidata":"Q5437186","brand:wikipedia":"en:Fat Face",name:"Fat Face",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Forever 21":{name:"Forever 21",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1060537"},addTags:{brand:"Forever 21","brand:wikidata":"Q1060537","brand:wikipedia":"en:Forever 21",name:"Forever 21",shop:"clothes"},removeTags:{brand:"Forever 21","brand:wikidata":"Q1060537","brand:wikipedia":"en:Forever 21",name:"Forever 21",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gant":{name:"Gant",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1493667"},addTags:{brand:"Gant","brand:wikidata":"Q1493667","brand:wikipedia":"en:Gant (retailer)",name:"Gant",shop:"clothes"},removeTags:{brand:"Gant","brand:wikidata":"Q1493667","brand:wikipedia":"en:Gant (retailer)",name:"Gant",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gap":{name:"Gap",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q420822"},addTags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Gap",shop:"clothes"},removeTags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Gap",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gerry Weber":{name:"Gerry Weber",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q873447"},addTags:{brand:"Gerry Weber","brand:wikidata":"Q873447","brand:wikipedia":"en:Gerry Weber",name:"Gerry Weber",shop:"clothes"},removeTags:{brand:"Gerry Weber","brand:wikidata":"Q873447","brand:wikipedia":"en:Gerry Weber",name:"Gerry Weber",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gina Laura":{name:"Gina Laura",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2700576"},addTags:{brand:"Gina Laura","brand:wikidata":"Q2700576","brand:wikipedia":"de:Gina Laura",name:"Gina Laura",shop:"clothes"},removeTags:{brand:"Gina Laura","brand:wikidata":"Q2700576","brand:wikipedia":"de:Gina Laura",name:"Gina Laura",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gucci":{name:"Gucci",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q178516"},addTags:{brand:"Gucci","brand:wikidata":"Q178516","brand:wikipedia":"en:Gucci",name:"Gucci",shop:"clothes"},removeTags:{brand:"Gucci","brand:wikidata":"Q178516","brand:wikipedia":"en:Gucci",name:"Gucci",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Guess":{name:"Guess",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2470307"},addTags:{brand:"Guess","brand:wikidata":"Q2470307","brand:wikipedia":"en:Guess (clothing)",name:"Guess",shop:"clothes"},removeTags:{brand:"Guess","brand:wikidata":"Q2470307","brand:wikipedia":"en:Guess (clothing)",name:"Guess",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gymboree":{name:"Gymboree",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4039771"},addTags:{brand:"Gymboree","brand:wikidata":"Q4039771","brand:wikipedia":"en:Gymboree",name:"Gymboree",shop:"clothes"},removeTags:{brand:"Gymboree","brand:wikidata":"Q4039771","brand:wikipedia":"en:Gymboree",name:"Gymboree",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gémo":{name:"Gémo",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3122954"},addTags:{brand:"Gémo","brand:wikidata":"Q3122954","brand:wikipedia":"fr:Gémo",name:"Gémo",shop:"clothes"},removeTags:{brand:"Gémo","brand:wikidata":"Q3122954","brand:wikipedia":"fr:Gémo",name:"Gémo",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/H&M":{name:"H&M",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q188326"},addTags:{brand:"H&M","brand:wikidata":"Q188326","brand:wikipedia":"en:H&M",name:"H&M",shop:"clothes"},removeTags:{brand:"H&M","brand:wikidata":"Q188326","brand:wikipedia":"en:H&M",name:"H&M",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hallhuber":{name:"Hallhuber",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1571714"},addTags:{brand:"Hallhuber","brand:wikidata":"Q1571714","brand:wikipedia":"de:Hallhuber (Bekleidungshaus)",name:"Hallhuber",shop:"clothes"},removeTags:{brand:"Hallhuber","brand:wikidata":"Q1571714","brand:wikipedia":"de:Hallhuber (Bekleidungshaus)",name:"Hallhuber",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hollister":{name:"Hollister",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1257477"},addTags:{brand:"Hollister","brand:wikidata":"Q1257477","brand:wikipedia":"en:Hollister Co.",name:"Hollister",shop:"clothes"},removeTags:{brand:"Hollister","brand:wikidata":"Q1257477","brand:wikipedia":"en:Hollister Co.",name:"Hollister",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hot Topic":{name:"Hot Topic",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q9294032"},addTags:{brand:"Hot Topic","brand:wikidata":"Q9294032","brand:wikipedia":"en:Hot Topic",name:"Hot Topic",shop:"clothes"},removeTags:{brand:"Hot Topic","brand:wikidata":"Q9294032","brand:wikipedia":"en:Hot Topic",name:"Hot Topic",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hugo Boss":{name:"Hugo Boss",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q491627"},addTags:{brand:"Hugo Boss","brand:wikidata":"Q491627","brand:wikipedia":"en:Hugo Boss",name:"Hugo Boss",shop:"clothes"},removeTags:{brand:"Hugo Boss","brand:wikidata":"Q491627","brand:wikipedia":"en:Hugo Boss",name:"Hugo Boss",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hunkemöller":{name:"Hunkemöller",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2604175"},addTags:{brand:"Hunkemöller","brand:wikidata":"Q2604175","brand:wikipedia":"en:Hunkemöller",name:"Hunkemöller",shop:"clothes"},removeTags:{brand:"Hunkemöller","brand:wikidata":"Q2604175","brand:wikipedia":"en:Hunkemöller",name:"Hunkemöller",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Intimissimi":{name:"Intimissimi",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q305404"},addTags:{brand:"Intimissimi","brand:wikidata":"Q305404","brand:wikipedia":"en:Intimissimi",clothes:"underwear",name:"Intimissimi",shop:"clothes"},removeTags:{brand:"Intimissimi","brand:wikidata":"Q305404","brand:wikipedia":"en:Intimissimi",clothes:"underwear",name:"Intimissimi",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/JBC":{name:"JBC",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2671470"},addTags:{brand:"JBC","brand:wikidata":"Q2671470","brand:wikipedia":"nl:JBC",name:"JBC",shop:"clothes"},removeTags:{brand:"JBC","brand:wikidata":"Q2671470","brand:wikipedia":"nl:JBC",name:"JBC",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Jack & Jones":{name:"Jack & Jones",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6077665"},addTags:{brand:"Jack & Jones","brand:wikidata":"Q6077665","brand:wikipedia":"en:Jack & Jones",name:"Jack & Jones",shop:"clothes"},removeTags:{brand:"Jack & Jones","brand:wikidata":"Q6077665","brand:wikipedia":"en:Jack & Jones",name:"Jack & Jones",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Jack Wills":{name:"Jack Wills",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6115814"},addTags:{brand:"Jack Wills","brand:wikidata":"Q6115814","brand:wikipedia":"en:Jack Wills",name:"Jack Wills",shop:"clothes"},removeTags:{brand:"Jack Wills","brand:wikidata":"Q6115814","brand:wikipedia":"en:Jack Wills",name:"Jack Wills",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Jeans Fritz":{name:"Jeans Fritz",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1686071"},addTags:{brand:"Jeans Fritz","brand:wikidata":"Q1686071","brand:wikipedia":"de:Jeans Fritz",name:"Jeans Fritz",shop:"clothes"},removeTags:{brand:"Jeans Fritz","brand:wikidata":"Q1686071","brand:wikipedia":"de:Jeans Fritz",name:"Jeans Fritz",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Jennyfer":{name:"Jennyfer",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3177174"},addTags:{brand:"Jennyfer","brand:wikidata":"Q3177174","brand:wikipedia":"fr:Jennyfer",name:"Jennyfer",shop:"clothes"},removeTags:{brand:"Jennyfer","brand:wikidata":"Q3177174","brand:wikipedia":"fr:Jennyfer",name:"Jennyfer",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Jigsaw":{name:"Jigsaw",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6192383"},addTags:{brand:"Jigsaw","brand:wikidata":"Q6192383","brand:wikipedia":"en:Jigsaw (clothing retailer)",name:"Jigsaw",shop:"clothes"},removeTags:{brand:"Jigsaw","brand:wikidata":"Q6192383","brand:wikipedia":"en:Jigsaw (clothing retailer)",name:"Jigsaw",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Joules":{name:"Joules",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q25351738"},addTags:{brand:"Joules","brand:wikidata":"Q25351738","brand:wikipedia":"en:Joules (clothing)",name:"Joules",shop:"clothes"},removeTags:{brand:"Joules","brand:wikidata":"Q25351738","brand:wikipedia":"en:Joules (clothing)",name:"Joules",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Justice":{name:"Justice",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7857512"},addTags:{brand:"Justice","brand:wikidata":"Q7857512","brand:wikipedia":"en:Tween Brands",name:"Justice",shop:"clothes"},removeTags:{brand:"Justice","brand:wikidata":"Q7857512","brand:wikipedia":"en:Tween Brands",name:"Justice",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/KappAhl":{name:"KappAhl",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4349016"},addTags:{brand:"KappAhl","brand:wikidata":"Q4349016","brand:wikipedia":"sv:Kappahl",name:"KappAhl",shop:"clothes"},removeTags:{brand:"KappAhl","brand:wikidata":"Q4349016","brand:wikipedia":"sv:Kappahl",name:"KappAhl",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/KiK":{name:"KiK",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q883965"},addTags:{brand:"KiK","brand:wikidata":"Q883965","brand:wikipedia":"en:KiK",name:"KiK",shop:"clothes"},removeTags:{brand:"KiK","brand:wikidata":"Q883965","brand:wikipedia":"en:KiK",name:"KiK",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Kiabi":{name:"Kiabi",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3196299"},addTags:{brand:"Kiabi","brand:wikidata":"Q3196299","brand:wikipedia":"fr:Kiabi",name:"Kiabi",shop:"clothes"},removeTags:{brand:"Kiabi","brand:wikidata":"Q3196299","brand:wikipedia":"fr:Kiabi",name:"Kiabi",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/LC Waikiki":{name:"LC Waikiki",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3205965"},addTags:{brand:"LC Waikiki","brand:wikidata":"Q3205965","brand:wikipedia":"fr:LC Waikiki",name:"LC Waikiki",shop:"clothes"},removeTags:{brand:"LC Waikiki","brand:wikidata":"Q3205965","brand:wikipedia":"fr:LC Waikiki",name:"LC Waikiki",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/La Senza":{name:"La Senza",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3212802"},addTags:{brand:"La Senza","brand:wikidata":"Q3212802","brand:wikipedia":"en:La Senza",name:"La Senza",shop:"clothes"},removeTags:{brand:"La Senza","brand:wikidata":"Q3212802","brand:wikipedia":"en:La Senza",name:"La Senza",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Lacoste":{name:"Lacoste",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q309031"},addTags:{brand:"Lacoste","brand:wikidata":"Q309031","brand:wikipedia":"en:Lacoste",name:"Lacoste",shop:"clothes"},removeTags:{brand:"Lacoste","brand:wikidata":"Q309031","brand:wikipedia":"en:Lacoste",name:"Lacoste",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Lane Bryant":{name:"Lane Bryant",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6485350"},addTags:{brand:"Lane Bryant","brand:wikidata":"Q6485350","brand:wikipedia":"en:Lane Bryant",name:"Lane Bryant",shop:"clothes"},removeTags:{brand:"Lane Bryant","brand:wikidata":"Q6485350","brand:wikipedia":"en:Lane Bryant",name:"Lane Bryant",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Levi's":{name:"Levi's",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q127962"},addTags:{brand:"Levi's","brand:wikidata":"Q127962","brand:wikipedia":"en:Levi Strauss & Co.",name:"Levi's",shop:"clothes"},removeTags:{brand:"Levi's","brand:wikidata":"Q127962","brand:wikipedia":"en:Levi Strauss & Co.",name:"Levi's",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Lindex":{name:"Lindex",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1786717"},addTags:{brand:"Lindex","brand:wikidata":"Q1786717","brand:wikipedia":"en:Lindex",name:"Lindex",shop:"clothes"},removeTags:{brand:"Lindex","brand:wikidata":"Q1786717","brand:wikipedia":"en:Lindex",name:"Lindex",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Loft":{name:"Loft",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4766699"},addTags:{brand:"Loft","brand:wikidata":"Q4766699","brand:wikipedia":"en:Ann Inc.",name:"Loft",shop:"clothes"},removeTags:{brand:"Loft","brand:wikidata":"Q4766699","brand:wikipedia":"en:Ann Inc.",name:"Loft",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Louis Vuitton":{name:"Louis Vuitton",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q191485"},addTags:{brand:"Louis Vuitton","brand:wikidata":"Q191485","brand:wikipedia":"en:Louis Vuitton",name:"Louis Vuitton",shop:"clothes"},removeTags:{brand:"Louis Vuitton","brand:wikidata":"Q191485","brand:wikipedia":"en:Louis Vuitton",name:"Louis Vuitton",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/M&Co":{name:"M&Co",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6711808"},addTags:{brand:"M&Co","brand:wikidata":"Q6711808","brand:wikipedia":"en:M&Co.",name:"M&Co",shop:"clothes"},removeTags:{brand:"M&Co","brand:wikidata":"Q6711808","brand:wikipedia":"en:M&Co.",name:"M&Co",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Mango":{name:"Mango",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q136503"},addTags:{brand:"Mango","brand:wikidata":"Q136503","brand:wikipedia":"en:Mango (retailer)",name:"Mango",shop:"clothes"},removeTags:{brand:"Mango","brand:wikidata":"Q136503","brand:wikipedia":"en:Mango (retailer)",name:"Mango",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Marc O'Polo":{name:"Marc O'Polo",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1892752"},addTags:{brand:"Marc O'Polo","brand:wikidata":"Q1892752","brand:wikipedia":"en:Marc O'Polo",name:"Marc O'Polo",shop:"clothes"},removeTags:{brand:"Marc O'Polo","brand:wikidata":"Q1892752","brand:wikipedia":"en:Marc O'Polo",name:"Marc O'Polo",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Mark's":{name:"Mark's",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6766373"},addTags:{brand:"Mark's","brand:wikidata":"Q6766373","brand:wikipedia":"en:Mark's",name:"Mark's",shop:"clothes"},removeTags:{brand:"Mark's","brand:wikidata":"Q6766373","brand:wikipedia":"en:Mark's",name:"Mark's",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Marks & Spencer":{name:"Marks & Spencer",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q714491"},addTags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"clothes"},removeTags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Massimo Dutti":{name:"Massimo Dutti",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q788231"},addTags:{brand:"Massimo Dutti","brand:wikidata":"Q788231","brand:wikipedia":"en:Massimo Dutti",name:"Massimo Dutti",shop:"clothes"},removeTags:{brand:"Massimo Dutti","brand:wikidata":"Q788231","brand:wikipedia":"en:Massimo Dutti",name:"Massimo Dutti",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Matalan":{name:"Matalan",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q12061509"},addTags:{brand:"Matalan","brand:wikidata":"Q12061509","brand:wikipedia":"en:Matalan",name:"Matalan",shop:"clothes"},removeTags:{brand:"Matalan","brand:wikidata":"Q12061509","brand:wikipedia":"en:Matalan",name:"Matalan",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Maurices":{name:"Maurices",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6793571"},addTags:{brand:"Maurices","brand:wikidata":"Q6793571","brand:wikipedia":"en:Maurices",name:"Maurices",shop:"clothes"},removeTags:{brand:"Maurices","brand:wikidata":"Q6793571","brand:wikipedia":"en:Maurices",name:"Maurices",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Max Mara":{name:"Max Mara",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1151774"},addTags:{brand:"Max Mara","brand:wikidata":"Q1151774","brand:wikipedia":"en:Max Mara",name:"Max Mara",shop:"clothes"},removeTags:{brand:"Max Mara","brand:wikidata":"Q1151774","brand:wikipedia":"en:Max Mara",name:"Max Mara",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Men's Wearhouse":{name:"Men's Wearhouse",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q57405513"},addTags:{brand:"Men's Wearhouse","brand:wikidata":"Q57405513",name:"Men's Wearhouse",shop:"clothes"},removeTags:{brand:"Men's Wearhouse","brand:wikidata":"Q57405513",name:"Men's Wearhouse",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Mexx":{name:"Mexx",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1837290"},addTags:{brand:"Mexx","brand:wikidata":"Q1837290","brand:wikipedia":"en:Mexx",name:"Mexx",shop:"clothes"},removeTags:{brand:"Mexx","brand:wikidata":"Q1837290","brand:wikipedia":"en:Mexx",name:"Mexx",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Michael Kors":{name:"Michael Kors",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q19572998"},addTags:{brand:"Michael Kors","brand:wikidata":"Q19572998","brand:wikipedia":"en:Michael Kors (brand)",name:"Michael Kors",shop:"clothes"},removeTags:{brand:"Michael Kors","brand:wikidata":"Q19572998","brand:wikipedia":"en:Michael Kors (brand)",name:"Michael Kors",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Monsoon":{name:"Monsoon",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3069980"},addTags:{brand:"Monsoon","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Monsoon",shop:"clothes"},removeTags:{brand:"Monsoon","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Monsoon",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Mr Price":{name:"Mr Price",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6929120"},addTags:{brand:"Mr Price","brand:wikidata":"Q6929120","brand:wikipedia":"en:Mr. Price",name:"Mr Price",shop:"clothes"},removeTags:{brand:"Mr Price","brand:wikidata":"Q6929120","brand:wikipedia":"en:Mr. Price",name:"Mr Price",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/NKD":{name:"NKD",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q927272"},addTags:{brand:"NKD","brand:wikidata":"Q927272","brand:wikipedia":"de:NKD",name:"NKD",shop:"clothes"},removeTags:{brand:"NKD","brand:wikidata":"Q927272","brand:wikipedia":"de:NKD",name:"NKD",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Naf Naf":{name:"Naf Naf",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3334188"},addTags:{brand:"Naf Naf","brand:wikidata":"Q3334188","brand:wikipedia":"fr:Naf Naf",name:"Naf Naf",shop:"clothes"},removeTags:{brand:"Naf Naf","brand:wikidata":"Q3334188","brand:wikipedia":"fr:Naf Naf",name:"Naf Naf",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/New Look":{name:"New Look",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q12063852"},addTags:{brand:"New Look","brand:wikidata":"Q12063852","brand:wikipedia":"en:New Look (company)",name:"New Look",shop:"clothes"},removeTags:{brand:"New Look","brand:wikidata":"Q12063852","brand:wikipedia":"en:New Look (company)",name:"New Look",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/New Yorker":{name:"New Yorker",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q706421"},addTags:{brand:"New Yorker","brand:wikidata":"Q706421","brand:wikipedia":"en:NewYorker",name:"New Yorker",shop:"clothes"},removeTags:{brand:"New Yorker","brand:wikidata":"Q706421","brand:wikipedia":"en:NewYorker",name:"New Yorker",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Next":{name:"Next",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q246655"},addTags:{brand:"Next","brand:wikidata":"Q246655","brand:wikipedia":"en:Next plc",name:"Next",shop:"clothes"},removeTags:{brand:"Next","brand:wikidata":"Q246655","brand:wikipedia":"en:Next plc",name:"Next",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Nike":{name:"Nike",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q483915"},addTags:{brand:"Nike","brand:wikidata":"Q483915","brand:wikipedia":"en:Nike, Inc.",name:"Nike",shop:"clothes"},removeTags:{brand:"Nike","brand:wikidata":"Q483915","brand:wikipedia":"en:Nike, Inc.",name:"Nike",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Nordstrom Rack":{name:"Nordstrom Rack",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q21463374"},addTags:{brand:"Nordstrom Rack","brand:wikidata":"Q21463374","brand:wikipedia":"en:Nordstrom Rack",name:"Nordstrom Rack",shop:"clothes"},removeTags:{brand:"Nordstrom Rack","brand:wikidata":"Q21463374","brand:wikipedia":"en:Nordstrom Rack",name:"Nordstrom Rack",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/OVS":{name:"OVS",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2042514"},addTags:{brand:"OVS","brand:wikidata":"Q2042514","brand:wikipedia":"en:OVS (company)",name:"OVS",shop:"clothes"},removeTags:{brand:"OVS","brand:wikidata":"Q2042514","brand:wikipedia":"en:OVS (company)",name:"OVS",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Okaïdi":{name:"Okaïdi",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3350027"},addTags:{brand:"Okaïdi","brand:wikidata":"Q3350027","brand:wikipedia":"fr:Okaïdi",name:"Okaïdi",shop:"clothes"},removeTags:{brand:"Okaïdi","brand:wikidata":"Q3350027","brand:wikipedia":"fr:Okaïdi",name:"Okaïdi",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Old Navy":{name:"Old Navy",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2735242"},addTags:{brand:"Old Navy","brand:wikidata":"Q2735242","brand:wikipedia":"en:Old Navy",name:"Old Navy",shop:"clothes"},removeTags:{brand:"Old Navy","brand:wikidata":"Q2735242","brand:wikipedia":"en:Old Navy",name:"Old Navy",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Orchestra":{name:"Orchestra",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q28042940"},addTags:{brand:"Orchestra","brand:wikidata":"Q28042940","brand:wikipedia":"fr:Orchestra Prémaman",name:"Orchestra",shop:"clothes"},removeTags:{brand:"Orchestra","brand:wikidata":"Q28042940","brand:wikipedia":"fr:Orchestra Prémaman",name:"Orchestra",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Orsay":{name:"Orsay",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q883245"},addTags:{brand:"Orsay","brand:wikidata":"Q883245","brand:wikipedia":"de:Orsay (Modeunternehmen)",name:"Orsay",shop:"clothes"},removeTags:{brand:"Orsay","brand:wikidata":"Q883245","brand:wikipedia":"de:Orsay (Modeunternehmen)",name:"Orsay",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Outfit":{name:"Outfit",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7112061"},addTags:{brand:"Outfit","brand:wikidata":"Q7112061","brand:wikipedia":"en:Outfit (retailer)",name:"Outfit",shop:"clothes"},removeTags:{brand:"Outfit","brand:wikidata":"Q7112061","brand:wikipedia":"en:Outfit (retailer)",name:"Outfit",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Oysho":{name:"Oysho",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3327046"},addTags:{brand:"Oysho","brand:wikidata":"Q3327046","brand:wikipedia":"en:Oysho",name:"Oysho",shop:"clothes"},removeTags:{brand:"Oysho","brand:wikidata":"Q3327046","brand:wikipedia":"en:Oysho",name:"Oysho",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/PacSun":{name:"PacSun",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7121857"},addTags:{brand:"PacSun","brand:wikidata":"Q7121857","brand:wikipedia":"en:PacSun",name:"PacSun",shop:"clothes"},removeTags:{brand:"PacSun","brand:wikidata":"Q7121857","brand:wikipedia":"en:PacSun",name:"PacSun",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Palmers":{name:"Palmers",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1509985"},addTags:{brand:"Palmers","brand:wikidata":"Q1509985","brand:wikipedia":"de:Palmers",name:"Palmers",shop:"clothes"},removeTags:{brand:"Palmers","brand:wikidata":"Q1509985","brand:wikipedia":"de:Palmers",name:"Palmers",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Peacocks":{name:"Peacocks",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7157762"},addTags:{brand:"Peacocks","brand:wikidata":"Q7157762","brand:wikipedia":"en:Peacocks (clothing)",name:"Peacocks",shop:"clothes"},removeTags:{brand:"Peacocks","brand:wikidata":"Q7157762","brand:wikipedia":"en:Peacocks (clothing)",name:"Peacocks",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Peek & Cloppenburg":{name:"Peek & Cloppenburg",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2066959"},addTags:{brand:"Peek & Cloppenburg","brand:wikidata":"Q2066959","brand:wikipedia":"en:Peek & Cloppenburg",name:"Peek & Cloppenburg",shop:"clothes"},removeTags:{brand:"Peek & Cloppenburg","brand:wikidata":"Q2066959","brand:wikipedia":"en:Peek & Cloppenburg",name:"Peek & Cloppenburg",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Pep":{name:"Pep",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7166182"},addTags:{brand:"Pep","brand:wikidata":"Q7166182","brand:wikipedia":"en:Pep (store)",name:"Pep",shop:"clothes"},removeTags:{brand:"Pep","brand:wikidata":"Q7166182","brand:wikipedia":"en:Pep (store)",name:"Pep",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Pepco":{name:"Pepco",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q11815580"},addTags:{brand:"Pepco","brand:wikidata":"Q11815580","brand:wikipedia":"pl:Pepco",name:"Pepco",shop:"clothes"},removeTags:{brand:"Pepco","brand:wikidata":"Q11815580","brand:wikipedia":"pl:Pepco",name:"Pepco",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Petit Bateau":{name:"Petit Bateau",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3377090"},addTags:{brand:"Petit Bateau","brand:wikidata":"Q3377090","brand:wikipedia":"en:Petit Bateau",name:"Petit Bateau",shop:"clothes"},removeTags:{brand:"Petit Bateau","brand:wikidata":"Q3377090","brand:wikipedia":"en:Petit Bateau",name:"Petit Bateau",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Phase Eight":{name:"Phase Eight",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q17020730"},addTags:{brand:"Phase Eight","brand:wikidata":"Q17020730","brand:wikipedia":"en:Phase Eight",name:"Phase Eight",shop:"clothes"},removeTags:{brand:"Phase Eight","brand:wikidata":"Q17020730","brand:wikipedia":"en:Phase Eight",name:"Phase Eight",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Pimkie":{name:"Pimkie",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1758066"},addTags:{brand:"Pimkie","brand:wikidata":"Q1758066","brand:wikipedia":"en:Pimkie",name:"Pimkie",shop:"clothes"},removeTags:{brand:"Pimkie","brand:wikidata":"Q1758066","brand:wikipedia":"en:Pimkie",name:"Pimkie",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Primark":{name:"Primark",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q137023"},addTags:{brand:"Primark","brand:wikidata":"Q137023","brand:wikipedia":"en:Primark",name:"Primark",shop:"clothes"},removeTags:{brand:"Primark","brand:wikidata":"Q137023","brand:wikipedia":"en:Primark",name:"Primark",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Promod":{name:"Promod",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3407429"},addTags:{brand:"Promod","brand:wikidata":"Q3407429","brand:wikipedia":"en:Promod",name:"Promod",shop:"clothes"},removeTags:{brand:"Promod","brand:wikidata":"Q3407429","brand:wikipedia":"en:Promod",name:"Promod",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Pull & Bear":{name:"Pull & Bear",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q691029"},addTags:{brand:"Pull & Bear","brand:wikidata":"Q691029","brand:wikipedia":"en:Pull&Bear",name:"Pull & Bear",shop:"clothes"},removeTags:{brand:"Pull & Bear","brand:wikidata":"Q691029","brand:wikipedia":"en:Pull&Bear",name:"Pull & Bear",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Rainbow":{name:"Rainbow",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7284708"},addTags:{brand:"Rainbow","brand:wikidata":"Q7284708","brand:wikipedia":"en:Rainbow Shops",name:"Rainbow",shop:"clothes"},removeTags:{brand:"Rainbow","brand:wikidata":"Q7284708","brand:wikipedia":"en:Rainbow Shops",name:"Rainbow",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Reitmans":{name:"Reitmans",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7310506"},addTags:{brand:"Reitmans","brand:wikidata":"Q7310506","brand:wikipedia":"en:Reitmans",name:"Reitmans",shop:"clothes"},removeTags:{brand:"Reitmans","brand:wikidata":"Q7310506","brand:wikipedia":"en:Reitmans",name:"Reitmans",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Reserved":{name:"Reserved",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q21809354"},addTags:{brand:"Reserved","brand:wikidata":"Q21809354","brand:wikipedia":"en:Reserved (retail)",name:"Reserved",shop:"clothes"},removeTags:{brand:"Reserved","brand:wikidata":"Q21809354","brand:wikipedia":"en:Reserved (retail)",name:"Reserved",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/River Island":{name:"River Island",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2670328"},addTags:{brand:"River Island","brand:wikidata":"Q2670328","brand:wikipedia":"en:River Island",name:"River Island",shop:"clothes"},removeTags:{brand:"River Island","brand:wikidata":"Q2670328","brand:wikipedia":"en:River Island",name:"River Island",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ross":{name:"Ross",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3442791"},addTags:{brand:"Ross","brand:wikidata":"Q3442791","brand:wikipedia":"en:Ross Stores",name:"Ross",shop:"clothes"},removeTags:{brand:"Ross","brand:wikidata":"Q3442791","brand:wikipedia":"en:Ross Stores",name:"Ross",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Sisley":{name:"Sisley",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q12054325"},addTags:{brand:"Sisley","brand:wikidata":"Q12054325","brand:wikipedia":"cs:Sisley",name:"Sisley",operator:"Benetton Group","operator:wikidata":"Q817139","operator:wikipedia":"en:Benetton Group",shop:"clothes"},removeTags:{brand:"Sisley","brand:wikidata":"Q12054325","brand:wikipedia":"cs:Sisley",name:"Sisley",operator:"Benetton Group","operator:wikidata":"Q817139","operator:wikipedia":"en:Benetton Group",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Springfield":{name:"Springfield",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q958209"},addTags:{brand:"Springfield","brand:wikidata":"Q958209","brand:wikipedia":"es:Springfield (cadena de tiendas)",name:"Springfield",shop:"clothes"},removeTags:{brand:"Springfield","brand:wikidata":"Q958209","brand:wikipedia":"es:Springfield (cadena de tiendas)",name:"Springfield",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Stefanel":{name:"Stefanel",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2338087"},addTags:{brand:"Stefanel","brand:wikidata":"Q2338087","brand:wikipedia":"ro:Stefanel (companie)",name:"Stefanel",shop:"clothes"},removeTags:{brand:"Stefanel","brand:wikidata":"Q2338087","brand:wikipedia":"ro:Stefanel (companie)",name:"Stefanel",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Stradivarius":{name:"Stradivarius",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3322945"},addTags:{brand:"Stradivarius","brand:wikidata":"Q3322945","brand:wikipedia":"en:Stradivarius (clothing brand)",name:"Stradivarius",shop:"clothes"},removeTags:{brand:"Stradivarius","brand:wikidata":"Q3322945","brand:wikipedia":"en:Stradivarius (clothing brand)",name:"Stradivarius",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Suburbia":{name:"Suburbia",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6134992"},addTags:{brand:"Suburbia","brand:wikidata":"Q6134992","brand:wikipedia":"en:Suburbia (department store)",name:"Suburbia",shop:"clothes"},removeTags:{brand:"Suburbia","brand:wikidata":"Q6134992","brand:wikipedia":"en:Suburbia (department store)",name:"Suburbia",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Superdry":{name:"Superdry",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1684445"},addTags:{brand:"Superdry","brand:wikidata":"Q1684445","brand:wikipedia":"en:Superdry",name:"Superdry",shop:"clothes"},removeTags:{brand:"Superdry","brand:wikidata":"Q1684445","brand:wikipedia":"en:Superdry",name:"Superdry",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/TJ Maxx":{name:"TJ Maxx",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q10860683"},addTags:{brand:"TJ Maxx","brand:wikidata":"Q10860683","brand:wikipedia":"en:TJ Maxx",name:"TJ Maxx",shop:"clothes"},removeTags:{brand:"TJ Maxx","brand:wikidata":"Q10860683","brand:wikipedia":"en:TJ Maxx",name:"TJ Maxx",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/TK Maxx":{name:"TK Maxx",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q23823668"},addTags:{brand:"TK Maxx","brand:wikidata":"Q23823668","brand:wikipedia":"en:TK Maxx",name:"TK Maxx",shop:"clothes"},removeTags:{brand:"TK Maxx","brand:wikidata":"Q23823668","brand:wikipedia":"en:TK Maxx",name:"TK Maxx",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Takko":{name:"Takko",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1371302"},addTags:{brand:"Takko","brand:wikidata":"Q1371302","brand:wikipedia":"de:Takko",name:"Takko",shop:"clothes"},removeTags:{brand:"Takko","brand:wikidata":"Q1371302","brand:wikipedia":"de:Takko",name:"Takko",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Talbots":{name:"Talbots",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7679064"},addTags:{brand:"Talbots","brand:wikidata":"Q7679064","brand:wikipedia":"en:Talbots",name:"Talbots",shop:"clothes"},removeTags:{brand:"Talbots","brand:wikidata":"Q7679064","brand:wikipedia":"en:Talbots",name:"Talbots",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Tally Weijl":{name:"Tally Weijl",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q689695"},addTags:{brand:"Tally Weijl","brand:wikidata":"Q689695","brand:wikipedia":"en:Tally Weijl",name:"Tally Weijl",shop:"clothes"},removeTags:{brand:"Tally Weijl","brand:wikidata":"Q689695","brand:wikipedia":"en:Tally Weijl",name:"Tally Weijl",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Tati":{name:"Tati",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3516026"},addTags:{brand:"Tati","brand:wikidata":"Q3516026","brand:wikipedia":"fr:Tati (entreprise)",name:"Tati",shop:"clothes"},removeTags:{brand:"Tati","brand:wikidata":"Q3516026","brand:wikipedia":"fr:Tati (entreprise)",name:"Tati",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Tezenis":{name:"Tezenis",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q28056374"},addTags:{brand:"Tezenis","brand:wikidata":"Q28056374",name:"Tezenis",shop:"clothes"},removeTags:{brand:"Tezenis","brand:wikidata":"Q28056374",name:"Tezenis",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/The Children's Place":{name:"The Children's Place",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3520257"},addTags:{brand:"The Children's Place","brand:wikidata":"Q3520257","brand:wikipedia":"en:The Children's Place",name:"The Children's Place",shop:"clothes"},removeTags:{brand:"The Children's Place","brand:wikidata":"Q3520257","brand:wikipedia":"en:The Children's Place",name:"The Children's Place",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/The North Face":{name:"The North Face",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q152784"},addTags:{brand:"The North Face","brand:wikidata":"Q152784","brand:wikipedia":"en:The North Face",name:"The North Face",shop:"clothes"},removeTags:{brand:"The North Face","brand:wikidata":"Q152784","brand:wikipedia":"en:The North Face",name:"The North Face",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/The Sting":{name:"The Sting",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2518794"},addTags:{brand:"The Sting","brand:wikidata":"Q2518794","brand:wikipedia":"nl:The Sting Companies",name:"The Sting",shop:"clothes"},removeTags:{brand:"The Sting","brand:wikidata":"Q2518794","brand:wikipedia":"nl:The Sting Companies",name:"The Sting",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Timberland":{name:"Timberland",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1539185"},addTags:{brand:"Timberland","brand:wikidata":"Q1539185","brand:wikipedia":"en:The Timberland Company",name:"Timberland",shop:"clothes"},removeTags:{brand:"Timberland","brand:wikidata":"Q1539185","brand:wikipedia":"en:The Timberland Company",name:"Timberland",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Tom Tailor":{name:"Tom Tailor",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q571206"},addTags:{brand:"Tom Tailor","brand:wikidata":"Q571206","brand:wikipedia":"en:Tom Tailor",name:"Tom Tailor",shop:"clothes"},removeTags:{brand:"Tom Tailor","brand:wikidata":"Q571206","brand:wikipedia":"en:Tom Tailor",name:"Tom Tailor",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Tommy Hilfiger":{name:"Tommy Hilfiger",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q634881"},addTags:{brand:"Tommy Hilfiger","brand:wikidata":"Q634881","brand:wikipedia":"en:Tommy Hilfiger (company)",name:"Tommy Hilfiger",shop:"clothes"},removeTags:{brand:"Tommy Hilfiger","brand:wikidata":"Q634881","brand:wikipedia":"en:Tommy Hilfiger (company)",name:"Tommy Hilfiger",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Topshop":{name:"Topshop",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1893576"},addTags:{brand:"Topshop","brand:wikidata":"Q1893576","brand:wikipedia":"en:Topshop",name:"Topshop",shop:"clothes"},removeTags:{brand:"Topshop","brand:wikidata":"Q1893576","brand:wikipedia":"en:Topshop",name:"Topshop",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Torrid":{name:"Torrid",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7827120"},addTags:{brand:"Torrid","brand:wikidata":"Q7827120","brand:wikipedia":"en:Torrid (clothing retailer)",name:"Torrid",shop:"clothes"},removeTags:{brand:"Torrid","brand:wikidata":"Q7827120","brand:wikipedia":"en:Torrid (clothing retailer)",name:"Torrid",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Triumph":{name:"Triumph",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q671216"},addTags:{brand:"Triumph","brand:wikidata":"Q671216","brand:wikipedia":"en:Triumph International",name:"Triumph",shop:"clothes"},removeTags:{brand:"Triumph","brand:wikidata":"Q671216","brand:wikipedia":"en:Triumph International",name:"Triumph",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Truworths":{name:"Truworths",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q24233998"},addTags:{brand:"Truworths","brand:wikidata":"Q24233998","brand:wikipedia":"en:Truworths",name:"Truworths",shop:"clothes"},removeTags:{brand:"Truworths","brand:wikidata":"Q24233998","brand:wikipedia":"en:Truworths",name:"Truworths",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ulla Popken":{name:"Ulla Popken",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2475146"},addTags:{brand:"Ulla Popken","brand:wikidata":"Q2475146","brand:wikipedia":"en:Ulla Popken",name:"Ulla Popken",shop:"clothes"},removeTags:{brand:"Ulla Popken","brand:wikidata":"Q2475146","brand:wikipedia":"en:Ulla Popken",name:"Ulla Popken",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Uniqlo":{name:"Uniqlo",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q26070"},addTags:{brand:"Uniqlo","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"Uniqlo",shop:"clothes"},removeTags:{brand:"Uniqlo","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"Uniqlo",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/United Colors of Benetton":{name:"United Colors of Benetton",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q817139"},addTags:{brand:"United Colors of Benetton","brand:wikidata":"Q817139","brand:wikipedia":"en:Benetton Group",name:"United Colors of Benetton",shop:"clothes"},removeTags:{brand:"United Colors of Benetton","brand:wikidata":"Q817139","brand:wikipedia":"en:Benetton Group",name:"United Colors of Benetton",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Urban Outfitters":{name:"Urban Outfitters",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3552193"},addTags:{brand:"Urban Outfitters","brand:wikidata":"Q3552193","brand:wikipedia":"en:Urban Outfitters",name:"Urban Outfitters",shop:"clothes"},removeTags:{brand:"Urban Outfitters","brand:wikidata":"Q3552193","brand:wikipedia":"en:Urban Outfitters",name:"Urban Outfitters",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Vero Moda":{name:"Vero Moda",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q594721"},addTags:{brand:"Vero Moda","brand:wikidata":"Q594721","brand:wikipedia":"en:Bestseller (company)",name:"Vero Moda",shop:"clothes"},removeTags:{brand:"Vero Moda","brand:wikidata":"Q594721","brand:wikipedia":"en:Bestseller (company)",name:"Vero Moda",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Victoria's Secret":{name:"Victoria's Secret",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q332477"},addTags:{brand:"Victoria's Secret","brand:wikidata":"Q332477","brand:wikipedia":"en:Victoria's Secret",name:"Victoria's Secret",shop:"clothes"},removeTags:{brand:"Victoria's Secret","brand:wikidata":"Q332477","brand:wikipedia":"en:Victoria's Secret",name:"Victoria's Secret",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/WE":{name:"WE",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1987861"},addTags:{brand:"WE","brand:wikidata":"Q1987861","brand:wikipedia":"en:WE (clothing)",name:"WE",shop:"clothes"},removeTags:{brand:"WE","brand:wikidata":"Q1987861","brand:wikipedia":"en:WE (clothing)",name:"WE",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/White House Black Market":{name:"White House Black Market",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7994858"},addTags:{brand:"White House Black Market","brand:wikidata":"Q7994858","brand:wikipedia":"en:White House Black Market",name:"White House Black Market",shop:"clothes"},removeTags:{brand:"White House Black Market","brand:wikidata":"Q7994858","brand:wikipedia":"en:White House Black Market",name:"White House Black Market",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/White Stuff":{name:"White Stuff",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7995442"},addTags:{brand:"White Stuff","brand:wikidata":"Q7995442","brand:wikipedia":"en:White Stuff Clothing",name:"White Stuff",shop:"clothes"},removeTags:{brand:"White Stuff","brand:wikidata":"Q7995442","brand:wikipedia":"en:White Stuff Clothing",name:"White Stuff",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Wibra":{name:"Wibra",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q943405"},addTags:{brand:"Wibra","brand:wikidata":"Q943405","brand:wikipedia":"en:Wibra",name:"Wibra",shop:"clothes"},removeTags:{brand:"Wibra","brand:wikidata":"Q943405","brand:wikipedia":"en:Wibra",name:"Wibra",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Winners":{name:"Winners",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q845257"},addTags:{brand:"Winners","brand:wikidata":"Q845257","brand:wikipedia":"en:Winners",name:"Winners",shop:"clothes"},removeTags:{brand:"Winners","brand:wikidata":"Q845257","brand:wikipedia":"en:Winners",name:"Winners",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Woolworths":{name:"Woolworths",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q8033997"},addTags:{brand:"Woolworths","brand:wikidata":"Q8033997","brand:wikipedia":"en:Woolworths (South Africa)",name:"Woolworths",shop:"clothes"},removeTags:{brand:"Woolworths","brand:wikidata":"Q8033997","brand:wikipedia":"en:Woolworths (South Africa)",name:"Woolworths",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Yamamay":{name:"Yamamay",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2599214"},addTags:{brand:"Yamamay","brand:wikidata":"Q2599214","brand:wikipedia":"it:Yamamay",name:"Yamamay",shop:"clothes"},removeTags:{brand:"Yamamay","brand:wikidata":"Q2599214","brand:wikipedia":"it:Yamamay",name:"Yamamay",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Zara":{name:"Zara",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q147662"},addTags:{brand:"Zara","brand:wikidata":"Q147662","brand:wikipedia":"en:Zara (retailer)",name:"Zara",shop:"clothes"},removeTags:{brand:"Zara","brand:wikidata":"Q147662","brand:wikipedia":"en:Zara (retailer)",name:"Zara",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Zeeman":{name:"Zeeman",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q184399"},addTags:{brand:"Zeeman","brand:wikidata":"Q184399","brand:wikipedia":"en:Zeeman (store)",name:"Zeeman",shop:"clothes"},removeTags:{brand:"Zeeman","brand:wikidata":"Q184399","brand:wikipedia":"en:Zeeman (store)",name:"Zeeman",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Zumiez":{name:"Zumiez",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q8075252"},addTags:{brand:"Zumiez","brand:wikidata":"Q8075252","brand:wikipedia":"en:Zumiez",name:"Zumiez",shop:"clothes"},removeTags:{brand:"Zumiez","brand:wikidata":"Q8075252","brand:wikipedia":"en:Zumiez",name:"Zumiez",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/mister*lady":{name:"mister*lady",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q18640136"},addTags:{brand:"mister*lady","brand:wikidata":"Q18640136","brand:wikipedia":"de:mister*lady",name:"mister*lady",shop:"clothes"},removeTags:{brand:"mister*lady","brand:wikidata":"Q18640136","brand:wikipedia":"de:mister*lady",name:"mister*lady",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/rue21":{name:"rue21",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7377762"},addTags:{brand:"rue21","brand:wikidata":"Q7377762","brand:wikipedia":"en:rue21",name:"rue21",shop:"clothes"},removeTags:{brand:"rue21","brand:wikidata":"Q7377762","brand:wikipedia":"en:rue21",name:"rue21",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/s.Oliver":{name:"s.Oliver",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q265056"},addTags:{brand:"s.Oliver","brand:wikidata":"Q265056","brand:wikipedia":"en:S.Oliver",name:"s.Oliver",shop:"clothes"},removeTags:{brand:"s.Oliver","brand:wikidata":"Q265056","brand:wikipedia":"en:S.Oliver",name:"s.Oliver",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/しまむら":{name:"しまむら",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7758173"},addTags:{brand:"しまむら","brand:wikidata":"Q7758173","brand:wikipedia":"ja:しまむら",name:"しまむら",shop:"clothes"},removeTags:{brand:"しまむら","brand:wikidata":"Q7758173","brand:wikipedia":"ja:しまむら",name:"しまむら",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/はるやま":{name:"はるやま",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q11275918"},addTags:{brand:"はるやま","brand:wikidata":"Q11275918","brand:wikipedia":"ja:はるやま商事",name:"はるやま",shop:"clothes"},removeTags:{brand:"はるやま","brand:wikidata":"Q11275918","brand:wikipedia":"ja:はるやま商事",name:"はるやま",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/ユニクロ":{name:"ユニクロ",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q26070"},addTags:{brand:"ユニクロ","brand:en":"UNIQLO","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"ユニクロ","name:en":"UNIQLO",shop:"clothes"},removeTags:{brand:"ユニクロ","brand:en":"UNIQLO","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"ユニクロ","name:en":"UNIQLO",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/ワークマン":{name:"ワークマン",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q11351660"},addTags:{brand:"ワークマン","brand:wikidata":"Q11351660","brand:wikipedia":"ja:ワークマン",name:"ワークマン",shop:"clothes"},removeTags:{brand:"ワークマン","brand:wikidata":"Q11351660","brand:wikipedia":"ja:ワークマン",name:"ワークマン",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/洋服の青山":{name:"洋服の青山",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q11661241"},addTags:{brand:"洋服の青山","brand:wikidata":"Q11661241","brand:wikipedia":"ja:青山商事",name:"洋服の青山",shop:"clothes"},removeTags:{brand:"洋服の青山","brand:wikidata":"Q11661241","brand:wikipedia":"ja:青山商事",name:"洋服の青山",shop:"clothes"},matchScore:2,suggestion:true},"shop/coffee/Nespresso":{name:"Nespresso",icon:"maki-shop",geometry:["point","area"],tags:{shop:"coffee","brand:wikidata":"Q301301"},addTags:{brand:"Nespresso","brand:wikidata":"Q301301","brand:wikipedia":"en:Nespresso",name:"Nespresso",shop:"coffee"},removeTags:{brand:"Nespresso","brand:wikidata":"Q301301","brand:wikipedia":"en:Nespresso",name:"Nespresso",shop:"coffee"},matchScore:2,suggestion:true},"shop/coffee/Tchibo":{name:"Tchibo",icon:"maki-shop",geometry:["point","area"],tags:{shop:"coffee","brand:wikidata":"Q564213"},addTags:{brand:"Tchibo","brand:wikidata":"Q564213","brand:wikipedia":"de:Tchibo",name:"Tchibo",shop:"coffee"},removeTags:{brand:"Tchibo","brand:wikidata":"Q564213","brand:wikipedia":"de:Tchibo",name:"Tchibo",shop:"coffee"},matchScore:2,suggestion:true},"shop/computer/PC World":{name:"PC World",icon:"maki-shop",geometry:["point","area"],tags:{shop:"computer","brand:wikidata":"Q7118727"},addTags:{brand:"PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"PC World",shop:"computer"},removeTags:{brand:"PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"PC World",shop:"computer"},matchScore:2,suggestion:true},"shop/confectionery/Adyar Ananda Bhavan":{name:"Adyar Ananda Bhavan",icon:"maki-confectionery",geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q15178238"},addTags:{shop:"confectionery",brand:"Adyar Ananda Bhavan","brand:wikidata":"Q15178238","brand:wikipedia":"en:Adyar Ananda Bhavan",name:"Adyar Ananda Bhavan"},removeTags:{shop:"confectionery",brand:"Adyar Ananda Bhavan","brand:wikidata":"Q15178238","brand:wikipedia":"en:Adyar Ananda Bhavan",name:"Adyar Ananda Bhavan"},matchScore:2,suggestion:true},"shop/confectionery/Hemmakvall":{name:"Hemmakvall",icon:"maki-confectionery",geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q10521791"},addTags:{amenity:"confectionery","brand:wikipedia":"sv:Hemmakväll","brand:wikidata":"Q10521791",name:"Hemmakväll"},removeTags:{amenity:"confectionery","brand:wikipedia":"sv:Hemmakväll","brand:wikidata":"Q10521791",name:"Hemmakväll"},matchScore:2,suggestion:true},"shop/confectionery/Hussel":{name:"Hussel",icon:"maki-confectionery",geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q17123688"},addTags:{brand:"Hussel","brand:wikidata":"Q17123688","brand:wikipedia":"de:Hussel",name:"Hussel",shop:"confectionery"},removeTags:{brand:"Hussel","brand:wikidata":"Q17123688","brand:wikipedia":"de:Hussel",name:"Hussel",shop:"confectionery"},matchScore:2,suggestion:true},"shop/confectionery/Jamin":{name:"Jamin",icon:"maki-confectionery",geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q2291848"},addTags:{brand:"Jamin","brand:wikidata":"Q2291848","brand:wikipedia":"nl:Jamin",name:"Jamin",shop:"confectionery"},removeTags:{brand:"Jamin","brand:wikidata":"Q2291848","brand:wikipedia":"nl:Jamin",name:"Jamin",shop:"confectionery"},matchScore:2,suggestion:true},"shop/confectionery/Thorntons":{name:"Thorntons",icon:"maki-confectionery",geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q683102"},addTags:{brand:"Thorntons","brand:wikidata":"Q683102","brand:wikipedia":"en:Thorntons",name:"Thorntons",shop:"confectionery"},removeTags:{brand:"Thorntons","brand:wikidata":"Q683102","brand:wikipedia":"en:Thorntons",name:"Thorntons",shop:"confectionery"},matchScore:2,suggestion:true},"shop/confectionery/Вацак":{name:"Вацак",icon:"maki-confectionery",geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q30966576"},addTags:{brand:"Вацак","brand:wikidata":"Q30966576","brand:wikipedia":"uk:Кондитерський Дім «Вацак»",name:"Вацак",shop:"confectionery"},removeTags:{brand:"Вацак","brand:wikidata":"Q30966576","brand:wikipedia":"uk:Кондитерський Дім «Вацак»",name:"Вацак",shop:"confectionery"},matchScore:2,suggestion:true},"shop/confectionery/シャトレーゼ":{name:"シャトレーゼ",icon:"maki-confectionery",geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q11307696"},addTags:{brand:"シャトレーゼ","brand:wikidata":"Q11307696","brand:wikipedia":"ja:シャトレーゼ",name:"シャトレーゼ",shop:"confectionery"},removeTags:{brand:"シャトレーゼ","brand:wikidata":"Q11307696","brand:wikipedia":"ja:シャトレーゼ",name:"シャトレーゼ",shop:"confectionery"},matchScore:2,suggestion:true},"shop/convenience/7-Eleven":{name:"7-Eleven",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q259340"},addTags:{brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven",shop:"convenience"},removeTags:{brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/8 à Huit":{name:"8 à Huit",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q2818601"},addTags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"en:8 à Huit",name:"8 à Huit",shop:"convenience"},removeTags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"en:8 à Huit",name:"8 à Huit",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ABC":{name:"ABC",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q4650251"},addTags:{brand:"ABC","brand:wikidata":"Q4650251","brand:wikipedia":"en:ABC Stores (Hawaii)",name:"ABC",shop:"convenience"},removeTags:{brand:"ABC","brand:wikidata":"Q4650251","brand:wikipedia":"en:ABC Stores (Hawaii)",name:"ABC",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Aibė":{name:"Aibė",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1022952"},addTags:{brand:"Aibė","brand:wikidata":"Q1022952","brand:wikipedia":"de:Aibė",name:"Aibė",shop:"convenience"},removeTags:{brand:"Aibė","brand:wikidata":"Q1022952","brand:wikipedia":"de:Aibė",name:"Aibė",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Albert Heijn to go":{name:"Albert Heijn to go",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1653985"},addTags:{brand:"Albert Heijn to go","brand:wikidata":"Q1653985","brand:wikipedia":"en:Albert Heijn",name:"Albert Heijn to go",shop:"convenience"},removeTags:{brand:"Albert Heijn to go","brand:wikidata":"Q1653985","brand:wikipedia":"en:Albert Heijn",name:"Albert Heijn to go",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Alfamidi":{name:"Alfamidi",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q12471462"},addTags:{brand:"Alfamidi","brand:wikidata":"Q12471462","brand:wikipedia":"id:Alfamidi",name:"Alfamidi",shop:"convenience"},removeTags:{brand:"Alfamidi","brand:wikidata":"Q12471462","brand:wikipedia":"id:Alfamidi",name:"Alfamidi",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/BP Shop":{name:"BP Shop",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q152057"},addTags:{brand:"BP Shop","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP Shop",shop:"convenience"},removeTags:{brand:"BP Shop","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP Shop",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Buc-ee's":{name:"Buc-ee's",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q4982335"},addTags:{brand:"Buc-ee's","brand:wikidata":"Q4982335","brand:wikipedia":"en:Buc-ee's",name:"Buc-ee's",shop:"convenience"},removeTags:{brand:"Buc-ee's","brand:wikidata":"Q4982335","brand:wikipedia":"en:Buc-ee's",name:"Buc-ee's",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/COOP Jednota":{name:"COOP Jednota",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q41629254"},addTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"convenience"},removeTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Circle K":{name:"Circle K",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3268010"},addTags:{brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K",shop:"convenience"},removeTags:{brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Co-op":{name:"Co-op",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5440676"},addTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"convenience"},removeTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Coop Pronto":{name:"Coop Pronto",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1129777"},addTags:{brand:"Coop Pronto","brand:wikidata":"Q1129777","brand:wikipedia":"de:Coop Mineraloel",name:"Coop Pronto",shop:"convenience"},removeTags:{brand:"Coop Pronto","brand:wikidata":"Q1129777","brand:wikipedia":"de:Coop Mineraloel",name:"Coop Pronto",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/FamilyMart":{name:"FamilyMart",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1191685"},addTags:{brand:"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"FamilyMart",shop:"convenience"},removeTags:{brand:"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"FamilyMart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Four Square":{name:"Four Square",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5475558"},addTags:{brand:"Four Square","brand:wikidata":"Q5475558","brand:wikipedia":"en:Four Square (supermarket)",name:"Four Square",shop:"convenience"},removeTags:{brand:"Four Square","brand:wikidata":"Q5475558","brand:wikipedia":"en:Four Square (supermarket)",name:"Four Square",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Hasty Market":{name:"Hasty Market",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q58022603"},addTags:{brand:"Hasty Market","brand:wikidata":"Q58022603",name:"Hasty Market",shop:"convenience"},removeTags:{brand:"Hasty Market","brand:wikidata":"Q58022603",name:"Hasty Market",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Intermarché Contact":{name:"Intermarché Contact",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3153200"},addTags:{brand:"Intermarché Contact",name:"Intermarché Contact","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",shop:"convenience"},removeTags:{brand:"Intermarché Contact",name:"Intermarché Contact","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Jacksons":{name:"Jacksons",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q6117880"},addTags:{brand:"Jacksons","brand:wikidata":"Q6117880","brand:wikipedia":"en:Jacksons Stores",name:"Jacksons",shop:"convenience"},removeTags:{brand:"Jacksons","brand:wikidata":"Q6117880","brand:wikipedia":"en:Jacksons Stores",name:"Jacksons",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/K-Market":{name:"K-Market",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11868562"},addTags:{brand:"K-Market","brand:wikidata":"Q11868562","brand:wikipedia":"fi:K-Market",name:"K-Market",shop:"convenience"},removeTags:{brand:"K-Market","brand:wikidata":"Q11868562","brand:wikipedia":"fi:K-Market",name:"K-Market",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Kwik Trip":{name:"Kwik Trip",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q6450420"},addTags:{brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip",shop:"convenience"},removeTags:{brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Lawson":{name:"Lawson",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1557223"},addTags:{brand:"Lawson","brand:wikidata":"Q1557223","brand:wikipedia":"en:Lawson (store)",name:"Lawson",shop:"convenience"},removeTags:{brand:"Lawson","brand:wikidata":"Q1557223","brand:wikipedia":"en:Lawson (store)",name:"Lawson",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Mace":{name:"Mace",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q17089386"},addTags:{brand:"Mace","brand:wikidata":"Q17089386","brand:wikipedia":"en:Mace (shop)",name:"Mace",shop:"convenience"},removeTags:{brand:"Mace","brand:wikidata":"Q17089386","brand:wikipedia":"en:Mace (shop)",name:"Mace",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Marathon":{name:"Marathon",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q458363"},addTags:{brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon",shop:"convenience"},removeTags:{brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Małpka Express":{name:"Małpka Express",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q18431946"},addTags:{brand:"Małpka Express","brand:wikidata":"Q18431946","brand:wikipedia":"en:Małpka Express",name:"Małpka Express",shop:"convenience"},removeTags:{brand:"Małpka Express","brand:wikidata":"Q18431946","brand:wikipedia":"en:Małpka Express",name:"Małpka Express",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/McColl's":{name:"McColl's",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q16997477"},addTags:{brand:"McColl's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"McColl's",shop:"convenience"},removeTags:{brand:"McColl's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"McColl's",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Migrolino":{name:"Migrolino",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q56745088"},addTags:{brand:"Migrolino","brand:wikidata":"Q56745088","brand:wikipedia":"de:Migrolino",name:"Migrolino",shop:"convenience"},removeTags:{brand:"Migrolino","brand:wikidata":"Q56745088","brand:wikipedia":"de:Migrolino",name:"Migrolino",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Ministop":{name:"Ministop",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1038929"},addTags:{brand:"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"en:Ministop",name:"Ministop",shop:"convenience"},removeTags:{brand:"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"en:Ministop",name:"Ministop",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Mobil Mart":{name:"Mobil Mart",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3088656"},addTags:{brand:"Mobil Mart","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil Mart",shop:"convenience"},removeTags:{brand:"Mobil Mart","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil Mart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Nisa":{name:"Nisa",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q16999069"},addTags:{brand:"Nisa","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa",shop:"convenience"},removeTags:{brand:"Nisa","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Nisa Local":{name:"Nisa Local",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q16999069"},addTags:{brand:"Nisa Local","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa Local",shop:"convenience"},removeTags:{brand:"Nisa Local","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa Local",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/OK便利商店":{name:"OK便利商店",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3268010"},addTags:{brand:"OK便利商店","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"zh:OK便利店",name:"OK便利商店","name:en":"Circle K",shop:"convenience"},removeTags:{brand:"OK便利商店","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"zh:OK便利店",name:"OK便利商店","name:en":"Circle K",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/On the Run":{name:"On the Run",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q16931259"},addTags:{brand:"On the Run","brand:wikidata":"Q16931259","brand:wikipedia":"en:On the Run (convenience store)",name:"On the Run",shop:"convenience"},removeTags:{brand:"On the Run","brand:wikidata":"Q16931259","brand:wikipedia":"en:On the Run (convenience store)",name:"On the Run",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Oxxo":{name:"Oxxo",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1342538"},addTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",shop:"convenience"},removeTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Petro-Canada":{name:"Petro-Canada",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1208279"},addTags:{brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada",shop:"convenience"},removeTags:{brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Plaid Pantry":{name:"Plaid Pantry",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7200591"},addTags:{brand:"Plaid Pantry","brand:wikidata":"Q7200591","brand:wikipedia":"en:Plaid Pantry",name:"Plaid Pantry",shop:"convenience"},removeTags:{brand:"Plaid Pantry","brand:wikidata":"Q7200591","brand:wikipedia":"en:Plaid Pantry",name:"Plaid Pantry",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Premier":{name:"Premier",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7240340"},addTags:{brand:"Premier","brand:wikidata":"Q7240340","brand:wikipedia":"en:Premier Stores",name:"Premier",shop:"convenience"},removeTags:{brand:"Premier","brand:wikidata":"Q7240340","brand:wikipedia":"en:Premier Stores",name:"Premier",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Sainsbury's Local":{name:"Sainsbury's Local",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q13218434"},addTags:{brand:"Sainsbury's Local","brand:wikidata":"Q13218434","brand:wikipedia":"en:Sainsbury's Local",name:"Sainsbury's Local",shop:"convenience"},removeTags:{brand:"Sainsbury's Local","brand:wikidata":"Q13218434","brand:wikipedia":"en:Sainsbury's Local",name:"Sainsbury's Local",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Sheetz":{name:"Sheetz",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7492551"},addTags:{brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz",shop:"convenience"},removeTags:{brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Shell Select":{name:"Shell Select",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q154950"},addTags:{brand:"Shell Select","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell Select",shop:"convenience"},removeTags:{brand:"Shell Select","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell Select",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Siwa":{name:"Siwa",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11893827"},addTags:{brand:"Siwa","brand:wikidata":"Q11893827",name:"Siwa",shop:"convenience"},removeTags:{brand:"Siwa","brand:wikidata":"Q11893827",name:"Siwa",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Spar":{name:"Spar",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q610492"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"convenience"},removeTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Spar Express":{name:"Spar Express",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q610492"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar Express",shop:"convenience"},removeTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar Express",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Speedway":{name:"Speedway",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7575683"},addTags:{brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway",shop:"convenience"},removeTags:{brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Społem":{name:"Społem",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11826043"},addTags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"convenience"},removeTags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Stripes":{name:"Stripes",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7624135"},addTags:{brand:"Stripes","brand:wikidata":"Q7624135","brand:wikipedia":"en:Stripes Convenience Stores",name:"Stripes",shop:"convenience"},removeTags:{brand:"Stripes","brand:wikidata":"Q7624135","brand:wikipedia":"en:Stripes Convenience Stores",name:"Stripes",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/The Co-operative Food":{name:"The Co-operative Food",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3277439"},addTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"convenience"},removeTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Tiger Mart":{name:"Tiger Mart",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q57643977"},addTags:{brand:"Tiger Mart","brand:wikidata":"Q57643977",name:"Tiger Mart",shop:"convenience"},removeTags:{brand:"Tiger Mart","brand:wikidata":"Q57643977",name:"Tiger Mart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/United Dairy Farmers":{name:"United Dairy Farmers",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7887677"},addTags:{amenity:"ice_cream",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"United Dairy Farmers",shop:"convenience",short_name:"UDF"},removeTags:{amenity:"ice_cream",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"United Dairy Farmers",shop:"convenience",short_name:"UDF"},matchScore:2,suggestion:true},"shop/convenience/Utile":{name:"Utile",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q2529029"},addTags:{brand:"Utile","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Utile",shop:"convenience"},removeTags:{brand:"Utile","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Utile",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/VinMart+":{name:"VinMart+",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q60245505"},addTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart+",shop:"convenience"},removeTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart+",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Wawa":{name:"Wawa",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5936320"},addTags:{brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa",shop:"convenience"},removeTags:{brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Weltladen":{name:"Weltladen",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1640782"},addTags:{brand:"Weltladen","brand:wikidata":"Q1640782","brand:wikipedia":"de:Weltladen",name:"Weltladen",shop:"convenience"},removeTags:{brand:"Weltladen","brand:wikidata":"Q1640782","brand:wikipedia":"de:Weltladen",name:"Weltladen",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Woolworths Petrol":{name:"Woolworths Petrol",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5023980"},addTags:{brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol",shop:"convenience"},removeTags:{brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/abc":{name:"abc",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11683985"},addTags:{brand:"abc","brand:wikidata":"Q11683985","brand:wikipedia":"pl:abc (sieć handlowa)",name:"abc",shop:"convenience"},removeTags:{brand:"abc","brand:wikidata":"Q11683985","brand:wikipedia":"pl:abc (sieć handlowa)",name:"abc",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ampm":{name:"ampm",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q306960"},addTags:{brand:"ampm","brand:wikidata":"Q306960","brand:wikipedia":"en:Ampm",name:"ampm",shop:"convenience"},removeTags:{brand:"ampm","brand:wikidata":"Q306960","brand:wikipedia":"en:Ampm",name:"ampm",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Żabka":{name:"Żabka",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q2589061"},addTags:{brand:"Żabka","brand:wikidata":"Q2589061","brand:wikipedia":"en:Żabka (convenience store)",name:"Żabka",shop:"convenience"},removeTags:{brand:"Żabka","brand:wikidata":"Q2589061","brand:wikipedia":"en:Żabka (convenience store)",name:"Żabka",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ВкусВилл":{name:"ВкусВилл",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q57271676"},addTags:{brand:"ВкусВилл","brand:wikidata":"Q57271676","brand:wikipedia":"ru:ВкусВилл",name:"ВкусВилл",shop:"convenience"},removeTags:{brand:"ВкусВилл","brand:wikidata":"Q57271676","brand:wikipedia":"ru:ВкусВилл",name:"ВкусВилл",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Доброном":{name:"Доброном",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q2565040"},addTags:{brand:"Доброном","brand:wikidata":"Q2565040","brand:wikipedia":"be:Eurotorg",name:"Доброном",shop:"convenience"},removeTags:{brand:"Доброном","brand:wikidata":"Q2565040","brand:wikipedia":"be:Eurotorg",name:"Доброном",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Копейка":{name:"Копейка",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1783878"},addTags:{brand:"Копейка","brand:en":"Kopeyka","brand:wikidata":"Q1783878","brand:wikipedia":"en:Kopeyka (supermarket)",name:"Копейка","name:en":"Kopeyka",shop:"convenience"},removeTags:{brand:"Копейка","brand:en":"Kopeyka","brand:wikidata":"Q1783878","brand:wikipedia":"en:Kopeyka (supermarket)",name:"Копейка","name:en":"Kopeyka",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Магнит":{name:"Магнит",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q940518"},addTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"convenience"},removeTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Сельпо":{name:"Сельпо",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q4419434"},addTags:{brand:"Сельпо","brand:wikidata":"Q4419434","brand:wikipedia":"ru:Сильпо",name:"Сельпо",shop:"convenience"},removeTags:{brand:"Сельпо","brand:wikidata":"Q4419434","brand:wikipedia":"ru:Сильпо",name:"Сельпо",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/サンクス":{name:"サンクス",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q16141064"},addTags:{brand:"サンクス","brand:en":"Sunkus","brand:wikidata":"Q16141064","brand:wikipedia":"ja:サークルKサンクス",name:"サンクス","name:en":"Sunkus",shop:"convenience"},removeTags:{brand:"サンクス","brand:en":"Sunkus","brand:wikidata":"Q16141064","brand:wikipedia":"ja:サークルKサンクス",name:"サンクス","name:en":"Sunkus",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/サークルK":{name:"サークルK",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3268010"},addTags:{brand:"サークルK","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"サークルK","name:en":"Circle K",shop:"convenience"},removeTags:{brand:"サークルK","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"サークルK","name:en":"Circle K",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/スリーエフ":{name:"スリーエフ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11313419"},addTags:{brand:"スリーエフ","brand:en":"Three F","brand:wikidata":"Q11313419","brand:wikipedia":"ja:スリーエフ",name:"スリーエフ","name:en":"Three F",shop:"convenience"},removeTags:{brand:"スリーエフ","brand:en":"Three F","brand:wikidata":"Q11313419","brand:wikipedia":"ja:スリーエフ",name:"スリーエフ","name:en":"Three F",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/セイコーマート":{name:"セイコーマート",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11314123"},addTags:{brand:"セイコーマート","brand:en":"Seicomart","brand:wikidata":"Q11314123","brand:wikipedia":"ja:セイコーマート",name:"セイコーマート","name:en":"Seicomart",shop:"convenience"},removeTags:{brand:"セイコーマート","brand:en":"Seicomart","brand:wikidata":"Q11314123","brand:wikipedia":"ja:セイコーマート",name:"セイコーマート","name:en":"Seicomart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/セブン-イレブン":{name:"セブン-イレブン",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q259340"},addTags:{brand:"セブン-イレブン","brand:en":"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"セブン-イレブン","name:en":"7-Eleven",shop:"convenience"},removeTags:{brand:"セブン-イレブン","brand:en":"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"セブン-イレブン","name:en":"7-Eleven",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/セーブオン":{name:"セーブオン",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11314868"},addTags:{brand:"セーブオン","brand:en":"Save On","brand:wikidata":"Q11314868","brand:wikipedia":"ja:セーブオン",name:"セーブオン","name:en":"Save On",shop:"convenience"},removeTags:{brand:"セーブオン","brand:en":"Save On","brand:wikidata":"Q11314868","brand:wikipedia":"ja:セーブオン",name:"セーブオン","name:en":"Save On",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/デイリーヤマザキ":{name:"デイリーヤマザキ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5209392"},addTags:{brand:"デイリーヤマザキ","brand:en":"Daily Yamazaki","brand:wikidata":"Q5209392","brand:wikipedia":"en:Daily Yamazaki",name:"デイリーヤマザキ","name:en":"Daily Yamazaki",shop:"convenience"},removeTags:{brand:"デイリーヤマザキ","brand:en":"Daily Yamazaki","brand:wikidata":"Q5209392","brand:wikipedia":"en:Daily Yamazaki",name:"デイリーヤマザキ","name:en":"Daily Yamazaki",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ファミリーマート":{name:"ファミリーマート",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1191685"},addTags:{brand:"ファミリーマート","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"ファミリーマート","name:en":"FamilyMart",shop:"convenience"},removeTags:{brand:"ファミリーマート","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"ファミリーマート","name:en":"FamilyMart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ポプラ":{name:"ポプラ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7229380"},addTags:{brand:"ポプラ","brand:wikidata":"Q7229380","brand:wikipedia":"ja:ポプラ (コンビニエンスストア)",name:"ポプラ","name:en":"Poplar",shop:"convenience"},removeTags:{brand:"ポプラ","brand:wikidata":"Q7229380","brand:wikipedia":"ja:ポプラ (コンビニエンスストア)",name:"ポプラ","name:en":"Poplar",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ミニストップ":{name:"ミニストップ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1038929"},addTags:{brand:"ミニストップ","brand:en":"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"ja:ミニストップ",name:"ミニストップ","name:en":"Ministop",shop:"convenience"},removeTags:{brand:"ミニストップ","brand:en":"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"ja:ミニストップ",name:"ミニストップ","name:en":"Ministop",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ヤマザキショップ":{name:"ヤマザキショップ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11345131"},addTags:{brand:"ヤマザキショップ","brand:wikidata":"Q11345131","brand:wikipedia":"ja:ヤマザキショップ",name:"ヤマザキショップ","name:en":"Yamazaki Shop",shop:"convenience"},removeTags:{brand:"ヤマザキショップ","brand:wikidata":"Q11345131","brand:wikipedia":"ja:ヤマザキショップ",name:"ヤマザキショップ","name:en":"Yamazaki Shop",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ローソン":{name:"ローソン",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1557223"},addTags:{brand:"ローソン","brand:en":"LAWSON","brand:wikidata":"Q1557223","brand:wikipedia":"ja:ローソン",name:"ローソン","name:en":"Lawson",shop:"convenience"},removeTags:{brand:"ローソン","brand:en":"LAWSON","brand:wikidata":"Q1557223","brand:wikipedia":"ja:ローソン",name:"ローソン","name:en":"Lawson",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ローソンストア100":{name:"ローソンストア100",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11350960"},addTags:{brand:"ローソンストア100","brand:wikidata":"Q11350960","brand:wikipedia":"ja:ローソンストア100",name:"ローソンストア100",shop:"convenience"},removeTags:{brand:"ローソンストア100","brand:wikidata":"Q11350960","brand:wikipedia":"ja:ローソンストア100",name:"ローソンストア100",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/全家":{name:"全家",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1191685"},addTags:{brand:"全家","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"全家","name:en":"FamilyMart",shop:"convenience"},removeTags:{brand:"全家","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"全家","name:en":"FamilyMart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/全家便利商店":{name:"全家便利商店",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q10891564"},addTags:{brand:"全家便利商店","brand:wikidata":"Q10891564","brand:wikipedia":"zh:全家便利商店",name:"全家便利商店",shop:"convenience"},removeTags:{brand:"全家便利商店","brand:wikidata":"Q10891564","brand:wikipedia":"zh:全家便利商店",name:"全家便利商店",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/萊爾富":{name:"萊爾富",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11326216"},addTags:{brand:"萊爾富","brand:wikidata":"Q11326216","brand:wikipedia":"zh:萊爾富",name:"萊爾富",shop:"convenience"},removeTags:{brand:"萊爾富","brand:wikidata":"Q11326216","brand:wikipedia":"zh:萊爾富",name:"萊爾富",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/세븐일레븐":{name:"세븐일레븐",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q259340"},addTags:{brand:"세븐일레븐","brand:en":"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"세븐일레븐","name:en":"7-Eleven",shop:"convenience"},removeTags:{brand:"세븐일레븐","brand:en":"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"세븐일레븐","name:en":"7-Eleven",shop:"convenience"},matchScore:2,suggestion:true},"shop/copyshop/FedEx Office":{name:"FedEx Office",icon:"fas-print",geometry:["point","area"],tags:{shop:"copyshop","brand:wikidata":"Q474379"},addTags:{brand:"FedEx Office","brand:wikidata":"Q474379","brand:wikipedia":"en:FedEx Office",name:"FedEx Office",shop:"copyshop"},removeTags:{brand:"FedEx Office","brand:wikidata":"Q474379","brand:wikipedia":"en:FedEx Office",name:"FedEx Office",shop:"copyshop"},matchScore:2,suggestion:true},"shop/cosmetics/KIKO Milano":{name:"KIKO Milano",icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q3812045"},addTags:{brand:"KIKO Milano","brand:wikidata":"Q3812045","brand:wikipedia":"it:KIKO",name:"KIKO Milano",shop:"cosmetics"},removeTags:{brand:"KIKO Milano","brand:wikidata":"Q3812045","brand:wikipedia":"it:KIKO",name:"KIKO Milano",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Lush":{name:"Lush",icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q1585448"},addTags:{brand:"Lush","brand:wikidata":"Q1585448","brand:wikipedia":"en:Lush (company)",name:"Lush",shop:"cosmetics"},removeTags:{brand:"Lush","brand:wikidata":"Q1585448","brand:wikipedia":"en:Lush (company)",name:"Lush",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Nocibé":{name:"Nocibé",icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q3342592"},addTags:{brand:"Nocibé","brand:wikidata":"Q3342592","brand:wikipedia":"fr:Nocibé",name:"Nocibé",shop:"cosmetics"},removeTags:{brand:"Nocibé","brand:wikidata":"Q3342592","brand:wikipedia":"fr:Nocibé",name:"Nocibé",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Origins":{name:"Origins",icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q6643229"},addTags:{brand:"Origins","brand:wikidata":"Q6643229","brand:wikipedia":"en:Origins (cosmetics)",name:"Origins",shop:"cosmetics"},removeTags:{brand:"Origins","brand:wikidata":"Q6643229","brand:wikipedia":"en:Origins (cosmetics)",name:"Origins",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Sephora":{name:"Sephora",icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q2408041"},addTags:{brand:"Sephora","brand:wikidata":"Q2408041","brand:wikipedia":"en:Sephora",name:"Sephora",shop:"cosmetics"},removeTags:{brand:"Sephora","brand:wikidata":"Q2408041","brand:wikipedia":"en:Sephora",name:"Sephora",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/The Body Shop":{name:"The Body Shop",icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q837851"},addTags:{brand:"The Body Shop","brand:wikidata":"Q837851","brand:wikipedia":"en:The Body Shop",name:"The Body Shop",shop:"cosmetics"},removeTags:{brand:"The Body Shop","brand:wikidata":"Q837851","brand:wikipedia":"en:The Body Shop",name:"The Body Shop",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Л'Этуаль":{name:"Л'Этуаль",icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q18400706"},addTags:{brand:"Л'Этуаль","brand:wikidata":"Q18400706","brand:wikipedia":"ru:Л’Этуаль",name:"Л'Этуаль",shop:"cosmetics"},removeTags:{brand:"Л'Этуаль","brand:wikidata":"Q18400706","brand:wikipedia":"ru:Л’Этуаль",name:"Л'Этуаль",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Магнит Косметик":{name:"Магнит Косметик",icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q940518"},addTags:{brand:"Магнит Косметик","brand:en":"Magnit Cosmetics","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит Косметик","name:en":"Magnit Cosmetics",shop:"cosmetics"},removeTags:{brand:"Магнит Косметик","brand:en":"Magnit Cosmetics","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит Косметик","name:en":"Magnit Cosmetics",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/country_store/Rural King":{name:"Rural King",icon:"maki-shop",geometry:["point","area"],tags:{shop:"country_store","brand:wikidata":"Q7380525"},addTags:{brand:"Rural King","brand:wikidata":"Q7380525","brand:wikipedia":"en:Rural King",name:"Rural King",shop:"country_store"},removeTags:{brand:"Rural King","brand:wikidata":"Q7380525","brand:wikipedia":"en:Rural King",name:"Rural King",shop:"country_store"},matchScore:2,suggestion:true},"shop/country_store/Tractor Supply Company":{name:"Tractor Supply Company",icon:"maki-shop",geometry:["point","area"],tags:{shop:"country_store","brand:wikidata":"Q15109925"},addTags:{brand:"Tractor Supply Company","brand:wikidata":"Q15109925","brand:wikipedia":"en:Tractor Supply Company",name:"Tractor Supply Company",shop:"country_store"},removeTags:{brand:"Tractor Supply Company","brand:wikidata":"Q15109925","brand:wikipedia":"en:Tractor Supply Company",name:"Tractor Supply Company",shop:"country_store"},matchScore:2,suggestion:true},"shop/craft/Hobby Lobby":{name:"Hobby Lobby",icon:"maki-shop",geometry:["point","area"],tags:{shop:"craft","brand:wikidata":"Q5874938"},addTags:{brand:"Hobby Lobby","brand:wikidata":"Q5874938","brand:wikipedia":"en:Hobby Lobby",name:"Hobby Lobby",shop:"craft"},removeTags:{brand:"Hobby Lobby","brand:wikidata":"Q5874938","brand:wikipedia":"en:Hobby Lobby",name:"Hobby Lobby",shop:"craft"},matchScore:2,suggestion:true},"shop/craft/Hobbycraft":{name:"Hobbycraft",icon:"maki-shop",geometry:["point","area"],tags:{shop:"craft","brand:wikidata":"Q16984508"},addTags:{brand:"Hobbycraft","brand:wikidata":"Q16984508","brand:wikipedia":"en:Hobbycraft",name:"Hobbycraft",shop:"craft"},removeTags:{brand:"Hobbycraft","brand:wikidata":"Q16984508","brand:wikipedia":"en:Hobbycraft",name:"Hobbycraft",shop:"craft"},matchScore:2,suggestion:true},"shop/craft/Jo-Ann":{name:"Jo-Ann",icon:"maki-shop",geometry:["point","area"],tags:{shop:"craft","brand:wikidata":"Q6203968"},addTags:{brand:"Jo-Ann","brand:wikidata":"Q6203968","brand:wikipedia":"en:Jo-Ann Stores",name:"Jo-Ann",shop:"craft"},removeTags:{brand:"Jo-Ann","brand:wikidata":"Q6203968","brand:wikipedia":"en:Jo-Ann Stores",name:"Jo-Ann",shop:"craft"},matchScore:2,suggestion:true},"shop/craft/Michaels":{name:"Michaels",icon:"maki-shop",geometry:["point","area"],tags:{shop:"craft","brand:wikidata":"Q6835667"},addTags:{brand:"Michaels","brand:wikidata":"Q6835667","brand:wikipedia":"en:Michaels",name:"Michaels",shop:"craft"},removeTags:{brand:"Michaels","brand:wikidata":"Q6835667","brand:wikipedia":"en:Michaels",name:"Michaels",shop:"craft"},matchScore:2,suggestion:true},"shop/department_store/Belk":{name:"Belk",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q127428"},addTags:{brand:"Belk","brand:wikidata":"Q127428","brand:wikipedia":"en:Belk",name:"Belk",shop:"department_store"},removeTags:{brand:"Belk","brand:wikidata":"Q127428","brand:wikipedia":"en:Belk",name:"Belk",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Big Lots":{name:"Big Lots",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q4905973"},addTags:{brand:"Big Lots","brand:wikidata":"Q4905973","brand:wikipedia":"en:Big Lots",name:"Big Lots",shop:"department_store"},removeTags:{brand:"Big Lots","brand:wikidata":"Q4905973","brand:wikipedia":"en:Big Lots",name:"Big Lots",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Big W":{name:"Big W",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q4906646"},addTags:{brand:"Big W","brand:wikidata":"Q4906646","brand:wikipedia":"en:Big W",name:"Big W",shop:"department_store"},removeTags:{brand:"Big W","brand:wikidata":"Q4906646","brand:wikipedia":"en:Big W",name:"Big W",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Canadian Tire":{name:"Canadian Tire",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1032400"},addTags:{brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire",shop:"department_store"},removeTags:{brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Coppel":{name:"Coppel",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q2497795"},addTags:{brand:"Coppel","brand:wikidata":"Q2497795","brand:wikipedia":"en:Coppel",name:"Coppel",shop:"department_store"},removeTags:{brand:"Coppel","brand:wikidata":"Q2497795","brand:wikipedia":"en:Coppel",name:"Coppel",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Debenhams":{name:"Debenhams",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1181484"},addTags:{brand:"Debenhams","brand:wikidata":"Q1181484","brand:wikipedia":"en:Debenhams",name:"Debenhams",shop:"department_store"},removeTags:{brand:"Debenhams","brand:wikidata":"Q1181484","brand:wikipedia":"en:Debenhams",name:"Debenhams",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Dillard's":{name:"Dillard's",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q844805"},addTags:{brand:"Dillard's","brand:wikidata":"Q844805","brand:wikipedia":"en:Dillard's",name:"Dillard's",shop:"department_store"},removeTags:{brand:"Dillard's","brand:wikidata":"Q844805","brand:wikipedia":"en:Dillard's",name:"Dillard's",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/El Corte Inglés":{name:"El Corte Inglés",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q623133"},addTags:{brand:"El Corte Inglés","brand:wikidata":"Q623133","brand:wikipedia":"en:El Corte Inglés",name:"El Corte Inglés",shop:"department_store"},removeTags:{brand:"El Corte Inglés","brand:wikidata":"Q623133","brand:wikipedia":"en:El Corte Inglés",name:"El Corte Inglés",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Falabella":{name:"Falabella",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q5135229"},addTags:{brand:"Falabella","brand:wikidata":"Q5135229","brand:wikipedia":"en:Falabella (retail store)",name:"Falabella",shop:"department_store"},removeTags:{brand:"Falabella","brand:wikidata":"Q5135229","brand:wikipedia":"en:Falabella (retail store)",name:"Falabella",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Galeria Kaufhof":{name:"Galeria Kaufhof",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q322598"},addTags:{brand:"Galeria Kaufhof","brand:wikidata":"Q322598","brand:wikipedia":"en:Galeria Kaufhof",name:"Galeria Kaufhof",shop:"department_store"},removeTags:{brand:"Galeria Kaufhof","brand:wikidata":"Q322598","brand:wikipedia":"en:Galeria Kaufhof",name:"Galeria Kaufhof",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Giant Tiger":{name:"Giant Tiger",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q5558429"},addTags:{brand:"Giant Tiger","brand:wikidata":"Q5558429","brand:wikipedia":"en:Giant Tiger",name:"Giant Tiger",shop:"department_store"},removeTags:{brand:"Giant Tiger","brand:wikidata":"Q5558429","brand:wikipedia":"en:Giant Tiger",name:"Giant Tiger",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/HEMA":{name:"HEMA",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q903805"},addTags:{brand:"HEMA","brand:wikidata":"Q903805","brand:wikipedia":"en:HEMA (store)",name:"HEMA",shop:"department_store"},removeTags:{brand:"HEMA","brand:wikidata":"Q903805","brand:wikipedia":"en:HEMA (store)",name:"HEMA",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Harvey Norman":{name:"Harvey Norman",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q4040441"},addTags:{brand:"Harvey Norman","brand:wikidata":"Q4040441","brand:wikipedia":"en:Harvey Norman",name:"Harvey Norman",shop:"department_store"},removeTags:{brand:"Harvey Norman","brand:wikidata":"Q4040441","brand:wikipedia":"en:Harvey Norman",name:"Harvey Norman",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/JCPenney":{name:"JCPenney",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q920037"},addTags:{brand:"JCPenney","brand:wikidata":"Q920037","brand:wikipedia":"en:J. C. Penney",name:"JCPenney",shop:"department_store"},removeTags:{brand:"JCPenney","brand:wikidata":"Q920037","brand:wikipedia":"en:J. C. Penney",name:"JCPenney",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Karstadt":{name:"Karstadt",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q182910"},addTags:{brand:"Karstadt","brand:wikidata":"Q182910","brand:wikipedia":"en:Karstadt",name:"Karstadt",shop:"department_store"},removeTags:{brand:"Karstadt","brand:wikidata":"Q182910","brand:wikipedia":"en:Karstadt",name:"Karstadt",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Kmart (Australia)":{name:"Kmart (Australia)",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q6421682"},addTags:{brand:"Kmart","brand:wikidata":"Q6421682","brand:wikipedia":"en:Kmart Australia",name:"Kmart",shop:"department_store"},removeTags:{brand:"Kmart","brand:wikidata":"Q6421682","brand:wikipedia":"en:Kmart Australia",name:"Kmart",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Kmart (USA)":{name:"Kmart (USA)",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1753080"},addTags:{brand:"Kmart","brand:wikidata":"Q1753080","brand:wikipedia":"en:Kmart",name:"Kmart",shop:"department_store"},removeTags:{brand:"Kmart","brand:wikidata":"Q1753080","brand:wikipedia":"en:Kmart",name:"Kmart",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Kohl's":{name:"Kohl's",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q967265"},addTags:{brand:"Kohl's","brand:wikidata":"Q967265","brand:wikipedia":"en:Kohl's",name:"Kohl's",shop:"department_store"},removeTags:{brand:"Kohl's","brand:wikidata":"Q967265","brand:wikipedia":"en:Kohl's",name:"Kohl's",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Lojas Americanas":{name:"Lojas Americanas",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q3064093"},addTags:{brand:"Lojas Americanas","brand:wikidata":"Q3064093","brand:wikipedia":"en:Lojas Americanas",name:"Lojas Americanas",shop:"department_store"},removeTags:{brand:"Lojas Americanas","brand:wikidata":"Q3064093","brand:wikipedia":"en:Lojas Americanas",name:"Lojas Americanas",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Macy's":{name:"Macy's",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q629269"},addTags:{brand:"Macy's","brand:wikidata":"Q629269","brand:wikipedia":"en:Macy's",name:"Macy's",shop:"department_store"},removeTags:{brand:"Macy's","brand:wikidata":"Q629269","brand:wikipedia":"en:Macy's",name:"Macy's",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Marks & Spencer":{name:"Marks & Spencer",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q714491"},addTags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"department_store"},removeTags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Marshalls":{name:"Marshalls",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q15903261"},addTags:{brand:"Marshalls","brand:wikidata":"Q15903261","brand:wikipedia":"en:Marshalls",name:"Marshalls",shop:"department_store"},removeTags:{brand:"Marshalls","brand:wikidata":"Q15903261","brand:wikipedia":"en:Marshalls",name:"Marshalls",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Myer":{name:"Myer",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1110323"},addTags:{brand:"Myer","brand:wikidata":"Q1110323","brand:wikipedia":"en:Myer",name:"Myer",shop:"department_store"},removeTags:{brand:"Myer","brand:wikidata":"Q1110323","brand:wikipedia":"en:Myer",name:"Myer",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Neiman Marcus":{name:"Neiman Marcus",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q743497"},addTags:{brand:"Neiman Marcus","brand:wikidata":"Q743497","brand:wikipedia":"en:Neiman Marcus",name:"Neiman Marcus",shop:"department_store"},removeTags:{brand:"Neiman Marcus","brand:wikidata":"Q743497","brand:wikipedia":"en:Neiman Marcus",name:"Neiman Marcus",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Nordstrom":{name:"Nordstrom",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q174310"},addTags:{brand:"Nordstrom","brand:wikidata":"Q174310","brand:wikipedia":"en:Nordstrom",name:"Nordstrom",shop:"department_store"},removeTags:{brand:"Nordstrom","brand:wikidata":"Q174310","brand:wikipedia":"en:Nordstrom",name:"Nordstrom",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Ripley":{name:"Ripley",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q3433040"},addTags:{brand:"Ripley","brand:wikidata":"Q3433040","brand:wikipedia":"en:Ripley S.A.",name:"Ripley",shop:"department_store"},removeTags:{brand:"Ripley","brand:wikidata":"Q3433040","brand:wikipedia":"en:Ripley S.A.",name:"Ripley",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Saks Fifth Avenue":{name:"Saks Fifth Avenue",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q2723882"},addTags:{brand:"Saks Fifth Avenue","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Fifth Avenue",shop:"department_store"},removeTags:{brand:"Saks Fifth Avenue","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Fifth Avenue",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Saks Off 5th":{name:"Saks Off 5th",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q2723882"},addTags:{brand:"Saks Off 5th","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Off 5th",shop:"department_store"},removeTags:{brand:"Saks Off 5th","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Off 5th",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Sears":{name:"Sears",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q6499202"},addTags:{brand:"Sears","brand:wikidata":"Q6499202","brand:wikipedia":"en:Sears",name:"Sears",shop:"department_store"},removeTags:{brand:"Sears","brand:wikidata":"Q6499202","brand:wikipedia":"en:Sears",name:"Sears",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Shopko":{name:"Shopko",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q7501155"},addTags:{brand:"Shopko","brand:wikidata":"Q7501155","brand:wikipedia":"en:Shopko",name:"Shopko",shop:"department_store"},removeTags:{brand:"Shopko","brand:wikidata":"Q7501155","brand:wikipedia":"en:Shopko",name:"Shopko",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Target (Australia)":{name:"Target (Australia)",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q7685854"},addTags:{brand:"Target","brand:wikidata":"Q7685854","brand:wikipedia":"en:Target Australia",name:"Target",shop:"department_store"},removeTags:{brand:"Target","brand:wikidata":"Q7685854","brand:wikipedia":"en:Target Australia",name:"Target",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Target (USA)":{name:"Target (USA)",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1046951"},addTags:{brand:"Target","brand:wikidata":"Q1046951","brand:wikipedia":"en:Target Corporation",name:"Target",shop:"department_store"},removeTags:{brand:"Target","brand:wikidata":"Q1046951","brand:wikipedia":"en:Target Corporation",name:"Target",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/The Warehouse":{name:"The Warehouse",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q3566291"},addTags:{brand:"The Warehouse","brand:wikidata":"Q3566291","brand:wikipedia":"en:The Warehouse Group",name:"The Warehouse",shop:"department_store"},removeTags:{brand:"The Warehouse","brand:wikidata":"Q3566291","brand:wikipedia":"en:The Warehouse Group",name:"The Warehouse",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Walmart":{name:"Walmart",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q483551"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"department_store"},removeTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Woolworth":{name:"Woolworth",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q183538"},addTags:{brand:"Woolworth","brand:wikidata":"Q183538","brand:wikipedia":"de:Woolworth Deutschland",name:"Woolworth",shop:"department_store"},removeTags:{brand:"Woolworth","brand:wikidata":"Q183538","brand:wikipedia":"de:Woolworth Deutschland",name:"Woolworth",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Åhléns":{name:"Åhléns",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q270851"},addTags:{brand:"Åhléns","brand:wikidata":"Q270851","brand:wikipedia":"sv:Åhléns",name:"Åhléns",shop:"department_store"},removeTags:{brand:"Åhléns","brand:wikidata":"Q270851","brand:wikipedia":"sv:Åhléns",name:"Åhléns",shop:"department_store"},matchScore:2,suggestion:true},"shop/doityourself/Ace Hardware":{name:"Ace Hardware",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q4672981"},addTags:{brand:"Ace Hardware","brand:wikidata":"Q4672981","brand:wikipedia":"en:Ace Hardware",name:"Ace Hardware",shop:"doityourself"},removeTags:{brand:"Ace Hardware","brand:wikidata":"Q4672981","brand:wikipedia":"en:Ace Hardware",name:"Ace Hardware",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/B&Q":{name:"B&Q",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q707602"},addTags:{brand:"B&Q","brand:wikidata":"Q707602","brand:wikipedia":"en:B&Q",name:"B&Q",shop:"doityourself"},removeTags:{brand:"B&Q","brand:wikidata":"Q707602","brand:wikipedia":"en:B&Q",name:"B&Q",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bauhaus":{name:"Bauhaus",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q672043"},addTags:{brand:"Bauhaus","brand:wikidata":"Q672043","brand:wikipedia":"en:Bauhaus (company)",name:"Bauhaus",shop:"doityourself"},removeTags:{brand:"Bauhaus","brand:wikidata":"Q672043","brand:wikipedia":"en:Bauhaus (company)",name:"Bauhaus",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Biltema":{name:"Biltema",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3355552"},addTags:{brand:"Biltema","brand:wikidata":"Q3355552","brand:wikipedia":"en:Biltema",name:"Biltema",shop:"doityourself"},removeTags:{brand:"Biltema","brand:wikidata":"Q3355552","brand:wikipedia":"en:Biltema",name:"Biltema",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Brico":{name:"Brico",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2510786"},addTags:{brand:"Brico","brand:wikidata":"Q2510786","brand:wikipedia":"en:Brico",name:"Brico",shop:"doityourself"},removeTags:{brand:"Brico","brand:wikidata":"Q2510786","brand:wikipedia":"en:Brico",name:"Brico",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Brico Dépôt":{name:"Brico Dépôt",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2889702"},addTags:{brand:"Brico Dépôt","brand:wikidata":"Q2889702","brand:wikipedia":"en:Brico Dépôt",name:"Brico Dépôt",shop:"doityourself"},removeTags:{brand:"Brico Dépôt","brand:wikidata":"Q2889702","brand:wikipedia":"en:Brico Dépôt",name:"Brico Dépôt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bricoman":{name:"Bricoman",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2925142"},addTags:{brand:"Bricoman","brand:wikidata":"Q2925142","brand:wikipedia":"it:Bricoman",name:"Bricoman",shop:"doityourself"},removeTags:{brand:"Bricoman","brand:wikidata":"Q2925142","brand:wikipedia":"it:Bricoman",name:"Bricoman",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bricomarché":{name:"Bricomarché",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2925147"},addTags:{brand:"Bricomarché","brand:wikidata":"Q2925147","brand:wikipedia":"en:Bricomarché",name:"Bricomarché",shop:"doityourself"},removeTags:{brand:"Bricomarché","brand:wikidata":"Q2925147","brand:wikipedia":"en:Bricomarché",name:"Bricomarché",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bricorama":{name:"Bricorama",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2925146"},addTags:{brand:"Bricorama","brand:wikidata":"Q2925146","brand:wikipedia":"en:Bricorama",name:"Bricorama",shop:"doityourself"},removeTags:{brand:"Bricorama","brand:wikidata":"Q2925146","brand:wikipedia":"en:Bricorama",name:"Bricorama",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bunnings Warehouse":{name:"Bunnings Warehouse",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q4997829"},addTags:{brand:"Bunnings Warehouse","brand:wikidata":"Q4997829","brand:wikipedia":"en:Bunnings Warehouse",name:"Bunnings Warehouse",shop:"doityourself"},removeTags:{brand:"Bunnings Warehouse","brand:wikidata":"Q4997829","brand:wikipedia":"en:Bunnings Warehouse",name:"Bunnings Warehouse",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Castorama":{name:"Castorama",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q966971"},addTags:{brand:"Castorama","brand:wikidata":"Q966971","brand:wikipedia":"en:Castorama",name:"Castorama",shop:"doityourself"},removeTags:{brand:"Castorama","brand:wikidata":"Q966971","brand:wikipedia":"en:Castorama",name:"Castorama",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Clas Ohlson":{name:"Clas Ohlson",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3356220"},addTags:{brand:"Clas Ohlson","brand:wikidata":"Q3356220","brand:wikipedia":"en:Clas Ohlson",name:"Clas Ohlson",shop:"doityourself"},removeTags:{brand:"Clas Ohlson","brand:wikidata":"Q3356220","brand:wikipedia":"en:Clas Ohlson",name:"Clas Ohlson",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Easy":{name:"Easy",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q5331091"},addTags:{brand:"Easy","brand:wikidata":"Q5331091","brand:wikipedia":"en:Easy (store)",name:"Easy",shop:"doityourself"},removeTags:{brand:"Easy","brand:wikidata":"Q5331091","brand:wikipedia":"en:Easy (store)",name:"Easy",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Gamma":{name:"Gamma",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2294120"},addTags:{brand:"Gamma","brand:wikidata":"Q2294120","brand:wikipedia":"en:Gamma (store)",name:"Gamma",shop:"doityourself"},removeTags:{brand:"Gamma","brand:wikidata":"Q2294120","brand:wikipedia":"en:Gamma (store)",name:"Gamma",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Globus Baumarkt":{name:"Globus Baumarkt",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q457503"},addTags:{brand:"Globus Baumarkt","brand:wikidata":"Q457503","brand:wikipedia":"de:Globus Holding",name:"Globus Baumarkt",shop:"doityourself"},removeTags:{brand:"Globus Baumarkt","brand:wikidata":"Q457503","brand:wikipedia":"de:Globus Holding",name:"Globus Baumarkt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hagebaumarkt":{name:"Hagebaumarkt",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q1568279"},addTags:{brand:"Hagebaumarkt","brand:wikidata":"Q1568279","brand:wikipedia":"de:Hagebau",name:"Hagebaumarkt",shop:"doityourself"},removeTags:{brand:"Hagebaumarkt","brand:wikidata":"Q1568279","brand:wikipedia":"de:Hagebau",name:"Hagebaumarkt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hammer":{name:"Hammer",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q52159668"},addTags:{brand:"Hammer","brand:wikidata":"Q52159668","brand:wikipedia":"de:Hammer (Fachmarktkette)",name:"Hammer",shop:"doityourself"},removeTags:{brand:"Hammer","brand:wikidata":"Q52159668","brand:wikipedia":"de:Hammer (Fachmarktkette)",name:"Hammer",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hellweg":{name:"Hellweg",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q1603084"},addTags:{brand:"Hellweg","brand:wikidata":"Q1603084","brand:wikipedia":"de:Hellweg (Baumarkt)",name:"Hellweg",shop:"doityourself"},removeTags:{brand:"Hellweg","brand:wikidata":"Q1603084","brand:wikipedia":"de:Hellweg (Baumarkt)",name:"Hellweg",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Home Building Centre":{name:"Home Building Centre",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3139611"},addTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Building Centre",shop:"doityourself"},removeTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Building Centre",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Home Depot":{name:"Home Depot",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q864407"},addTags:{brand:"Home Depot","brand:wikidata":"Q864407","brand:wikipedia":"en:The Home Depot",name:"Home Depot",shop:"doityourself"},removeTags:{brand:"Home Depot","brand:wikidata":"Q864407","brand:wikipedia":"en:The Home Depot",name:"Home Depot",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Home Hardware Building Centre":{name:"Home Hardware Building Centre",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3139611"},addTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware Building Centre",shop:"doityourself"},removeTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware Building Centre",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Homebase":{name:"Homebase",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q9293447"},addTags:{brand:"Homebase","brand:wikidata":"Q9293447","brand:wikipedia":"en:Homebase",name:"Homebase",shop:"doityourself"},removeTags:{brand:"Homebase","brand:wikidata":"Q9293447","brand:wikipedia":"en:Homebase",name:"Homebase",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hornbach":{name:"Hornbach",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q685926"},addTags:{brand:"Hornbach","brand:wikidata":"Q685926","brand:wikipedia":"en:Hornbach (retailer)",name:"Hornbach",shop:"doityourself"},removeTags:{brand:"Hornbach","brand:wikidata":"Q685926","brand:wikipedia":"en:Hornbach (retailer)",name:"Hornbach",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hubo":{name:"Hubo",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3142153"},addTags:{brand:"Hubo","brand:wikidata":"Q3142153","brand:wikipedia":"en:Hubo Belgium",name:"Hubo",shop:"doityourself"},removeTags:{brand:"Hubo","brand:wikidata":"Q3142153","brand:wikipedia":"en:Hubo Belgium",name:"Hubo",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Jewson":{name:"Jewson",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q6190226"},addTags:{brand:"Jewson","brand:wikidata":"Q6190226","brand:wikipedia":"en:Jewson",name:"Jewson",shop:"doityourself"},removeTags:{brand:"Jewson","brand:wikidata":"Q6190226","brand:wikipedia":"en:Jewson",name:"Jewson",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Karwei":{name:"Karwei",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2097480"},addTags:{brand:"Karwei","brand:wikidata":"Q2097480","brand:wikipedia":"en:Karwei",name:"Karwei",shop:"doityourself"},removeTags:{brand:"Karwei","brand:wikidata":"Q2097480","brand:wikipedia":"en:Karwei",name:"Karwei",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Lagerhaus":{name:"Lagerhaus",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q10553211"},addTags:{brand:"Lagerhaus","brand:wikidata":"Q10553211","brand:wikipedia":"sv:Lagerhaus",name:"Lagerhaus",shop:"doityourself"},removeTags:{brand:"Lagerhaus","brand:wikidata":"Q10553211","brand:wikipedia":"sv:Lagerhaus",name:"Lagerhaus",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Leroy Merlin":{name:"Leroy Merlin",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q889624"},addTags:{brand:"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Leroy Merlin",shop:"doityourself"},removeTags:{brand:"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Leroy Merlin",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Lowe's":{name:"Lowe's",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q1373493"},addTags:{brand:"Lowe's","brand:wikidata":"Q1373493","brand:wikipedia":"en:Lowe's",name:"Lowe's",shop:"doityourself"},removeTags:{brand:"Lowe's","brand:wikidata":"Q1373493","brand:wikipedia":"en:Lowe's",name:"Lowe's",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Menards":{name:"Menards",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q1639897"},addTags:{brand:"Menards","brand:wikidata":"Q1639897","brand:wikipedia":"en:Menards",name:"Menards",shop:"doityourself"},removeTags:{brand:"Menards","brand:wikidata":"Q1639897","brand:wikipedia":"en:Menards",name:"Menards",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Mr.Bricolage":{name:"Mr.Bricolage",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3141657"},addTags:{brand:"Mr.Bricolage","brand:wikidata":"Q3141657","brand:wikipedia":"fr:Mr Bricolage",name:"Mr.Bricolage",shop:"doityourself"},removeTags:{brand:"Mr.Bricolage","brand:wikidata":"Q3141657","brand:wikipedia":"fr:Mr Bricolage",name:"Mr.Bricolage",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/OBI":{name:"OBI",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q300518"},addTags:{brand:"OBI","brand:wikidata":"Q300518","brand:wikipedia":"en:Obi (store)",name:"OBI",shop:"doityourself"},removeTags:{brand:"OBI","brand:wikidata":"Q300518","brand:wikipedia":"en:Obi (store)",name:"OBI",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Point P":{name:"Point P",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3393350"},addTags:{brand:"Point P","brand:wikidata":"Q3393350","brand:wikipedia":"fr:Saint-Gobain Distribution Bâtiment France",name:"Point P",shop:"doityourself"},removeTags:{brand:"Point P","brand:wikidata":"Q3393350","brand:wikipedia":"fr:Saint-Gobain Distribution Bâtiment France",name:"Point P",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Praktiker":{name:"Praktiker",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q680214"},addTags:{brand:"Praktiker","brand:wikidata":"Q680214","brand:wikipedia":"en:Praktiker",name:"Praktiker",shop:"doityourself"},removeTags:{brand:"Praktiker","brand:wikidata":"Q680214","brand:wikipedia":"en:Praktiker",name:"Praktiker",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Praxis":{name:"Praxis",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2741995"},addTags:{brand:"Praxis","brand:wikidata":"Q2741995","brand:wikipedia":"nl:Praxis (winkel)",name:"Praxis",shop:"doityourself"},removeTags:{brand:"Praxis","brand:wikidata":"Q2741995","brand:wikipedia":"nl:Praxis (winkel)",name:"Praxis",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Rona":{name:"Rona",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3415283"},addTags:{brand:"Rona","brand:wikidata":"Q3415283","brand:wikipedia":"en:Rona, Inc.",name:"Rona",shop:"doityourself"},removeTags:{brand:"Rona","brand:wikidata":"Q3415283","brand:wikipedia":"en:Rona, Inc.",name:"Rona",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Screwfix":{name:"Screwfix",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q7439115"},addTags:{brand:"Screwfix","brand:wikidata":"Q7439115","brand:wikipedia":"en:Screwfix",name:"Screwfix",shop:"doityourself"},removeTags:{brand:"Screwfix","brand:wikidata":"Q7439115","brand:wikipedia":"en:Screwfix",name:"Screwfix",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Sonderpreis Baumarkt":{name:"Sonderpreis Baumarkt",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q811530"},addTags:{brand:"Sonderpreis Baumarkt","brand:wikidata":"Q811530","brand:wikipedia":"de:Baumarkt",name:"Sonderpreis Baumarkt",shop:"doityourself"},removeTags:{brand:"Sonderpreis Baumarkt","brand:wikidata":"Q811530","brand:wikipedia":"de:Baumarkt",name:"Sonderpreis Baumarkt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Tekzen":{name:"Tekzen",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q25475379"},addTags:{brand:"Tekzen","brand:wikidata":"Q25475379","brand:wikipedia":"tr:Tekzen",name:"Tekzen",shop:"doityourself"},removeTags:{brand:"Tekzen","brand:wikidata":"Q25475379","brand:wikipedia":"tr:Tekzen",name:"Tekzen",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Toom Baumarkt":{name:"Toom Baumarkt",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2442970"},addTags:{brand:"Toom Baumarkt","brand:wikidata":"Q2442970","brand:wikipedia":"de:Toom Baumarkt",name:"Toom Baumarkt",shop:"doityourself"},removeTags:{brand:"Toom Baumarkt","brand:wikidata":"Q2442970","brand:wikipedia":"de:Toom Baumarkt",name:"Toom Baumarkt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Travis Perkins":{name:"Travis Perkins",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2450664"},addTags:{brand:"Travis Perkins","brand:wikidata":"Q2450664","brand:wikipedia":"en:Travis Perkins",name:"Travis Perkins",shop:"doityourself"},removeTags:{brand:"Travis Perkins","brand:wikidata":"Q2450664","brand:wikipedia":"en:Travis Perkins",name:"Travis Perkins",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Weldom":{name:"Weldom",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q16683226"},addTags:{brand:"Weldom","brand:wikidata":"Q16683226","brand:wikipedia":"fr:Weldom",name:"Weldom",shop:"doityourself"},removeTags:{brand:"Weldom","brand:wikidata":"Q16683226","brand:wikipedia":"fr:Weldom",name:"Weldom",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Wickes":{name:"Wickes",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q7998350"},addTags:{brand:"Wickes","brand:wikidata":"Q7998350","brand:wikipedia":"en:Wickes",name:"Wickes",shop:"doityourself"},removeTags:{brand:"Wickes","brand:wikidata":"Q7998350","brand:wikipedia":"en:Wickes",name:"Wickes",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/jem & fix":{name:"jem & fix",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q12319200"},addTags:{brand:"jem & fix","brand:wikidata":"Q12319200","brand:wikipedia":"da:jem & fix",name:"jem & fix",shop:"doityourself"},removeTags:{brand:"jem & fix","brand:wikidata":"Q12319200","brand:wikipedia":"da:jem & fix",name:"jem & fix",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Леруа Мерлен":{name:"Леруа Мерлен",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q889624"},addTags:{brand:"Леруа Мерлен","brand:en":"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Леруа Мерлен","name:en":"Leroy Merlin",shop:"doityourself"},removeTags:{brand:"Леруа Мерлен","brand:en":"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Леруа Мерлен","name:en":"Leroy Merlin",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/カインズホーム":{name:"カインズホーム",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q11293852"},addTags:{brand:"カインズホーム","brand:en":"Cainz Home","brand:wikidata":"Q11293852","brand:wikipedia":"ja:カインズ",name:"カインズホーム","name:en":"Cainz Home",shop:"doityourself"},removeTags:{brand:"カインズホーム","brand:en":"Cainz Home","brand:wikidata":"Q11293852","brand:wikipedia":"ja:カインズ",name:"カインズホーム","name:en":"Cainz Home",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/コメリ":{name:"コメリ",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q11302690"},addTags:{brand:"コメリ","brand:wikidata":"Q11302690","brand:wikipedia":"ja:コメリ",name:"コメリ","name:en":"Komeri",shop:"doityourself"},removeTags:{brand:"コメリ","brand:wikidata":"Q11302690","brand:wikipedia":"ja:コメリ",name:"コメリ","name:en":"Komeri",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/コーナン":{name:"コーナン",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q11303403"},addTags:{brand:"コーナン","brand:wikidata":"Q11303403","brand:wikipedia":"ja:コーナン",name:"コーナン","name:en":"Kohnan",shop:"doityourself"},removeTags:{brand:"コーナン","brand:wikidata":"Q11303403","brand:wikipedia":"ja:コーナン",name:"コーナン","name:en":"Kohnan",shop:"doityourself"},matchScore:2,suggestion:true},"shop/dry_cleaning/ホワイト急便":{name:"ホワイト急便",icon:"maki-shop",geometry:["point","area"],tags:{shop:"dry_cleaning","brand:wikidata":"Q11505557"},addTags:{brand:"ホワイト急便","brand:en":"White Kyuubin","brand:wikidata":"Q11505557","brand:wikipedia":"ja:日本さわやかグループ",name:"ホワイト急便","name:en":"White Kyuubin",shop:"dry_cleaning"},removeTags:{brand:"ホワイト急便","brand:en":"White Kyuubin","brand:wikidata":"Q11505557","brand:wikipedia":"ja:日本さわやかグループ",name:"ホワイト急便","name:en":"White Kyuubin",shop:"dry_cleaning"},matchScore:2,suggestion:true},"shop/dry_cleaning/白洋舎":{name:"白洋舎",icon:"maki-shop",geometry:["point","area"],tags:{shop:"dry_cleaning","brand:wikidata":"Q11579995"},addTags:{brand:"白洋舎","brand:en":"Hakuyosha","brand:wikidata":"Q11579995","brand:wikipedia":"ja:白洋舎",name:"白洋舎","name:en":"Hakuyosha",shop:"dry_cleaning"},removeTags:{brand:"白洋舎","brand:en":"Hakuyosha","brand:wikidata":"Q11579995","brand:wikipedia":"ja:白洋舎",name:"白洋舎","name:en":"Hakuyosha",shop:"dry_cleaning"},matchScore:2,suggestion:true},"shop/electronics/Apple Store":{name:"Apple Store",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q421253"},addTags:{brand:"Apple Store","brand:wikidata":"Q421253","brand:wikipedia":"en:Apple Store",name:"Apple Store",shop:"electronics"},removeTags:{brand:"Apple Store","brand:wikidata":"Q421253","brand:wikipedia":"en:Apple Store",name:"Apple Store",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Batteries Plus Bulbs":{name:"Batteries Plus Bulbs",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q17005157"},addTags:{brand:"Batteries Plus Bulbs","brand:wikidata":"Q17005157",name:"Batteries Plus Bulbs",shop:"electronics"},removeTags:{brand:"Batteries Plus Bulbs","brand:wikidata":"Q17005157",name:"Batteries Plus Bulbs",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Best Buy":{name:"Best Buy",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q533415"},addTags:{brand:"Best Buy","brand:wikidata":"Q533415","brand:wikipedia":"en:Best Buy",name:"Best Buy",shop:"electronics"},removeTags:{brand:"Best Buy","brand:wikidata":"Q533415","brand:wikipedia":"en:Best Buy",name:"Best Buy",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Boulanger":{name:"Boulanger",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q2921695"},addTags:{brand:"Boulanger","brand:wikidata":"Q2921695","brand:wikipedia":"fr:Boulanger (entreprise)",name:"Boulanger",shop:"electronics"},removeTags:{brand:"Boulanger","brand:wikidata":"Q2921695","brand:wikipedia":"fr:Boulanger (entreprise)",name:"Boulanger",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/CeX":{name:"CeX",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q5055676"},addTags:{brand:"CeX","brand:wikidata":"Q5055676","brand:wikipedia":"en:CeX (company)",name:"CeX",shop:"electronics"},removeTags:{brand:"CeX","brand:wikidata":"Q5055676","brand:wikipedia":"en:CeX (company)",name:"CeX",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Currys":{name:"Currys",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q3246464"},addTags:{brand:"Currys","brand:wikidata":"Q3246464","brand:wikipedia":"en:Currys",name:"Currys",shop:"electronics"},removeTags:{brand:"Currys","brand:wikidata":"Q3246464","brand:wikipedia":"en:Currys",name:"Currys",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Currys PC World":{name:"Currys PC World",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q7118727"},addTags:{brand:"Currys PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"Currys PC World",shop:"electronics"},removeTags:{brand:"Currys PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"Currys PC World",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Darty":{name:"Darty",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q3117381"},addTags:{brand:"Darty","brand:wikidata":"Q3117381","brand:wikipedia":"en:Groupe Fnac Darty",name:"Darty",shop:"electronics"},removeTags:{brand:"Darty","brand:wikidata":"Q3117381","brand:wikipedia":"en:Groupe Fnac Darty",name:"Darty",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Elgiganten":{name:"Elgiganten",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q17050121"},addTags:{brand:"Elgiganten","brand:wikidata":"Q17050121","brand:wikipedia":"en:Elgiganten",name:"Elgiganten",shop:"electronics"},removeTags:{brand:"Elgiganten","brand:wikidata":"Q17050121","brand:wikipedia":"en:Elgiganten",name:"Elgiganten",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Euronics":{name:"Euronics",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q184860"},addTags:{brand:"Euronics","brand:wikidata":"Q184860","brand:wikipedia":"en:Euronics",name:"Euronics",shop:"electronics"},removeTags:{brand:"Euronics","brand:wikidata":"Q184860","brand:wikipedia":"en:Euronics",name:"Euronics",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Expert":{name:"Expert",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q680990"},addTags:{brand:"Expert","brand:wikidata":"Q680990","brand:wikipedia":"en:Expert (company)",name:"Expert",shop:"electronics"},removeTags:{brand:"Expert","brand:wikidata":"Q680990","brand:wikipedia":"en:Expert (company)",name:"Expert",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Hartlauer":{name:"Hartlauer",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q1587223"},addTags:{brand:"Hartlauer","brand:wikidata":"Q1587223","brand:wikipedia":"de:Hartlauer",name:"Hartlauer",shop:"electronics"},removeTags:{brand:"Hartlauer","brand:wikidata":"Q1587223","brand:wikipedia":"de:Hartlauer",name:"Hartlauer",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Interdiscount":{name:"Interdiscount",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q1665980"},addTags:{brand:"Interdiscount","brand:wikidata":"Q1665980","brand:wikipedia":"de:Interdiscount",name:"Interdiscount",shop:"electronics"},removeTags:{brand:"Interdiscount","brand:wikidata":"Q1665980","brand:wikipedia":"de:Interdiscount",name:"Interdiscount",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/JB Hi-Fi":{name:"JB Hi-Fi",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q3310113"},addTags:{brand:"JB Hi-Fi","brand:wikidata":"Q3310113","brand:wikipedia":"en:JB Hi-Fi",name:"JB Hi-Fi",shop:"electronics"},removeTags:{brand:"JB Hi-Fi","brand:wikidata":"Q3310113","brand:wikipedia":"en:JB Hi-Fi",name:"JB Hi-Fi",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Kjell & Company":{name:"Kjell & Company",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6419332"},addTags:{brand:"Kjell & Company","brand:wikidata":"Q6419332","brand:wikipedia":"en:Kjell & Company",name:"Kjell & Company",shop:"electronics"},removeTags:{brand:"Kjell & Company","brand:wikidata":"Q6419332","brand:wikipedia":"en:Kjell & Company",name:"Kjell & Company",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Komputronik":{name:"Komputronik",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11742085"},addTags:{brand:"Komputronik","brand:wikidata":"Q11742085","brand:wikipedia":"pl:Komputronik",name:"Komputronik",shop:"electronics"},removeTags:{brand:"Komputronik","brand:wikidata":"Q11742085","brand:wikipedia":"pl:Komputronik",name:"Komputronik",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/La Curacao":{name:"La Curacao",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q5194599"},addTags:{brand:"La Curacao","brand:wikidata":"Q5194599","brand:wikipedia":"en:Curacao (retail store)",name:"La Curacao",shop:"electronics"},removeTags:{brand:"La Curacao","brand:wikidata":"Q5194599","brand:wikipedia":"en:Curacao (retail store)",name:"La Curacao",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Maplin":{name:"Maplin",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6754124"},addTags:{brand:"Maplin","brand:wikidata":"Q6754124","brand:wikipedia":"en:Maplin (retailer)",name:"Maplin",shop:"electronics"},removeTags:{brand:"Maplin","brand:wikidata":"Q6754124","brand:wikipedia":"en:Maplin (retailer)",name:"Maplin",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Media Expert":{name:"Media Expert",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11776794"},addTags:{brand:"Media Expert","brand:wikidata":"Q11776794","brand:wikipedia":"pl:Media Expert",name:"Media Expert",shop:"electronics"},removeTags:{brand:"Media Expert","brand:wikidata":"Q11776794","brand:wikipedia":"pl:Media Expert",name:"Media Expert",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Media Markt":{name:"Media Markt",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q2381223"},addTags:{brand:"Media Markt","brand:wikidata":"Q2381223","brand:wikipedia":"en:Media Markt",name:"Media Markt",shop:"electronics"},removeTags:{brand:"Media Markt","brand:wikidata":"Q2381223","brand:wikipedia":"en:Media Markt",name:"Media Markt",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Musimundo":{name:"Musimundo",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6034719"},addTags:{brand:"Musimundo","brand:wikidata":"Q6034719","brand:wikipedia":"es:Musimundo",name:"Musimundo",shop:"electronics"},removeTags:{brand:"Musimundo","brand:wikidata":"Q6034719","brand:wikipedia":"es:Musimundo",name:"Musimundo",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Neonet":{name:"Neonet",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11790622"},addTags:{brand:"Neonet","brand:wikidata":"Q11790622","brand:wikipedia":"pl:Neonet",name:"Neonet",shop:"electronics"},removeTags:{brand:"Neonet","brand:wikidata":"Q11790622","brand:wikipedia":"pl:Neonet",name:"Neonet",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/RTV Euro AGD":{name:"RTV Euro AGD",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q7277895"},addTags:{brand:"RTV Euro AGD","brand:wikidata":"Q7277895","brand:wikipedia":"en:RTV Euro AGD",name:"RTV Euro AGD",shop:"electronics"},removeTags:{brand:"RTV Euro AGD","brand:wikidata":"Q7277895","brand:wikipedia":"en:RTV Euro AGD",name:"RTV Euro AGD",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/RadioShack":{name:"RadioShack",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q1195490"},addTags:{brand:"RadioShack","brand:wikidata":"Q1195490","brand:wikipedia":"en:RadioShack",name:"RadioShack",shop:"electronics"},removeTags:{brand:"RadioShack","brand:wikidata":"Q1195490","brand:wikipedia":"en:RadioShack",name:"RadioShack",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Samsung":{name:"Samsung",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q20718"},addTags:{brand:"Samsung","brand:wikidata":"Q20718","brand:wikipedia":"en:Samsung Electronics",name:"Samsung",shop:"electronics"},removeTags:{brand:"Samsung","brand:wikidata":"Q20718","brand:wikipedia":"en:Samsung Electronics",name:"Samsung",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Saturn":{name:"Saturn",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q2543504"},addTags:{brand:"Saturn","brand:wikidata":"Q2543504","brand:wikipedia":"en:Saturn (retailer)",name:"Saturn",shop:"electronics"},removeTags:{brand:"Saturn","brand:wikidata":"Q2543504","brand:wikipedia":"en:Saturn (retailer)",name:"Saturn",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Sony":{name:"Sony",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q41187"},addTags:{brand:"Sony","brand:wikidata":"Q41187","brand:wikipedia":"en:Sony",name:"Sony",shop:"electronics"},removeTags:{brand:"Sony","brand:wikidata":"Q41187","brand:wikipedia":"en:Sony",name:"Sony",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Teknikmagasinet":{name:"Teknikmagasinet",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q3357520"},addTags:{brand:"Teknikmagasinet","brand:wikidata":"Q3357520","brand:wikipedia":"en:Teknikmagasinet",name:"Teknikmagasinet",shop:"electronics"},removeTags:{brand:"Teknikmagasinet","brand:wikidata":"Q3357520","brand:wikipedia":"en:Teknikmagasinet",name:"Teknikmagasinet",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/The Source":{name:"The Source",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q3212934"},addTags:{brand:"The Source","brand:wikidata":"Q3212934","brand:wikipedia":"en:The Source (retailer)",name:"The Source",shop:"electronics"},removeTags:{brand:"The Source","brand:wikidata":"Q3212934","brand:wikipedia":"en:The Source (retailer)",name:"The Source",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Unieuro":{name:"Unieuro",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q4004687"},addTags:{brand:"Unieuro","brand:wikidata":"Q4004687","brand:wikipedia":"en:Unieuro",name:"Unieuro",shop:"electronics"},removeTags:{brand:"Unieuro","brand:wikidata":"Q4004687","brand:wikipedia":"en:Unieuro",name:"Unieuro",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Worten":{name:"Worten",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q10394039"},addTags:{brand:"Worten","brand:wikidata":"Q10394039","brand:wikipedia":"pt:Worten",name:"Worten",shop:"electronics"},removeTags:{brand:"Worten","brand:wikidata":"Q10394039","brand:wikipedia":"pt:Worten",name:"Worten",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/М.Видео":{name:"М.Видео",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6558800"},addTags:{brand:"М.Видео","brand:en":"M.video","brand:wikidata":"Q6558800","brand:wikipedia":"en:M.video",name:"М.Видео","name:en":"M.video",shop:"electronics"},removeTags:{brand:"М.Видео","brand:en":"M.video","brand:wikidata":"Q6558800","brand:wikipedia":"en:M.video",name:"М.Видео","name:en":"M.video",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Фокстрот":{name:"Фокстрот",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q16721578"},addTags:{brand:"Фокстрот","brand:wikidata":"Q16721578","brand:wikipedia":"uk:Фокстрот (торгова мережа)",name:"Фокстрот",shop:"electronics"},removeTags:{brand:"Фокстрот","brand:wikidata":"Q16721578","brand:wikipedia":"uk:Фокстрот (торгова мережа)",name:"Фокстрот",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Эльдорадо":{name:"Эльдорадо",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q4531492"},addTags:{brand:"Эльдорадо","brand:wikidata":"Q4531492","brand:wikipedia":"ru:Эльдорадо (сеть магазинов)",name:"Эльдорадо",shop:"electronics"},removeTags:{brand:"Эльдорадо","brand:wikidata":"Q4531492","brand:wikipedia":"ru:Эльдорадо (сеть магазинов)",name:"Эльдорадо",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/エディオン":{name:"エディオン",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11290252"},addTags:{brand:"エディオン","brand:en":"EDION","brand:wikidata":"Q11290252","brand:wikipedia":"ja:エディオン",name:"エディオン","name:en":"EDION",shop:"electronics"},removeTags:{brand:"エディオン","brand:en":"EDION","brand:wikidata":"Q11290252","brand:wikipedia":"ja:エディオン",name:"エディオン","name:en":"EDION",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/ケーズデンキ":{name:"ケーズデンキ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6322472"},addTags:{brand:"ケーズデンキ","brand:en":"K's Denki","brand:wikidata":"Q6322472","brand:wikipedia":"ja:ケーズホールディングス",name:"ケーズデンキ","name:en":"K's Denki",shop:"electronics"},removeTags:{brand:"ケーズデンキ","brand:en":"K's Denki","brand:wikidata":"Q6322472","brand:wikipedia":"ja:ケーズホールディングス",name:"ケーズデンキ","name:en":"K's Denki",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/コジマ":{name:"コジマ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11302052"},addTags:{brand:"コジマ","brand:en":"Kojima","brand:wikidata":"Q11302052","brand:wikipedia":"ja:コジマ",name:"コジマ","name:en":"Kojima",shop:"electronics"},removeTags:{brand:"コジマ","brand:en":"Kojima","brand:wikidata":"Q11302052","brand:wikipedia":"ja:コジマ",name:"コジマ","name:en":"Kojima",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/ヤマダ電機":{name:"ヤマダ電機",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q1096390"},addTags:{brand:"ヤマダ電機","brand:en":"Yamada Denki","brand:wikidata":"Q1096390","brand:wikipedia":"en:Yamada Denki",name:"ヤマダ電機","name:en":"Yamada Denki",shop:"electronics"},removeTags:{brand:"ヤマダ電機","brand:en":"Yamada Denki","brand:wikidata":"Q1096390","brand:wikipedia":"en:Yamada Denki",name:"ヤマダ電機","name:en":"Yamada Denki",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/全國電子":{name:"全國電子",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q10891540"},addTags:{brand:"全國電子","brand:en":"E-life Mall","brand:wikidata":"Q10891540","brand:wikipedia":"zh:全國電子",name:"全國電子","name:en":"E-life Mall",shop:"electronics"},removeTags:{brand:"全國電子","brand:en":"E-life Mall","brand:wikidata":"Q10891540","brand:wikipedia":"zh:全國電子",name:"全國電子","name:en":"E-life Mall",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/燦坤3C":{name:"燦坤3C",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11569285"},addTags:{brand:"燦坤3C","brand:en":"Tsannkuen 3C","brand:wikidata":"Q11569285","brand:wikipedia":"zh:燦坤",name:"燦坤3C","name:en":"Tsannkuen 3C",shop:"electronics"},removeTags:{brand:"燦坤3C","brand:en":"Tsannkuen 3C","brand:wikidata":"Q11569285","brand:wikipedia":"zh:燦坤",name:"燦坤3C","name:en":"Tsannkuen 3C",shop:"electronics"},matchScore:2,suggestion:true},"shop/erotic/Orion":{name:"Orion",icon:"maki-shop",geometry:["point","area"],tags:{shop:"erotic","brand:wikidata":"Q1609577"},addTags:{brand:"Orion","brand:wikidata":"Q1609577","brand:wikipedia":"de:Orion (Erotik)",name:"Orion",shop:"erotic"},removeTags:{brand:"Orion","brand:wikidata":"Q1609577","brand:wikipedia":"de:Orion (Erotik)",name:"Orion",shop:"erotic"},matchScore:2,suggestion:true},"shop/fabric/Mondial Tissus":{name:"Mondial Tissus",icon:"maki-shop",geometry:["point","area"],tags:{shop:"fabric","brand:wikidata":"Q17635288"},addTags:{brand:"Mondial Tissus","brand:wikidata":"Q17635288","brand:wikipedia":"fr:Mondial Tissus",name:"Mondial Tissus",shop:"fabric"},removeTags:{brand:"Mondial Tissus","brand:wikidata":"Q17635288","brand:wikipedia":"fr:Mondial Tissus",name:"Mondial Tissus",shop:"fabric"},matchScore:2,suggestion:true},"shop/florist/Blume 2000":{name:"Blume 2000",icon:"maki-florist",geometry:["point","area"],tags:{shop:"florist","brand:wikidata":"Q886166"},addTags:{brand:"Blume 2000","brand:wikidata":"Q886166","brand:wikipedia":"de:Blume 2000",name:"Blume 2000",shop:"florist"},removeTags:{brand:"Blume 2000","brand:wikidata":"Q886166","brand:wikipedia":"de:Blume 2000",name:"Blume 2000",shop:"florist"},matchScore:2,suggestion:true},"shop/florist/Blumen Risse":{name:"Blumen Risse",icon:"maki-florist",geometry:["point","area"],tags:{shop:"florist","brand:wikidata":"Q886177"},addTags:{brand:"Blumen Risse","brand:wikidata":"Q886177","brand:wikipedia":"de:Blumen Risse",name:"Blumen Risse",shop:"florist"},removeTags:{brand:"Blumen Risse","brand:wikidata":"Q886177","brand:wikipedia":"de:Blumen Risse",name:"Blumen Risse",shop:"florist"},matchScore:2,suggestion:true},"shop/florist/Interflora":{name:"Interflora",icon:"maki-florist",geometry:["point","area"],tags:{shop:"florist","brand:wikidata":"Q692179"},addTags:{brand:"Interflora","brand:wikidata":"Q692179","brand:wikipedia":"en:Interflora",name:"Interflora",shop:"florist"},removeTags:{brand:"Interflora","brand:wikidata":"Q692179","brand:wikipedia":"en:Interflora",name:"Interflora",shop:"florist"},matchScore:2,suggestion:true},"shop/florist/Monceau Fleurs":{name:"Monceau Fleurs",icon:"maki-florist",geometry:["point","area"],tags:{shop:"florist","brand:wikidata":"Q17629431"},addTags:{brand:"Monceau Fleurs","brand:wikidata":"Q17629431","brand:wikipedia":"fr:Emova Group",name:"Monceau Fleurs",shop:"florist"},removeTags:{brand:"Monceau Fleurs","brand:wikidata":"Q17629431","brand:wikipedia":"fr:Emova Group",name:"Monceau Fleurs",shop:"florist"},matchScore:2,suggestion:true},"shop/frozen_food/Picard":{name:"Picard",icon:"maki-shop",geometry:["point","area"],tags:{shop:"frozen_food","brand:wikidata":"Q3382454"},addTags:{brand:"Picard","brand:wikidata":"Q3382454","brand:wikipedia":"en:Picard Surgelés",name:"Picard",shop:"frozen_food"},removeTags:{brand:"Picard","brand:wikidata":"Q3382454","brand:wikipedia":"en:Picard Surgelés",name:"Picard",shop:"frozen_food"},matchScore:2,suggestion:true},"shop/funeral_directors/The Co-operative Funeralcare":{name:"The Co-operative Funeralcare",icon:"maki-cemetery",geometry:["point","area"],tags:{shop:"funeral_directors","brand:wikidata":"Q7726521"},addTags:{brand:"The Co-operative Funeralcare","brand:wikidata":"Q7726521","brand:wikipedia":"en:Co-op Funeralcare",name:"The Co-operative Funeralcare",shop:"funeral_directors"},removeTags:{brand:"The Co-operative Funeralcare","brand:wikidata":"Q7726521","brand:wikipedia":"en:Co-op Funeralcare",name:"The Co-operative Funeralcare",shop:"funeral_directors"},matchScore:2,suggestion:true},"shop/furniture/Aaron's":{name:"Aaron's",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q10397787"},addTags:{brand:"Aaron's","brand:wikidata":"Q10397787","brand:wikipedia":"en:Aaron's, Inc.",name:"Aaron's",shop:"furniture"},removeTags:{brand:"Aaron's","brand:wikidata":"Q10397787","brand:wikipedia":"en:Aaron's, Inc.",name:"Aaron's",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Ashley HomeStore":{name:"Ashley HomeStore",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q4805437"},addTags:{brand:"Ashley HomeStore","brand:wikidata":"Q4805437","brand:wikipedia":"en:Ashley HomeStore",name:"Ashley Furniture",shop:"furniture"},removeTags:{brand:"Ashley HomeStore","brand:wikidata":"Q4805437","brand:wikipedia":"en:Ashley HomeStore",name:"Ashley Furniture",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Black Red White":{name:"Black Red White",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q4921546"},addTags:{brand:"Black Red White","brand:wikidata":"Q4921546","brand:wikipedia":"en:Black Red White",name:"Black Red White",shop:"furniture"},removeTags:{brand:"Black Red White","brand:wikidata":"Q4921546","brand:wikipedia":"en:Black Red White",name:"Black Red White",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Bodzio":{name:"Bodzio",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q20034845"},addTags:{brand:"Bodzio","brand:wikidata":"Q20034845","brand:wikipedia":"pl:Fabryka Mebli Bodzio",name:"Bodzio",shop:"furniture"},removeTags:{brand:"Bodzio","brand:wikidata":"Q20034845","brand:wikipedia":"pl:Fabryka Mebli Bodzio",name:"Bodzio",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/But":{name:"But",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q18720442"},addTags:{brand:"But","brand:wikidata":"Q18720442","brand:wikipedia":"en:BUT (retailer)",name:"But",shop:"furniture"},removeTags:{brand:"But","brand:wikidata":"Q18720442","brand:wikipedia":"en:BUT (retailer)",name:"But",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Conforama":{name:"Conforama",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q541134"},addTags:{brand:"Conforama","brand:wikidata":"Q541134","brand:wikipedia":"en:Conforama",name:"Conforama",shop:"furniture"},removeTags:{brand:"Conforama","brand:wikidata":"Q541134","brand:wikipedia":"en:Conforama",name:"Conforama",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Crate & Barrel":{name:"Crate & Barrel",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q5182604"},addTags:{brand:"Crate & Barrel","brand:wikidata":"Q5182604","brand:wikipedia":"en:Crate & Barrel",name:"Crate & Barrel",shop:"furniture"},removeTags:{brand:"Crate & Barrel","brand:wikidata":"Q5182604","brand:wikipedia":"en:Crate & Barrel",name:"Crate & Barrel",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/DFS":{name:"DFS",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q5204927"},addTags:{brand:"DFS","brand:wikidata":"Q5204927","brand:wikipedia":"en:DFS Furniture",name:"DFS",shop:"furniture"},removeTags:{brand:"DFS","brand:wikidata":"Q5204927","brand:wikipedia":"en:DFS Furniture",name:"DFS",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Dänisches Bettenlager":{name:"Dänisches Bettenlager",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q138913"},addTags:{brand:"Dänisches Bettenlager","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"Dänisches Bettenlager",shop:"furniture"},removeTags:{brand:"Dänisches Bettenlager","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"Dänisches Bettenlager",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Ethan Allen":{name:"Ethan Allen",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q5402870"},addTags:{brand:"Ethan Allen","brand:wikidata":"Q5402870","brand:wikipedia":"en:Ethan Allen (furniture company)",name:"Ethan Allen",shop:"furniture"},removeTags:{brand:"Ethan Allen","brand:wikidata":"Q5402870","brand:wikipedia":"en:Ethan Allen (furniture company)",name:"Ethan Allen",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Fly":{name:"Fly",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q1389184"},addTags:{brand:"Fly","brand:wikidata":"Q1389184","brand:wikipedia":"fr:Fly (entreprise)",name:"Fly",shop:"furniture"},removeTags:{brand:"Fly","brand:wikidata":"Q1389184","brand:wikipedia":"fr:Fly (entreprise)",name:"Fly",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Harveys":{name:"Harveys",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q5677754"},addTags:{brand:"Harveys","brand:wikidata":"Q5677754","brand:wikipedia":"en:Harveys Furniture",name:"Harveys",shop:"furniture"},removeTags:{brand:"Harveys","brand:wikidata":"Q5677754","brand:wikipedia":"en:Harveys Furniture",name:"Harveys",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Havertys":{name:"Havertys",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q5683881"},addTags:{brand:"Havertys","brand:wikidata":"Q5683881","brand:wikipedia":"en:Havertys",name:"Havertys",shop:"furniture"},removeTags:{brand:"Havertys","brand:wikidata":"Q5683881","brand:wikipedia":"en:Havertys",name:"Havertys",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/IKEA":{name:"IKEA",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q54078"},addTags:{brand:"IKEA","brand:wikidata":"Q54078","brand:wikipedia":"en:IKEA",name:"IKEA",shop:"furniture"},removeTags:{brand:"IKEA","brand:wikidata":"Q54078","brand:wikipedia":"en:IKEA",name:"IKEA",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/JYSK":{name:"JYSK",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q138913"},addTags:{brand:"JYSK","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"JYSK",shop:"furniture"},removeTags:{brand:"JYSK","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"JYSK",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/La-Z-Boy":{name:"La-Z-Boy",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q6391583"},addTags:{brand:"La-Z-Boy","brand:wikidata":"Q6391583","brand:wikipedia":"en:La-Z-Boy",name:"La-Z-Boy",shop:"furniture"},removeTags:{brand:"La-Z-Boy","brand:wikidata":"Q6391583","brand:wikipedia":"en:La-Z-Boy",name:"La-Z-Boy",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Rent-A-Center":{name:"Rent-A-Center",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q7313497"},addTags:{brand:"Rent-A-Center","brand:wikidata":"Q7313497","brand:wikipedia":"en:Rent-A-Center",name:"Rent-A-Center",shop:"furniture"},removeTags:{brand:"Rent-A-Center","brand:wikidata":"Q7313497","brand:wikipedia":"en:Rent-A-Center",name:"Rent-A-Center",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Restoration Hardware":{name:"Restoration Hardware",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q7316207"},addTags:{brand:"Restoration Hardware","brand:wikidata":"Q7316207","brand:wikipedia":"en:Restoration Hardware",name:"Restoration Hardware",shop:"furniture"},removeTags:{brand:"Restoration Hardware","brand:wikidata":"Q7316207","brand:wikipedia":"en:Restoration Hardware",name:"Restoration Hardware",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Roller":{name:"Roller",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q1621286"},addTags:{brand:"Roller","brand:wikidata":"Q1621286","brand:wikipedia":"de:Roller (Möbelhaus)",name:"Roller",shop:"furniture"},removeTags:{brand:"Roller","brand:wikidata":"Q1621286","brand:wikipedia":"de:Roller (Möbelhaus)",name:"Roller",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Rooms To Go":{name:"Rooms To Go",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q7366329"},addTags:{brand:"Rooms To Go","brand:wikidata":"Q7366329","brand:wikipedia":"en:Rooms To Go",name:"Rooms To Go",shop:"furniture"},removeTags:{brand:"Rooms To Go","brand:wikidata":"Q7366329","brand:wikipedia":"en:Rooms To Go",name:"Rooms To Go",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/ScS":{name:"ScS",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q19654399"},addTags:{brand:"ScS","brand:wikidata":"Q19654399","brand:wikipedia":"en:ScS",name:"ScS",shop:"furniture"},removeTags:{brand:"ScS","brand:wikidata":"Q19654399","brand:wikipedia":"en:ScS",name:"ScS",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/The Brick":{name:"The Brick",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q7720000"},addTags:{brand:"The Brick","brand:wikidata":"Q7720000","brand:wikipedia":"en:The Brick",name:"The Brick",shop:"furniture"},removeTags:{brand:"The Brick","brand:wikidata":"Q7720000","brand:wikipedia":"en:The Brick",name:"The Brick",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/ニトリ":{name:"ニトリ",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q10801453"},addTags:{brand:"ニトリ","brand:en":"Nitori","brand:wikidata":"Q10801453","brand:wikipedia":"en:Nitori",name:"ニトリ","name:en":"Nitori",shop:"furniture"},removeTags:{brand:"ニトリ","brand:en":"Nitori","brand:wikidata":"Q10801453","brand:wikipedia":"en:Nitori",name:"ニトリ","name:en":"Nitori",shop:"furniture"},matchScore:2,suggestion:true},"shop/garden_centre/Dehner":{name:"Dehner",icon:"maki-garden-centre",geometry:["point","area"],tags:{shop:"garden_centre","brand:wikidata":"Q1183029"},addTags:{brand:"Dehner","brand:wikidata":"Q1183029","brand:wikipedia":"de:Dehner",name:"Dehner",shop:"garden_centre"},removeTags:{brand:"Dehner","brand:wikidata":"Q1183029","brand:wikipedia":"de:Dehner",name:"Dehner",shop:"garden_centre"},matchScore:2,suggestion:true},"shop/garden_centre/Gamm Vert":{name:"Gamm Vert",icon:"maki-garden-centre",geometry:["point","area"],tags:{shop:"garden_centre","brand:wikidata":"Q3095006"},addTags:{brand:"Gamm Vert","brand:wikidata":"Q3095006","brand:wikipedia":"fr:Gamm Vert",name:"Gamm Vert",shop:"garden_centre"},removeTags:{brand:"Gamm Vert","brand:wikidata":"Q3095006","brand:wikipedia":"fr:Gamm Vert",name:"Gamm Vert",shop:"garden_centre"},matchScore:2,suggestion:true},"shop/garden_centre/Jardiland":{name:"Jardiland",icon:"maki-garden-centre",geometry:["point","area"],tags:{shop:"garden_centre","brand:wikidata":"Q3162276"},addTags:{brand:"Jardiland","brand:wikidata":"Q3162276","brand:wikipedia":"fr:Jardiland",name:"Jardiland",shop:"garden_centre"},removeTags:{brand:"Jardiland","brand:wikidata":"Q3162276","brand:wikipedia":"fr:Jardiland",name:"Jardiland",shop:"garden_centre"},matchScore:2,suggestion:true},"shop/garden_centre/Point Vert":{name:"Point Vert",icon:"maki-garden-centre",geometry:["point","area"],tags:{shop:"garden_centre","brand:wikidata":"Q16661975"},addTags:{brand:"Point Vert","brand:wikidata":"Q16661975","brand:wikipedia":"fr:Magasin vert",name:"Point Vert",shop:"garden_centre"},removeTags:{brand:"Point Vert","brand:wikidata":"Q16661975","brand:wikipedia":"fr:Magasin vert",name:"Point Vert",shop:"garden_centre"},matchScore:2,suggestion:true},"shop/gift/Card Factory":{name:"Card Factory",icon:"maki-gift",geometry:["point","area"],tags:{shop:"gift","brand:wikidata":"Q5038192"},addTags:{brand:"Card Factory","brand:wikidata":"Q5038192","brand:wikipedia":"en:Card Factory",name:"Card Factory",shop:"gift"},removeTags:{brand:"Card Factory","brand:wikidata":"Q5038192","brand:wikipedia":"en:Card Factory",name:"Card Factory",shop:"gift"},matchScore:2,suggestion:true},"shop/gift/Hallmark":{name:"Hallmark",icon:"maki-gift",geometry:["point","area"],tags:{shop:"gift","brand:wikidata":"Q1521910"},addTags:{brand:"Hallmark","brand:wikidata":"Q1521910","brand:wikipedia":"en:Hallmark Cards",name:"Hallmark",shop:"gift"},removeTags:{brand:"Hallmark","brand:wikidata":"Q1521910","brand:wikipedia":"en:Hallmark Cards",name:"Hallmark",shop:"gift"},matchScore:2,suggestion:true},"shop/gift/Nanu-Nana":{name:"Nanu-Nana",icon:"maki-gift",geometry:["point","area"],tags:{shop:"gift","brand:wikidata":"Q1720245"},addTags:{brand:"Nanu-Nana","brand:wikidata":"Q1720245","brand:wikipedia":"de:Nanu-Nana",name:"Nanu-Nana",shop:"gift"},removeTags:{brand:"Nanu-Nana","brand:wikidata":"Q1720245","brand:wikipedia":"de:Nanu-Nana",name:"Nanu-Nana",shop:"gift"},matchScore:2,suggestion:true},"shop/greengrocer/Produce Junction":{name:"Produce Junction",icon:"maki-shop",geometry:["point","area"],tags:{shop:"greengrocer","brand:wikidata":"Q60583541"},addTags:{brand:"Produce Junction","brand:wikidata":"Q60583541",name:"Produce Junction",shop:"greengrocer"},removeTags:{brand:"Produce Junction","brand:wikidata":"Q60583541",name:"Produce Junction",shop:"greengrocer"},matchScore:2,suggestion:true},"shop/hairdresser_supply/Sally Beauty Supply":{name:"Sally Beauty Supply",icon:"maki-shop",geometry:["point","area"],tags:{shop:"hairdresser_supply","brand:wikidata":"Q7405065"},addTags:{brand:"Sally Beauty Supply","brand:wikidata":"Q7405065","brand:wikipedia":"en:Sally Beauty Holdings",name:"Sally Beauty Supply",shop:"hairdresser_supply"},removeTags:{brand:"Sally Beauty Supply","brand:wikidata":"Q7405065","brand:wikipedia":"en:Sally Beauty Holdings",name:"Sally Beauty Supply",shop:"hairdresser_supply"},matchScore:2,suggestion:true},"shop/hairdresser/Fantastic Sams":{name:"Fantastic Sams",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q5434222"},addTags:{brand:"Fantastic Sams","brand:wikidata":"Q5434222","brand:wikipedia":"en:Fantastic Sams",name:"Fantastic Sams",shop:"hairdresser"},removeTags:{brand:"Fantastic Sams","brand:wikidata":"Q5434222","brand:wikipedia":"en:Fantastic Sams",name:"Fantastic Sams",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/First Choice Haircutters":{name:"First Choice Haircutters",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q5452622"},addTags:{brand:"First Choice Haircutters","brand:wikidata":"Q5452622","brand:wikipedia":"en:First Choice Haircutters",name:"First Choice Haircutters",shop:"hairdresser"},removeTags:{brand:"First Choice Haircutters","brand:wikidata":"Q5452622","brand:wikipedia":"en:First Choice Haircutters",name:"First Choice Haircutters",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Great Clips":{name:"Great Clips",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q5598967"},addTags:{brand:"Great Clips","brand:wikidata":"Q5598967","brand:wikipedia":"en:Great Clips",name:"Great Clips",shop:"hairdresser"},removeTags:{brand:"Great Clips","brand:wikidata":"Q5598967","brand:wikipedia":"en:Great Clips",name:"Great Clips",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Hair Cuttery":{name:"Hair Cuttery",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q5639484"},addTags:{brand:"Hair Cuttery","brand:wikidata":"Q5639484","brand:wikipedia":"en:Hair Cuttery",name:"Hair Cuttery",shop:"hairdresser"},removeTags:{brand:"Hair Cuttery","brand:wikidata":"Q5639484","brand:wikipedia":"en:Hair Cuttery",name:"Hair Cuttery",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Hair Express":{name:"Hair Express",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q57550814"},addTags:{brand:"Hair Express","brand:wikidata":"Q57550814",name:"Hair Express",shop:"hairdresser"},removeTags:{brand:"Hair Express","brand:wikidata":"Q57550814",name:"Hair Express",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Hairkiller":{name:"Hairkiller",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q58305998"},addTags:{brand:"Hairkiller","brand:wikidata":"Q58305998",name:"Hairkiller",shop:"hairdresser"},removeTags:{brand:"Hairkiller","brand:wikidata":"Q58305998",name:"Hairkiller",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Klier":{name:"Klier",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q1465159"},addTags:{brand:"Klier","brand:wikidata":"Q1465159","brand:wikipedia":"de:Frisör Klier",name:"Klier",shop:"hairdresser"},removeTags:{brand:"Klier","brand:wikidata":"Q1465159","brand:wikipedia":"de:Frisör Klier",name:"Klier",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Klipp":{name:"Klipp",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q1737304"},addTags:{brand:"Klipp","brand:wikidata":"Q1737304","brand:wikipedia":"de:Klipp Frisör",name:"Klipp",shop:"hairdresser"},removeTags:{brand:"Klipp","brand:wikidata":"Q1737304","brand:wikipedia":"de:Klipp Frisör",name:"Klipp",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Sport Clips":{name:"Sport Clips",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q7579310"},addTags:{brand:"Sport Clips","brand:wikidata":"Q7579310",name:"Sport Clips",shop:"hairdresser"},removeTags:{brand:"Sport Clips","brand:wikidata":"Q7579310",name:"Sport Clips",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Supercuts":{name:"Supercuts",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q7643239"},addTags:{brand:"Supercuts","brand:wikidata":"Q7643239","brand:wikipedia":"en:Supercuts",name:"Supercuts",shop:"hairdresser"},removeTags:{brand:"Supercuts","brand:wikidata":"Q7643239","brand:wikipedia":"en:Supercuts",name:"Supercuts",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Toni & Guy":{name:"Toni & Guy",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q324784"},addTags:{brand:"Toni & Guy","brand:wikidata":"Q324784","brand:wikipedia":"en:Toni & Guy",name:"Toni & Guy",shop:"hairdresser"},removeTags:{brand:"Toni & Guy","brand:wikidata":"Q324784","brand:wikipedia":"en:Toni & Guy",name:"Toni & Guy",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hardware/Harbor Freight Tools":{name:"Harbor Freight Tools",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"hardware","brand:wikidata":"Q5654601"},addTags:{brand:"Harbor Freight Tools","brand:wikidata":"Q5654601","brand:wikipedia":"en:Harbor Freight Tools",name:"Harbor Freight Tools",shop:"hardware"},removeTags:{brand:"Harbor Freight Tools","brand:wikidata":"Q5654601","brand:wikipedia":"en:Harbor Freight Tools",name:"Harbor Freight Tools",shop:"hardware"},matchScore:2,suggestion:true},"shop/hardware/Home Hardware":{name:"Home Hardware",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"hardware","brand:wikidata":"Q3139611"},addTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware",shop:"hardware"},removeTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware",shop:"hardware"},matchScore:2,suggestion:true},"shop/hardware/True Value":{name:"True Value",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"hardware","brand:wikidata":"Q7847545"},addTags:{brand:"True Value","brand:wikidata":"Q7847545","brand:wikipedia":"en:True Value",name:"True Value",shop:"hardware"},removeTags:{brand:"True Value","brand:wikidata":"Q7847545","brand:wikipedia":"en:True Value",name:"True Value",shop:"hardware"},matchScore:2,suggestion:true},"shop/health_food/Holland & Barrett":{name:"Holland & Barrett",icon:"maki-shop",geometry:["point","area"],tags:{shop:"health_food","brand:wikidata":"Q5880870"},addTags:{brand:"Holland & Barrett","brand:wikidata":"Q5880870","brand:wikipedia":"en:Holland & Barrett",name:"Holland & Barrett",shop:"health_food"},removeTags:{brand:"Holland & Barrett","brand:wikidata":"Q5880870","brand:wikipedia":"en:Holland & Barrett",name:"Holland & Barrett",shop:"health_food"},matchScore:2,suggestion:true},"shop/hearing_aids/Amplifon":{name:"Amplifon",icon:"maki-shop",geometry:["point","area"],tags:{shop:"hearing_aids","brand:wikidata":"Q477222"},addTags:{brand:"Amplifon","brand:wikidata":"Q477222","brand:wikipedia":"en:Amplifon",name:"Amplifon",shop:"hearing_aids"},removeTags:{brand:"Amplifon","brand:wikidata":"Q477222","brand:wikipedia":"en:Amplifon",name:"Amplifon",shop:"hearing_aids"},matchScore:2,suggestion:true},"shop/hearing_aids/Audika":{name:"Audika",icon:"maki-shop",geometry:["point","area"],tags:{shop:"hearing_aids","brand:wikidata":"Q2870745"},addTags:{brand:"Audika","brand:wikidata":"Q2870745","brand:wikipedia":"fr:Audika",name:"Audika",shop:"hearing_aids"},removeTags:{brand:"Audika","brand:wikidata":"Q2870745","brand:wikipedia":"fr:Audika",name:"Audika",shop:"hearing_aids"},matchScore:2,suggestion:true},"shop/hearing_aids/Geers":{name:"Geers",icon:"maki-shop",geometry:["point","area"],tags:{shop:"hearing_aids","brand:wikidata":"Q1497707"},addTags:{brand:"Geers","brand:wikidata":"Q1497707","brand:wikipedia":"de:Geers Hörakustik",name:"Geers",shop:"hearing_aids"},removeTags:{brand:"Geers","brand:wikidata":"Q1497707","brand:wikipedia":"de:Geers Hörakustik",name:"Geers",shop:"hearing_aids"},matchScore:2,suggestion:true},"shop/hearing_aids/Kind Hörgeräte":{name:"Kind Hörgeräte",icon:"maki-shop",geometry:["point","area"],tags:{shop:"hearing_aids","brand:wikidata":"Q43598590"},addTags:{brand:"Kind Hörgeräte","brand:wikidata":"Q43598590","brand:wikipedia":"de:Kind Hörgeräte",name:"Kind Hörgeräte",shop:"hearing_aids"},removeTags:{brand:"Kind Hörgeräte","brand:wikidata":"Q43598590","brand:wikipedia":"de:Kind Hörgeräte",name:"Kind Hörgeräte",shop:"hearing_aids"},matchScore:2,suggestion:true},"shop/hearing_aids/Neuroth":{name:"Neuroth",icon:"maki-shop",geometry:["point","area"],tags:{shop:"hearing_aids","brand:wikidata":"Q15836645"},addTags:{brand:"Neuroth","brand:wikidata":"Q15836645",name:"Neuroth",shop:"hearing_aids"},removeTags:{brand:"Neuroth","brand:wikidata":"Q15836645",name:"Neuroth",shop:"hearing_aids"},matchScore:2,suggestion:true},"shop/hifi/Bang & Olufsen":{name:"Bang & Olufsen",icon:"maki-shop",geometry:["point","area"],tags:{shop:"hifi","brand:wikidata":"Q790020"},addTags:{brand:"Bang & Olufsen","brand:wikidata":"Q790020","brand:wikipedia":"en:Bang & Olufsen",name:"Bang & Olufsen",shop:"hifi"},removeTags:{brand:"Bang & Olufsen","brand:wikidata":"Q790020","brand:wikipedia":"en:Bang & Olufsen",name:"Bang & Olufsen",shop:"hifi"},matchScore:2,suggestion:true},"shop/houseware/Bed Bath & Beyond":{name:"Bed Bath & Beyond",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q813782"},addTags:{brand:"Bed Bath & Beyond","brand:wikidata":"Q813782","brand:wikipedia":"en:Bed Bath & Beyond",name:"Bed Bath & Beyond",shop:"houseware"},removeTags:{brand:"Bed Bath & Beyond","brand:wikidata":"Q813782","brand:wikipedia":"en:Bed Bath & Beyond",name:"Bed Bath & Beyond",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/Blokker":{name:"Blokker",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q884934"},addTags:{brand:"Blokker","brand:wikidata":"Q884934","brand:wikipedia":"en:Blokker Holding",name:"Blokker",shop:"houseware"},removeTags:{brand:"Blokker","brand:wikidata":"Q884934","brand:wikipedia":"en:Blokker Holding",name:"Blokker",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/Cervera":{name:"Cervera",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q10447179"},addTags:{brand:"Cervera","brand:wikidata":"Q10447179","brand:wikipedia":"sv:Cervera (företag)",name:"Cervera",shop:"houseware"},removeTags:{brand:"Cervera","brand:wikidata":"Q10447179","brand:wikipedia":"sv:Cervera (företag)",name:"Cervera",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/HomeGoods":{name:"HomeGoods",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q5887941"},addTags:{brand:"HomeGoods","brand:wikidata":"Q5887941","brand:wikipedia":"en:HomeGoods",name:"HomeGoods",shop:"houseware"},removeTags:{brand:"HomeGoods","brand:wikidata":"Q5887941","brand:wikipedia":"en:HomeGoods",name:"HomeGoods",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/Marskramer":{name:"Marskramer",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q2305917"},addTags:{brand:"Marskramer","brand:wikidata":"Q2305917","brand:wikipedia":"nl:Marskramer (warenhuis)",name:"Marskramer",shop:"houseware"},removeTags:{brand:"Marskramer","brand:wikidata":"Q2305917","brand:wikipedia":"nl:Marskramer (warenhuis)",name:"Marskramer",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/Old Time Pottery":{name:"Old Time Pottery",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q7085222"},addTags:{brand:"Old Time Pottery","brand:website":"http://www.oldtimepottery.com","brand:wikidata":"Q7085222","brand:wikipedia":"en:Old Time Pottery",name:"Old Time Pottery",shop:"houseware"},removeTags:{brand:"Old Time Pottery","brand:website":"http://www.oldtimepottery.com","brand:wikidata":"Q7085222","brand:wikipedia":"en:Old Time Pottery",name:"Old Time Pottery",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/Sur La Table":{name:"Sur La Table",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q7645220"},addTags:{brand:"Sur La Table","brand:wikidata":"Q7645220","brand:wikipedia":"en:Sur La Table",name:"Sur La Table",shop:"houseware"},removeTags:{brand:"Sur La Table","brand:wikidata":"Q7645220","brand:wikipedia":"en:Sur La Table",name:"Sur La Table",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/Tuesday Morning":{name:"Tuesday Morning",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q7851426"},addTags:{brand:"Tuesday Morning","brand:wikidata":"Q7851426","brand:wikipedia":"en:Tuesday Morning",name:"Tuesday Morning",shop:"houseware"},removeTags:{brand:"Tuesday Morning","brand:wikidata":"Q7851426","brand:wikipedia":"en:Tuesday Morning",name:"Tuesday Morning",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/WMF":{name:"WMF",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q451423"},addTags:{brand:"WMF","brand:wikidata":"Q451423","brand:wikipedia":"en:WMF Group",name:"WMF",shop:"houseware"},removeTags:{brand:"WMF","brand:wikidata":"Q451423","brand:wikipedia":"en:WMF Group",name:"WMF",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/Xenos":{name:"Xenos",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q16547960"},addTags:{brand:"Xenos","brand:wikidata":"Q16547960","brand:wikipedia":"nl:Xenos",name:"Xenos",shop:"houseware"},removeTags:{brand:"Xenos","brand:wikidata":"Q16547960","brand:wikipedia":"nl:Xenos",name:"Xenos",shop:"houseware"},matchScore:2,suggestion:true},"shop/interior_decoration/Depot":{name:"Depot",icon:"maki-shop",geometry:["point","area"],tags:{shop:"interior_decoration","brand:wikidata":"Q1191740"},addTags:{brand:"Depot","brand:wikidata":"Q1191740","brand:wikipedia":"de:Gries Deco Holding",name:"Depot",shop:"interior_decoration"},removeTags:{brand:"Depot","brand:wikidata":"Q1191740","brand:wikipedia":"de:Gries Deco Holding",name:"Depot",shop:"interior_decoration"},matchScore:2,suggestion:true},"shop/interior_decoration/Hemtex":{name:"Hemtex",icon:"maki-shop",geometry:["point","area"],tags:{shop:"interior_decoration","brand:wikidata":"Q10521868"},addTags:{brand:"Hemtex",name:"Hemtex","brand:wikidata":"Q10521868","brand:wikipedia":"sv:Hemtex",shop:"interior_decoration"},removeTags:{brand:"Hemtex",name:"Hemtex","brand:wikidata":"Q10521868","brand:wikipedia":"sv:Hemtex",shop:"interior_decoration"},matchScore:2,suggestion:true},"shop/interior_decoration/Pier 1 Imports":{name:"Pier 1 Imports",icon:"maki-shop",geometry:["point","area"],tags:{shop:"interior_decoration","brand:wikidata":"Q7191691"},addTags:{brand:"Pier 1 Imports","brand:wikidata":"Q7191691","brand:wikipedia":"en:Pier 1 Imports",name:"Pier 1 Imports",shop:"interior_decoration"},removeTags:{brand:"Pier 1 Imports","brand:wikidata":"Q7191691","brand:wikipedia":"en:Pier 1 Imports",name:"Pier 1 Imports",shop:"interior_decoration"},matchScore:2,suggestion:true},"shop/jewelry/Apart":{name:"Apart",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q11686561"},addTags:{brand:"Apart","brand:wikidata":"Q11686561","brand:wikipedia":"pl:Apart",name:"Apart",shop:"jewelry"},removeTags:{brand:"Apart","brand:wikidata":"Q11686561","brand:wikipedia":"pl:Apart",name:"Apart",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Bijou Brigitte":{name:"Bijou Brigitte",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q599545"},addTags:{brand:"Bijou Brigitte","brand:wikidata":"Q599545","brand:wikipedia":"de:Bijou Brigitte",name:"Bijou Brigitte",shop:"jewelry"},removeTags:{brand:"Bijou Brigitte","brand:wikidata":"Q599545","brand:wikipedia":"de:Bijou Brigitte",name:"Bijou Brigitte",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Cartier":{name:"Cartier",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q538587"},addTags:{brand:"Cartier","brand:wikidata":"Q538587","brand:wikipedia":"en:Cartier (jeweler)",name:"Cartier",shop:"jewelry"},removeTags:{brand:"Cartier","brand:wikidata":"Q538587","brand:wikipedia":"en:Cartier (jeweler)",name:"Cartier",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Ernest Jones":{name:"Ernest Jones",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q5393358"},addTags:{brand:"Ernest Jones","brand:wikidata":"Q5393358","brand:wikipedia":"en:Ernest Jones (retailer)",name:"Ernest Jones",shop:"jewelry"},removeTags:{brand:"Ernest Jones","brand:wikidata":"Q5393358","brand:wikipedia":"en:Ernest Jones (retailer)",name:"Ernest Jones",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Guldfynd":{name:"Guldfynd",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q49099223"},addTags:{brand:"Guldfynd","brand:wikidata":"Q49099223","brand:wikipedia":"sv:Guldfynd",name:"Guldfynd",shop:"jewelry"},removeTags:{brand:"Guldfynd","brand:wikidata":"Q49099223","brand:wikipedia":"sv:Guldfynd",name:"Guldfynd",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/H Samuel":{name:"H Samuel",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q5628558"},addTags:{brand:"H Samuel","brand:wikidata":"Q5628558","brand:wikipedia":"en:H. Samuel",name:"H Samuel",shop:"jewelry"},removeTags:{brand:"H Samuel","brand:wikidata":"Q5628558","brand:wikipedia":"en:H. Samuel",name:"H Samuel",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/James Avery Jewelry":{name:"James Avery Jewelry",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q6129024"},addTags:{brand:"James Avery Jewelry","brand:wikidata":"Q6129024","brand:wikipedia":"en:James Avery Artisan Jewelry",name:"James Avery Jewelry",shop:"jewelry"},removeTags:{brand:"James Avery Jewelry","brand:wikidata":"Q6129024","brand:wikipedia":"en:James Avery Artisan Jewelry",name:"James Avery Jewelry",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Kay Jewelers":{name:"Kay Jewelers",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q7611434"},addTags:{brand:"Kay Jewelers","brand:wikidata":"Q7611434","brand:wikipedia":"en:Sterling Jewelers",name:"Kay Jewelers",shop:"jewelry"},removeTags:{brand:"Kay Jewelers","brand:wikidata":"Q7611434","brand:wikipedia":"en:Sterling Jewelers",name:"Kay Jewelers",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Pandora":{name:"Pandora",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q2241604"},addTags:{brand:"Pandora","brand:wikidata":"Q2241604","brand:wikipedia":"en:Pandora (jewelry)",name:"Pandora",shop:"jewelry"},removeTags:{brand:"Pandora","brand:wikidata":"Q2241604","brand:wikipedia":"en:Pandora (jewelry)",name:"Pandora",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Swarovski":{name:"Swarovski",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q611115"},addTags:{brand:"Swarovski","brand:wikidata":"Q611115","brand:wikipedia":"en:Swarovski",name:"Swarovski",shop:"jewelry"},removeTags:{brand:"Swarovski","brand:wikidata":"Q611115","brand:wikipedia":"en:Swarovski",name:"Swarovski",shop:"jewelry"},matchScore:2,suggestion:true},"shop/kiosk/Lietuvos spauda":{name:"Lietuvos spauda",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q6514414"},addTags:{brand:"Lietuvos spauda","brand:wikidata":"Q6514414","brand:wikipedia":"lt:Lietuvos spauda",name:"Lietuvos spauda",shop:"kiosk"},removeTags:{brand:"Lietuvos spauda","brand:wikidata":"Q6514414","brand:wikipedia":"lt:Lietuvos spauda",name:"Lietuvos spauda",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/Narvesen":{name:"Narvesen",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q6514414"},addTags:{brand:"Narvesen","brand:wikidata":"Q6514414","brand:wikipedia":"en:Narvesen",name:"Narvesen",shop:"kiosk"},removeTags:{brand:"Narvesen","brand:wikidata":"Q6514414","brand:wikipedia":"en:Narvesen",name:"Narvesen",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/Pressbyrån":{name:"Pressbyrån",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q2489072"},addTags:{brand:"Pressbyrån","brand:wikidata":"Q2489072","brand:wikipedia":"en:Pressbyrån",name:"Pressbyrån",shop:"kiosk"},removeTags:{brand:"Pressbyrån","brand:wikidata":"Q2489072","brand:wikipedia":"en:Pressbyrån",name:"Pressbyrån",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/R-Kioski":{name:"R-Kioski",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q1571400"},addTags:{brand:"R-Kioski","brand:wikidata":"Q1571400","brand:wikipedia":"en:R-kioski",name:"R-Kioski",shop:"kiosk"},removeTags:{brand:"R-Kioski","brand:wikidata":"Q1571400","brand:wikipedia":"en:R-kioski",name:"R-Kioski",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/Ruch":{name:"Ruch",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q1260314"},addTags:{brand:"Ruch","brand:wikidata":"Q1260314","brand:wikipedia":"pl:Ruch (przedsiębiorstwo)",name:"Ruch",shop:"kiosk"},removeTags:{brand:"Ruch","brand:wikidata":"Q1260314","brand:wikipedia":"pl:Ruch (przedsiębiorstwo)",name:"Ruch",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/k kiosk":{name:"k kiosk",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q60381703"},addTags:{brand:"k kiosk","brand:wikidata":"Q60381703","brand:wikipedia":"it:K Kiosk",name:"k kiosk",shop:"kiosk"},removeTags:{brand:"k kiosk","brand:wikidata":"Q60381703","brand:wikipedia":"it:K Kiosk",name:"k kiosk",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kitchen/Cuisinella":{name:"Cuisinella",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kitchen","brand:wikidata":"Q3007012"},addTags:{brand:"Cuisinella","brand:wikidata":"Q3007012","brand:wikipedia":"fr:Cuisinella",name:"Cuisinella",shop:"kitchen"},removeTags:{brand:"Cuisinella","brand:wikidata":"Q3007012","brand:wikipedia":"fr:Cuisinella",name:"Cuisinella",shop:"kitchen"},matchScore:2,suggestion:true},"shop/kitchen/Schmidt":{name:"Schmidt",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kitchen","brand:wikidata":"Q3487620"},addTags:{brand:"Schmidt","brand:wikidata":"Q3487620","brand:wikipedia":"de:Schmidt Groupe",name:"Schmidt",shop:"kitchen"},removeTags:{brand:"Schmidt","brand:wikidata":"Q3487620","brand:wikipedia":"de:Schmidt Groupe",name:"Schmidt",shop:"kitchen"},matchScore:2,suggestion:true},"shop/massage/Massage Envy":{name:"Massage Envy",icon:"temaki-spa",geometry:["point","area"],tags:{shop:"massage","brand:wikidata":"Q22922899"},addTags:{brand:"Massage Envy","brand:wikidata":"Q22922899","brand:wikipedia":"en:Massage Envy",name:"Massage Envy",shop:"massage"},removeTags:{brand:"Massage Envy","brand:wikidata":"Q22922899","brand:wikipedia":"en:Massage Envy",name:"Massage Envy",shop:"massage"},matchScore:2,suggestion:true},"shop/mobile_phone/3 Store":{name:"3 Store",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q407009"},addTags:{brand:"3 Store","brand:wikidata":"Q407009","brand:wikipedia":"en:3 (telecommunications)",name:"3 Store",shop:"mobile_phone"},removeTags:{brand:"3 Store","brand:wikidata":"Q407009","brand:wikipedia":"en:3 (telecommunications)",name:"3 Store",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/AT&T":{name:"AT&T",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q298594"},addTags:{brand:"AT&T","brand:wikidata":"Q298594","brand:wikipedia":"en:AT&T Mobility",name:"AT&T",shop:"mobile_phone"},removeTags:{brand:"AT&T","brand:wikidata":"Q298594","brand:wikipedia":"en:AT&T Mobility",name:"AT&T",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Bell":{name:"Bell",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q2894594"},addTags:{brand:"Bell","brand:wikidata":"Q2894594","brand:wikipedia":"en:Bell Mobility",name:"Bell",shop:"mobile_phone"},removeTags:{brand:"Bell","brand:wikidata":"Q2894594","brand:wikipedia":"en:Bell Mobility",name:"Bell",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Boost Mobile":{name:"Boost Mobile",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q4943790"},addTags:{brand:"Boost Mobile","brand:wikidata":"Q4943790","brand:wikipedia":"en:Boost Mobile",name:"Boost Mobile",shop:"mobile_phone"},removeTags:{brand:"Boost Mobile","brand:wikidata":"Q4943790","brand:wikipedia":"en:Boost Mobile",name:"Boost Mobile",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Carphone Warehouse":{name:"Carphone Warehouse",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q118046"},addTags:{brand:"Carphone Warehouse","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Carphone Warehouse",shop:"mobile_phone"},removeTags:{brand:"Carphone Warehouse","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Carphone Warehouse",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Claro":{name:"Claro",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1770208"},addTags:{brand:"Claro","brand:wikidata":"Q1770208","brand:wikipedia":"en:Claro (company)",name:"Claro",shop:"mobile_phone"},removeTags:{brand:"Claro","brand:wikidata":"Q1770208","brand:wikipedia":"en:Claro (company)",name:"Claro",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Cricket Wireless":{name:"Cricket Wireless",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q5184987"},addTags:{brand:"Cricket Wireless","brand:wikidata":"Q5184987","brand:wikipedia":"en:Cricket Wireless",name:"Cricket Wireless",shop:"mobile_phone"},removeTags:{brand:"Cricket Wireless","brand:wikidata":"Q5184987","brand:wikipedia":"en:Cricket Wireless",name:"Cricket Wireless",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Digicel":{name:"Digicel",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q2117506"},addTags:{brand:"Digicel","brand:wikidata":"Q2117506","brand:wikipedia":"en:Digicel",name:"Digicel",shop:"mobile_phone"},removeTags:{brand:"Digicel","brand:wikidata":"Q2117506","brand:wikipedia":"en:Digicel",name:"Digicel",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/EE":{name:"EE",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q5322942"},addTags:{brand:"EE","brand:wikidata":"Q5322942","brand:wikipedia":"en:EE Limited",name:"EE",shop:"mobile_phone"},removeTags:{brand:"EE","brand:wikidata":"Q5322942","brand:wikipedia":"en:EE Limited",name:"EE",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Entel":{name:"Entel",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q5323742"},addTags:{brand:"Entel","brand:wikidata":"Q5323742","brand:wikipedia":"en:ENTel",name:"Entel",shop:"mobile_phone"},removeTags:{brand:"Entel","brand:wikidata":"Q5323742","brand:wikipedia":"en:ENTel",name:"Entel",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/MTN":{name:"MTN",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1813361"},addTags:{brand:"MTN","brand:wikidata":"Q1813361","brand:wikipedia":"en:MTN Group",name:"MTN",shop:"mobile_phone"},removeTags:{brand:"MTN","brand:wikidata":"Q1813361","brand:wikipedia":"en:MTN Group",name:"MTN",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/MetroPCS":{name:"MetroPCS",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1925685"},addTags:{brand:"MetroPCS","brand:wikidata":"Q1925685","brand:wikipedia":"en:Metro by T-Mobile",name:"MetroPCS",shop:"mobile_phone"},removeTags:{brand:"MetroPCS","brand:wikidata":"Q1925685","brand:wikipedia":"en:Metro by T-Mobile",name:"MetroPCS",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Mobilcom Debitel":{name:"Mobilcom Debitel",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q344744"},addTags:{brand:"Mobilcom Debitel","brand:wikidata":"Q344744","brand:wikipedia":"en:Debitel",name:"Mobilcom Debitel",shop:"mobile_phone"},removeTags:{brand:"Mobilcom Debitel","brand:wikidata":"Q344744","brand:wikipedia":"en:Debitel",name:"Mobilcom Debitel",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Moov":{name:"Moov",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q3323637"},addTags:{brand:"Moov","brand:wikidata":"Q3323637","brand:wikipedia":"fr:Moov Côte d'Ivoire",name:"Moov",shop:"mobile_phone"},removeTags:{brand:"Moov","brand:wikidata":"Q3323637","brand:wikipedia":"fr:Moov Côte d'Ivoire",name:"Moov",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Movistar":{name:"Movistar",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q967735"},addTags:{brand:"Movistar","brand:wikidata":"Q967735","brand:wikipedia":"en:Movistar",name:"Movistar",shop:"mobile_phone"},removeTags:{brand:"Movistar","brand:wikidata":"Q967735","brand:wikipedia":"en:Movistar",name:"Movistar",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/O2":{name:"O2",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q7072246"},addTags:{brand:"O2","brand:wikidata":"Q7072246","brand:wikipedia":"en:O2 (Ireland)",name:"O2",shop:"mobile_phone"},removeTags:{brand:"O2","brand:wikidata":"Q7072246","brand:wikipedia":"en:O2 (Ireland)",name:"O2",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Orange":{name:"Orange",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1431486"},addTags:{brand:"Orange","brand:wikidata":"Q1431486","brand:wikipedia":"fr:Orange S.A.",name:"Orange",shop:"mobile_phone"},removeTags:{brand:"Orange","brand:wikidata":"Q1431486","brand:wikipedia":"fr:Orange S.A.",name:"Orange",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Phone House":{name:"Phone House",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q118046"},addTags:{brand:"Phone House","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Phone House",shop:"mobile_phone"},removeTags:{brand:"Phone House","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Phone House",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Play":{name:"Play",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q7202998"},addTags:{brand:"Play","brand:wikidata":"Q7202998","brand:wikipedia":"en:Play (telecommunications)",name:"Play",shop:"mobile_phone"},removeTags:{brand:"Play","brand:wikidata":"Q7202998","brand:wikipedia":"en:Play (telecommunications)",name:"Play",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Plus":{name:"Plus",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q7205598"},addTags:{brand:"Plus","brand:wikidata":"Q7205598","brand:wikipedia":"pl:Plus (sieć telefonii komórkowej)",name:"Plus",shop:"mobile_phone"},removeTags:{brand:"Plus","brand:wikidata":"Q7205598","brand:wikipedia":"pl:Plus (sieć telefonii komórkowej)",name:"Plus",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Rogers":{name:"Rogers",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q3439663"},addTags:{brand:"Rogers","brand:wikidata":"Q3439663","brand:wikipedia":"en:Rogers Wireless",name:"Rogers",shop:"mobile_phone"},removeTags:{brand:"Rogers","brand:wikidata":"Q3439663","brand:wikipedia":"en:Rogers Wireless",name:"Rogers",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/SFR":{name:"SFR",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q218765"},addTags:{brand:"SFR","brand:wikidata":"Q218765","brand:wikipedia":"en:SFR",name:"SFR",shop:"mobile_phone"},removeTags:{brand:"SFR","brand:wikidata":"Q218765","brand:wikipedia":"en:SFR",name:"SFR",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Sprint":{name:"Sprint",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q301965"},addTags:{brand:"Sprint","brand:wikidata":"Q301965","brand:wikipedia":"en:Sprint Corporation",name:"Sprint",shop:"mobile_phone"},removeTags:{brand:"Sprint","brand:wikidata":"Q301965","brand:wikipedia":"en:Sprint Corporation",name:"Sprint",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/T-Mobile":{name:"T-Mobile",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q327634"},addTags:{brand:"T-Mobile","brand:wikidata":"Q327634","brand:wikipedia":"en:T-Mobile",name:"T-Mobile",shop:"mobile_phone"},removeTags:{brand:"T-Mobile","brand:wikidata":"Q327634","brand:wikipedia":"en:T-Mobile",name:"T-Mobile",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/TIM":{name:"TIM",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q144617"},addTags:{brand:"TIM","brand:wikidata":"Q144617","brand:wikipedia":"en:Telecom Italia",name:"TIM",shop:"mobile_phone"},removeTags:{brand:"TIM","brand:wikidata":"Q144617","brand:wikipedia":"en:Telecom Italia",name:"TIM",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telcel":{name:"Telcel",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q3517255"},addTags:{brand:"Telcel","brand:wikidata":"Q3517255","brand:wikipedia":"en:Telcel",name:"Telcel",shop:"mobile_phone"},removeTags:{brand:"Telcel","brand:wikidata":"Q3517255","brand:wikipedia":"en:Telcel",name:"Telcel",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Tele2":{name:"Tele2",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q309865"},addTags:{brand:"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Tele2",shop:"mobile_phone"},removeTags:{brand:"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Tele2",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telekom":{name:"Telekom",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q9396"},addTags:{brand:"Telekom","brand:wikidata":"Q9396","brand:wikipedia":"en:Deutsche Telekom",name:"Telekom",shop:"mobile_phone"},removeTags:{brand:"Telekom","brand:wikidata":"Q9396","brand:wikipedia":"en:Deutsche Telekom",name:"Telekom",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telenor":{name:"Telenor",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q845632"},addTags:{brand:"Telenor","brand:wikidata":"Q845632","brand:wikipedia":"en:Telenor",name:"Telenor",shop:"mobile_phone"},removeTags:{brand:"Telenor","brand:wikidata":"Q845632","brand:wikipedia":"en:Telenor",name:"Telenor",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telstra":{name:"Telstra",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q721162"},addTags:{brand:"Telstra","brand:wikidata":"Q721162","brand:wikipedia":"en:Telstra",name:"Telstra",shop:"mobile_phone"},removeTags:{brand:"Telstra","brand:wikidata":"Q721162","brand:wikipedia":"en:Telstra",name:"Telstra",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telus":{name:"Telus",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q165858"},addTags:{brand:"Telus","brand:wikidata":"Q165858","brand:wikipedia":"en:Telus",name:"Telus",shop:"mobile_phone"},removeTags:{brand:"Telus","brand:wikidata":"Q165858","brand:wikipedia":"en:Telus",name:"Telus",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Turkcell":{name:"Turkcell",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q283852"},addTags:{brand:"Turkcell","brand:wikidata":"Q283852","brand:wikipedia":"en:Turkcell",name:"Turkcell",shop:"mobile_phone"},removeTags:{brand:"Turkcell","brand:wikidata":"Q283852","brand:wikipedia":"en:Turkcell",name:"Turkcell",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Télécentre":{name:"Télécentre",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q180034"},addTags:{brand:"Télécentre","brand:wikidata":"Q180034","brand:wikipedia":"en:Telecentre",name:"Télécentre",shop:"mobile_phone"},removeTags:{brand:"Télécentre","brand:wikidata":"Q180034","brand:wikipedia":"en:Telecentre",name:"Télécentre",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/U.S. Cellular":{name:"U.S. Cellular",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q2466256"},addTags:{brand:"U.S. Cellular","brand:wikidata":"Q2466256","brand:wikipedia":"en:U.S. Cellular",name:"U.S. Cellular",shop:"mobile_phone"},removeTags:{brand:"U.S. Cellular","brand:wikidata":"Q2466256","brand:wikipedia":"en:U.S. Cellular",name:"U.S. Cellular",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Verizon Wireless":{name:"Verizon Wireless",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q919641"},addTags:{brand:"Verizon Wireless","brand:wikidata":"Q919641","brand:wikipedia":"en:Verizon Wireless",name:"Verizon Wireless",shop:"mobile_phone"},removeTags:{brand:"Verizon Wireless","brand:wikidata":"Q919641","brand:wikipedia":"en:Verizon Wireless",name:"Verizon Wireless",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Vodafone":{name:"Vodafone",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q122141"},addTags:{brand:"Vodafone","brand:wikidata":"Q122141","brand:wikipedia":"en:Vodafone",name:"Vodafone",shop:"mobile_phone"},removeTags:{brand:"Vodafone","brand:wikidata":"Q122141","brand:wikipedia":"en:Vodafone",name:"Vodafone",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/WIFI_ETECSA":{name:"WIFI_ETECSA",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q490323"},addTags:{brand:"WIFI_ETECSA","brand:wikidata":"Q490323","brand:wikipedia":"es:Empresa de Telecomunicaciones de Cuba",name:"WIFI_ETECSA",shop:"mobile_phone"},removeTags:{brand:"WIFI_ETECSA","brand:wikidata":"Q490323","brand:wikipedia":"es:Empresa de Telecomunicaciones de Cuba",name:"WIFI_ETECSA",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Wind":{name:"Wind",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q650467"},addTags:{brand:"Wind","brand:wikidata":"Q650467","brand:wikipedia":"en:WIND (Italy)",name:"Wind",shop:"mobile_phone"},removeTags:{brand:"Wind","brand:wikidata":"Q650467","brand:wikipedia":"en:WIND (Italy)",name:"Wind",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Yoigo":{name:"Yoigo",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q2630989"},addTags:{brand:"Yoigo","brand:wikidata":"Q2630989","brand:wikipedia":"en:Yoigo",name:"Yoigo",shop:"mobile_phone"},removeTags:{brand:"Yoigo","brand:wikidata":"Q2630989","brand:wikipedia":"en:Yoigo",name:"Yoigo",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/auショップ":{name:"auショップ",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q11190521"},addTags:{brand:"au","brand:wikidata":"Q11190521","brand:wikipedia":"ja:au (通信)",name:"auショップ",shop:"mobile_phone"},removeTags:{brand:"au","brand:wikidata":"Q11190521","brand:wikipedia":"ja:au (通信)",name:"auショップ",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Алло":{name:"Алло",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q18683057"},addTags:{brand:"Алло","brand:wikidata":"Q18683057","brand:wikipedia":"uk:Алло (торгова мережа)",name:"Алло",shop:"mobile_phone"},removeTags:{brand:"Алло","brand:wikidata":"Q18683057","brand:wikipedia":"uk:Алло (торгова мережа)",name:"Алло",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Билайн":{name:"Билайн",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q402880"},addTags:{brand:"Билайн","brand:en":"Beeline","brand:wikidata":"Q402880","brand:wikipedia":"en:Beeline (brand)",name:"Билайн","name:en":"Beeline",shop:"mobile_phone"},removeTags:{brand:"Билайн","brand:en":"Beeline","brand:wikidata":"Q402880","brand:wikipedia":"en:Beeline (brand)",name:"Билайн","name:en":"Beeline",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Евросеть":{name:"Евросеть",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q65310"},addTags:{brand:"Евросеть","brand:en":"Euroset","brand:wikidata":"Q65310","brand:wikipedia":"en:Euroset",name:"Евросеть","name:en":"Euroset",shop:"mobile_phone"},removeTags:{brand:"Евросеть","brand:en":"Euroset","brand:wikidata":"Q65310","brand:wikipedia":"en:Euroset",name:"Евросеть","name:en":"Euroset",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Київстар":{name:"Київстар",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q2288463"},addTags:{brand:"Київстар","brand:en":"Kyivstar","brand:wikidata":"Q2288463","brand:wikipedia":"en:Kyivstar",name:"Київстар","name:en":"Kyivstar",shop:"mobile_phone"},removeTags:{brand:"Київстар","brand:en":"Kyivstar","brand:wikidata":"Q2288463","brand:wikipedia":"en:Kyivstar",name:"Київстар","name:en":"Kyivstar",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/МТС":{name:"МТС",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1368919"},addTags:{brand:"МТС","brand:en":"MTS","brand:wikidata":"Q1368919","brand:wikipedia":"en:MTS (network provider)",name:"МТС","name:en":"MTS",shop:"mobile_phone"},removeTags:{brand:"МТС","brand:en":"MTS","brand:wikidata":"Q1368919","brand:wikipedia":"en:MTS (network provider)",name:"МТС","name:en":"MTS",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Мегафон":{name:"Мегафон",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1720713"},addTags:{brand:"Мегафон","brand:en":"MegaFon","brand:wikidata":"Q1720713","brand:wikipedia":"en:MegaFon",name:"Мегафон","name:en":"MegaFon",shop:"mobile_phone"},removeTags:{brand:"Мегафон","brand:en":"MegaFon","brand:wikidata":"Q1720713","brand:wikipedia":"en:MegaFon",name:"Мегафон","name:en":"MegaFon",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Связной":{name:"Связной",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q65371"},addTags:{brand:"Связной","brand:en":"Svyaznoy","brand:wikidata":"Q65371","brand:wikipedia":"en:Svyaznoy",name:"Связной","name:en":"Svyaznoy",shop:"mobile_phone"},removeTags:{brand:"Связной","brand:en":"Svyaznoy","brand:wikidata":"Q65371","brand:wikipedia":"en:Svyaznoy",name:"Связной","name:en":"Svyaznoy",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Теле2":{name:"Теле2",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q309865"},addTags:{brand:"Теле2","brand:en":"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Теле2","name:en":"Tele2",shop:"mobile_phone"},removeTags:{brand:"Теле2","brand:en":"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Теле2","name:en":"Tele2",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/ソフトバンク":{name:"ソフトバンク",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q7553832"},addTags:{brand:"ソフトバンク","brand:en":"SoftBank Telecom","brand:wikidata":"Q7553832","brand:wikipedia":"en:SoftBank Telecom",name:"ソフトバンク","name:en":"SoftBank Telecom",shop:"mobile_phone"},removeTags:{brand:"ソフトバンク","brand:en":"SoftBank Telecom","brand:wikidata":"Q7553832","brand:wikipedia":"en:SoftBank Telecom",name:"ソフトバンク","name:en":"SoftBank Telecom",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/ソフトバンクショップ":{name:"ソフトバンクショップ",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q11315281"},addTags:{brand:"ソフトバンクショップ","brand:en":"SoftBankShop","brand:wikidata":"Q11315281","brand:wikipedia":"ja:ソフトバンクショップ",name:"ソフトバンクショップ","name:en":"SoftBankShop",shop:"mobile_phone"},removeTags:{brand:"ソフトバンクショップ","brand:en":"SoftBankShop","brand:wikidata":"Q11315281","brand:wikipedia":"ja:ソフトバンクショップ",name:"ソフトバンクショップ","name:en":"SoftBankShop",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/ドコモショップ":{name:"ドコモショップ",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q853958"},addTags:{brand:"ドコモショップ","brand:en":"DoCoMo Shop","brand:wikidata":"Q853958","brand:wikipedia":"ja:NTTドコモ",name:"ドコモショップ","name:en":"DoCoMo Shop",shop:"mobile_phone"},removeTags:{brand:"ドコモショップ","brand:en":"DoCoMo Shop","brand:wikidata":"Q853958","brand:wikipedia":"ja:NTTドコモ",name:"ドコモショップ","name:en":"DoCoMo Shop",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/money_lender/Money Mart":{name:"Money Mart",icon:"maki-bank",geometry:["point","area"],tags:{shop:"money_lender","brand:wikidata":"Q6899166"},addTags:{brand:"Money Mart","brand:wikidata":"Q6899166","brand:wikipedia":"en:Money Mart",name:"Money Mart",shop:"money_lender"},removeTags:{brand:"Money Mart","brand:wikidata":"Q6899166","brand:wikipedia":"en:Money Mart",name:"Money Mart",shop:"money_lender"},matchScore:2,suggestion:true},"shop/motorcycle/Harley-Davidson":{name:"Harley-Davidson",icon:"fas-motorcycle",geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q192814"},addTags:{brand:"Harley-Davidson","brand:wikidata":"Q192814","brand:wikipedia":"en:Harley-Davidson",name:"Harley-Davidson",shop:"motorcycle"},removeTags:{brand:"Harley-Davidson","brand:wikidata":"Q192814","brand:wikipedia":"en:Harley-Davidson",name:"Harley-Davidson",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Honda":{name:"Honda",icon:"fas-motorcycle",geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q9584"},addTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"motorcycle"},removeTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Kawasaki":{name:"Kawasaki",icon:"fas-motorcycle",geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q6379855"},addTags:{brand:"Kawasaki","brand:wikidata":"Q6379855","brand:wikipedia":"en:Kawasaki motorcycles",name:"Kawasaki",shop:"motorcycle"},removeTags:{brand:"Kawasaki","brand:wikidata":"Q6379855","brand:wikipedia":"en:Kawasaki motorcycles",name:"Kawasaki",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Motortrade":{name:"Motortrade",icon:"fas-motorcycle",geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q48803162"},addTags:{brand:"Motortrade","brand:wikidata":"Q48803162","brand:wikipedia":"en:Motortrade",name:"Motortrade",shop:"motorcycle"},removeTags:{brand:"Motortrade","brand:wikidata":"Q48803162","brand:wikipedia":"en:Motortrade",name:"Motortrade",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Suzuki":{name:"Suzuki",icon:"fas-motorcycle",geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q181642"},addTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"motorcycle"},removeTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Yamaha":{name:"Yamaha",icon:"fas-motorcycle",geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q158888"},addTags:{brand:"Yamaha","brand:wikidata":"Q158888","brand:wikipedia":"en:Yamaha Motor Company",name:"Yamaha",shop:"motorcycle"},removeTags:{brand:"Yamaha","brand:wikidata":"Q158888","brand:wikipedia":"en:Yamaha Motor Company",name:"Yamaha",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/musical_instrument/Guitar Center":{name:"Guitar Center",icon:"maki-music",geometry:["point","area"],tags:{shop:"musical_instrument","brand:wikidata":"Q3622794"},addTags:{brand:"Guitar Center","brand:wikidata":"Q3622794","brand:wikipedia":"en:Guitar Center",name:"Guitar Center",shop:"musical_instrument"},removeTags:{brand:"Guitar Center","brand:wikidata":"Q3622794","brand:wikipedia":"en:Guitar Center",name:"Guitar Center",shop:"musical_instrument"},matchScore:2,suggestion:true},"shop/music/HMV":{name:"HMV",icon:"maki-music",geometry:["point","area"],tags:{shop:"music","brand:wikidata":"Q10854572"},addTags:{brand:"HMV","brand:wikidata":"Q10854572","brand:wikipedia":"en:HMV",name:"HMV",shop:"music"},removeTags:{brand:"HMV","brand:wikidata":"Q10854572","brand:wikipedia":"en:HMV",name:"HMV",shop:"music"},matchScore:2,suggestion:true},"shop/music/TSUTAYA":{name:"TSUTAYA",icon:"maki-music",geometry:["point","area"],tags:{shop:"music","brand:wikidata":"Q5193457"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"music"},removeTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"music"},matchScore:2,suggestion:true},"shop/newsagent/Kolporter":{name:"Kolporter",icon:"maki-shop",geometry:["point","area"],tags:{shop:"newsagent","brand:wikidata":"Q6427874"},addTags:{brand:"Kolporter","brand:wikidata":"Q6427874","brand:wikipedia":"pl:Kolporter (przedsiębiorstwo)",name:"Kolporter",shop:"kiosk"},removeTags:{brand:"Kolporter","brand:wikidata":"Q6427874","brand:wikipedia":"pl:Kolporter (przedsiębiorstwo)",name:"Kolporter",shop:"kiosk"},matchScore:2,suggestion:true},"shop/newsagent/読売新聞":{name:"読売新聞",icon:"maki-shop",geometry:["point","area"],tags:{shop:"newsagent","brand:wikidata":"Q645218"},addTags:{brand:"読売新聞","brand:en":"Yomiuri Shimbun","brand:wikidata":"Q645218","brand:wikipedia":"en:Yomiuri Shimbun",name:"読売新聞","name:en":"Yomiuri Shimbun",shop:"newsagent"},removeTags:{brand:"読売新聞","brand:en":"Yomiuri Shimbun","brand:wikidata":"Q645218","brand:wikipedia":"en:Yomiuri Shimbun",name:"読売新聞","name:en":"Yomiuri Shimbun",shop:"newsagent"},matchScore:2,suggestion:true},"shop/nutrition_supplements/GNC":{name:"GNC",icon:"maki-shop",geometry:["point","area"],tags:{shop:"nutrition_supplements","brand:wikidata":"Q4808595"},addTags:{brand:"GNC","brand:wikidata":"Q4808595","brand:wikipedia":"en:GNC (store)",name:"GNC",shop:"nutrition_supplements"},removeTags:{brand:"GNC","brand:wikidata":"Q4808595","brand:wikipedia":"en:GNC (store)",name:"GNC",shop:"nutrition_supplements"},matchScore:2,suggestion:true},"shop/nutrition_supplements/The Vitamin Shoppe":{name:"The Vitamin Shoppe",icon:"maki-shop",geometry:["point","area"],tags:{shop:"nutrition_supplements","brand:wikidata":"Q7772938"},addTags:{brand:"The Vitamin Shoppe","brand:wikidata":"Q7772938","brand:wikipedia":"en:The Vitamin Shoppe",name:"The Vitamin Shoppe",shop:"nutrition_supplements"},removeTags:{brand:"The Vitamin Shoppe","brand:wikidata":"Q7772938","brand:wikipedia":"en:The Vitamin Shoppe",name:"The Vitamin Shoppe",shop:"nutrition_supplements"},matchScore:2,suggestion:true},"shop/optician/Alain Afflelou":{name:"Alain Afflelou",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2829511"},addTags:{brand:"Alain Afflelou","brand:wikidata":"Q2829511","brand:wikipedia":"fr:Alain Afflelou (entreprise)",name:"Alain Afflelou",shop:"optician"},removeTags:{brand:"Alain Afflelou","brand:wikidata":"Q2829511","brand:wikipedia":"fr:Alain Afflelou (entreprise)",name:"Alain Afflelou",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Apollo":{name:"Apollo",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q618940"},addTags:{brand:"Apollo","brand:wikidata":"Q618940","brand:wikipedia":"de:Apollo-Optik",name:"Apollo",shop:"optician"},removeTags:{brand:"Apollo","brand:wikidata":"Q618940","brand:wikipedia":"de:Apollo-Optik",name:"Apollo",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Atol":{name:"Atol",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2869542"},addTags:{brand:"Atol","brand:wikidata":"Q2869542","brand:wikipedia":"fr:Atol (opticien)",name:"Atol",shop:"optician"},removeTags:{brand:"Atol","brand:wikidata":"Q2869542","brand:wikipedia":"fr:Atol (opticien)",name:"Atol",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Boots Opticians":{name:"Boots Opticians",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q4944037"},addTags:{brand:"Boots Opticians","brand:wikidata":"Q4944037","brand:wikipedia":"en:Boots Opticians",name:"Boots Opticians",shop:"optician"},removeTags:{brand:"Boots Opticians","brand:wikidata":"Q4944037","brand:wikipedia":"en:Boots Opticians",name:"Boots Opticians",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Fielmann":{name:"Fielmann",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q457822"},addTags:{brand:"Fielmann","brand:wikidata":"Q457822","brand:wikipedia":"en:Fielmann",name:"Fielmann",shop:"optician"},removeTags:{brand:"Fielmann","brand:wikidata":"Q457822","brand:wikipedia":"en:Fielmann",name:"Fielmann",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Grand Optical":{name:"Grand Optical",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q3113677"},addTags:{brand:"Grand Optical","brand:wikidata":"Q3113677","brand:wikipedia":"fr:Grand Optical",name:"Grand Optical",shop:"optician"},removeTags:{brand:"Grand Optical","brand:wikidata":"Q3113677","brand:wikipedia":"fr:Grand Optical",name:"Grand Optical",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Hakim Optical":{name:"Hakim Optical",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q28232761"},addTags:{brand:"Hakim Optical","brand:wikidata":"Q28232761","brand:wikipedia":"en:Hakim Optical",name:"Hakim Optical",shop:"optician"},removeTags:{brand:"Hakim Optical","brand:wikidata":"Q28232761","brand:wikipedia":"en:Hakim Optical",name:"Hakim Optical",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Hans Anders":{name:"Hans Anders",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q1884976"},addTags:{brand:"Hans Anders","brand:wikidata":"Q1884976","brand:wikipedia":"nl:Hans Anders",name:"Hans Anders",shop:"optician"},removeTags:{brand:"Hans Anders","brand:wikidata":"Q1884976","brand:wikipedia":"nl:Hans Anders",name:"Hans Anders",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Krys":{name:"Krys",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q3119538"},addTags:{brand:"Krys","brand:wikidata":"Q3119538","brand:wikipedia":"fr:Krys Group",name:"Krys",shop:"optician"},removeTags:{brand:"Krys","brand:wikidata":"Q3119538","brand:wikipedia":"fr:Krys Group",name:"Krys",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/LensCrafters":{name:"LensCrafters",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q6523209"},addTags:{brand:"LensCrafters","brand:wikidata":"Q6523209","brand:wikipedia":"en:LensCrafters",name:"LensCrafters",shop:"optician"},removeTags:{brand:"LensCrafters","brand:wikidata":"Q6523209","brand:wikipedia":"en:LensCrafters",name:"LensCrafters",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Les Opticiens Mutualistes":{name:"Les Opticiens Mutualistes",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q18414551"},addTags:{brand:"Les Opticiens Mutualistes","brand:wikidata":"Q18414551","brand:wikipedia":"fr:Les Opticiens Mutualistes",name:"Les Opticiens Mutualistes",shop:"optician"},removeTags:{brand:"Les Opticiens Mutualistes","brand:wikidata":"Q18414551","brand:wikipedia":"fr:Les Opticiens Mutualistes",name:"Les Opticiens Mutualistes",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Optic 2000":{name:"Optic 2000",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q3354445"},addTags:{brand:"Optic 2000","brand:wikidata":"Q3354445","brand:wikipedia":"fr:Optic 2000",name:"Optic 2000",shop:"optician"},removeTags:{brand:"Optic 2000","brand:wikidata":"Q3354445","brand:wikipedia":"fr:Optic 2000",name:"Optic 2000",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Pearle":{name:"Pearle",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2231148"},addTags:{brand:"Pearle","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle",shop:"optician"},removeTags:{brand:"Pearle","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Pearle Vision":{name:"Pearle Vision",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2231148"},addTags:{brand:"Pearle Vision","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle Vision",shop:"optician"},removeTags:{brand:"Pearle Vision","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle Vision",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Specsavers":{name:"Specsavers",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2000610"},addTags:{brand:"Specsavers","brand:wikidata":"Q2000610","brand:wikipedia":"en:Specsavers",name:"Specsavers",shop:"optician"},removeTags:{brand:"Specsavers","brand:wikidata":"Q2000610","brand:wikipedia":"en:Specsavers",name:"Specsavers",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Sunglass Hut":{name:"Sunglass Hut",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q136311"},addTags:{brand:"Sunglass Hut","brand:wikidata":"Q136311","brand:wikipedia":"en:Sunglass Hut",name:"Sunglass Hut",shop:"optician"},removeTags:{brand:"Sunglass Hut","brand:wikidata":"Q136311","brand:wikipedia":"en:Sunglass Hut",name:"Sunglass Hut",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Synoptik":{name:"Synoptik",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q10687541"},addTags:{brand:"Synoptik","brand:wikidata":"Q10687541","brand:wikipedia":"sv:Synoptik",name:"Synoptik",shop:"optician"},removeTags:{brand:"Synoptik","brand:wikidata":"Q10687541","brand:wikipedia":"sv:Synoptik",name:"Synoptik",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Synsam":{name:"Synsam",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q12004589"},addTags:{brand:"Synsam","brand:wikidata":"Q12004589","brand:wikipedia":"sv:Synsam",name:"Synsam",shop:"optician"},removeTags:{brand:"Synsam","brand:wikidata":"Q12004589","brand:wikipedia":"sv:Synsam",name:"Synsam",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Vision Express":{name:"Vision Express",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q7936150"},addTags:{brand:"Vision Express","brand:wikidata":"Q7936150","brand:wikipedia":"en:Vision Express",name:"Vision Express",shop:"optician"},removeTags:{brand:"Vision Express","brand:wikidata":"Q7936150","brand:wikipedia":"en:Vision Express",name:"Vision Express",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Visionworks":{name:"Visionworks",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q5422607"},addTags:{brand:"Visionworks","brand:wikidata":"Q5422607","brand:wikipedia":"en:Visionworks",name:"Visionworks",shop:"optician"},removeTags:{brand:"Visionworks","brand:wikidata":"Q5422607","brand:wikipedia":"en:Visionworks",name:"Visionworks",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/メガネスーパー":{name:"メガネスーパー",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q11343504"},addTags:{brand:"メガネスーパー","brand:wikidata":"Q11343504","brand:wikipedia":"ja:メガネスーパー",name:"メガネスーパー",shop:"optician"},removeTags:{brand:"メガネスーパー","brand:wikidata":"Q11343504","brand:wikipedia":"ja:メガネスーパー",name:"メガネスーパー",shop:"optician"},matchScore:2,suggestion:true},"shop/outdoor/Jack Wolfskin":{name:"Jack Wolfskin",icon:"temaki-compass",geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q536133"},addTags:{brand:"Jack Wolfskin","brand:wikidata":"Q536133","brand:wikipedia":"en:Jack Wolfskin",name:"Jack Wolfskin",shop:"outdoor"},removeTags:{brand:"Jack Wolfskin","brand:wikidata":"Q536133","brand:wikipedia":"en:Jack Wolfskin",name:"Jack Wolfskin",shop:"outdoor"},matchScore:2,suggestion:true},"shop/outdoor/Kathmandu":{name:"Kathmandu",icon:"temaki-compass",geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q1736294"},addTags:{brand:"Kathmandu","brand:wikidata":"Q1736294","brand:wikipedia":"en:Kathmandu (company)",name:"Kathmandu",shop:"outdoor"},removeTags:{brand:"Kathmandu","brand:wikidata":"Q1736294","brand:wikipedia":"en:Kathmandu (company)",name:"Kathmandu",shop:"outdoor"},matchScore:2,suggestion:true},"shop/outdoor/Mountain Warehouse":{name:"Mountain Warehouse",icon:"temaki-compass",geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q6925414"},addTags:{brand:"Mountain Warehouse","brand:wikidata":"Q6925414","brand:wikipedia":"en:Mountain Warehouse",name:"Mountain Warehouse",shop:"outdoor"},removeTags:{brand:"Mountain Warehouse","brand:wikidata":"Q6925414","brand:wikipedia":"en:Mountain Warehouse",name:"Mountain Warehouse",shop:"outdoor"},matchScore:2,suggestion:true},"shop/outdoor/REI":{name:"REI",icon:"temaki-compass",geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q3414933"},addTags:{brand:"REI","brand:wikidata":"Q3414933","brand:wikipedia":"en:Recreational Equipment, Inc.",name:"REI",shop:"outdoor"},removeTags:{brand:"REI","brand:wikidata":"Q3414933","brand:wikipedia":"en:Recreational Equipment, Inc.",name:"REI",shop:"outdoor"},matchScore:2,suggestion:true},"shop/outdoor/Trespass":{name:"Trespass",icon:"temaki-compass",geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q17035733"},addTags:{brand:"Trespass","brand:wikidata":"Q17035733","brand:wikipedia":"en:Trespass (clothing)",name:"Trespass",shop:"outdoor"},removeTags:{brand:"Trespass","brand:wikidata":"Q17035733","brand:wikipedia":"en:Trespass (clothing)",name:"Trespass",shop:"outdoor"},matchScore:2,suggestion:true},"shop/paint/Benjamin Moore":{name:"Benjamin Moore",icon:"fas-paint-roller",geometry:["point","area"],tags:{shop:"paint","brand:wikidata":"Q4889038"},addTags:{brand:"Benjamin Moore","brand:wikidata":"Q4889038","brand:wikipedia":"en:Benjamin Moore & Co.",name:"Benjamin Moore",shop:"paint"},removeTags:{brand:"Benjamin Moore","brand:wikidata":"Q4889038","brand:wikipedia":"en:Benjamin Moore & Co.",name:"Benjamin Moore",shop:"paint"},matchScore:2,suggestion:true},"shop/paint/Comex":{name:"Comex",icon:"fas-paint-roller",geometry:["point","area"],tags:{shop:"paint","brand:wikidata":"Q5151654"},addTags:{brand:"Comex","brand:wikidata":"Q5151654","brand:wikipedia":"en:Comex Group",name:"Comex",shop:"paint"},removeTags:{brand:"Comex","brand:wikidata":"Q5151654","brand:wikipedia":"en:Comex Group",name:"Comex",shop:"paint"},matchScore:2,suggestion:true},"shop/paint/Jotun":{name:"Jotun",icon:"fas-paint-roller",geometry:["point","area"],tags:{shop:"paint","brand:wikidata":"Q1778870"},addTags:{brand:"Jotun","brand:wikidata":"Q1778870","brand:wikipedia":"en:Jotun (company)",name:"Jotun",shop:"paint"},removeTags:{brand:"Jotun","brand:wikidata":"Q1778870","brand:wikipedia":"en:Jotun (company)",name:"Jotun",shop:"paint"},matchScore:2,suggestion:true},"shop/paint/Sherwin Williams":{name:"Sherwin Williams",icon:"fas-paint-roller",geometry:["point","area"],tags:{shop:"paint","brand:wikidata":"Q48881"},addTags:{brand:"Sherwin Williams","brand:wikidata":"Q48881","brand:wikipedia":"en:Sherwin-Williams",name:"Sherwin Williams",shop:"paint"},removeTags:{brand:"Sherwin Williams","brand:wikidata":"Q48881","brand:wikipedia":"en:Sherwin-Williams",name:"Sherwin Williams",shop:"paint"},matchScore:2,suggestion:true},"shop/party/Party City":{name:"Party City",icon:"maki-shop",geometry:["point","area"],tags:{shop:"party","brand:wikidata":"Q7140896"},addTags:{brand:"Party City","brand:wikidata":"Q7140896","brand:wikipedia":"en:Party City",name:"Party City",shop:"party"},removeTags:{brand:"Party City","brand:wikidata":"Q7140896","brand:wikipedia":"en:Party City",name:"Party City",shop:"party"},matchScore:2,suggestion:true},"shop/pawnbroker/Cash Converters":{name:"Cash Converters",icon:"maki-shop",geometry:["point","area"],tags:{shop:"pawnbroker","brand:wikidata":"Q5048645"},addTags:{brand:"Cash Converters","brand:wikidata":"Q5048645","brand:wikipedia":"en:Cash Converters",name:"Cash Converters",shop:"pawnbroker"},removeTags:{brand:"Cash Converters","brand:wikidata":"Q5048645","brand:wikipedia":"en:Cash Converters",name:"Cash Converters",shop:"pawnbroker"},matchScore:2,suggestion:true},"shop/pawnbroker/Cebuana Lhuillier":{name:"Cebuana Lhuillier",icon:"maki-shop",geometry:["point","area"],tags:{shop:"pawnbroker","brand:wikidata":"Q17064661"},addTags:{brand:"Cebuana Lhuillier","brand:wikidata":"Q17064661","brand:wikipedia":"en:Cebuana Lhuillier",name:"Cebuana Lhuillier",shop:"pawnbroker"},removeTags:{brand:"Cebuana Lhuillier","brand:wikidata":"Q17064661","brand:wikipedia":"en:Cebuana Lhuillier",name:"Cebuana Lhuillier",shop:"pawnbroker"},matchScore:2,suggestion:true},"shop/perfumery/Douglas":{name:"Douglas",icon:"maki-shop",geometry:["point","area"],tags:{shop:"perfumery","brand:wikidata":"Q2052213"},addTags:{brand:"Douglas","brand:wikidata":"Q2052213","brand:wikipedia":"de:Parfümerie Douglas",name:"Douglas",shop:"perfumery"},removeTags:{brand:"Douglas","brand:wikidata":"Q2052213","brand:wikipedia":"de:Parfümerie Douglas",name:"Douglas",shop:"perfumery"},matchScore:2,suggestion:true},"shop/perfumery/ICI PARIS XL":{name:"ICI PARIS XL",icon:"maki-shop",geometry:["point","area"],tags:{shop:"perfumery","brand:wikidata":"Q769749"},addTags:{brand:"ICI PARIS XL","brand:wikidata":"Q769749","brand:wikipedia":"en:ICI Paris XL",name:"ICI PARIS XL",shop:"perfumery"},removeTags:{brand:"ICI PARIS XL","brand:wikidata":"Q769749","brand:wikipedia":"en:ICI Paris XL",name:"ICI PARIS XL",shop:"perfumery"},matchScore:2,suggestion:true},"shop/perfumery/Marionnaud":{name:"Marionnaud",icon:"maki-shop",geometry:["point","area"],tags:{shop:"perfumery","brand:wikidata":"Q1129073"},addTags:{brand:"Marionnaud","brand:wikidata":"Q1129073","brand:wikipedia":"fr:Marionnaud Parfumeries",name:"Marionnaud",shop:"perfumery"},removeTags:{brand:"Marionnaud","brand:wikidata":"Q1129073","brand:wikipedia":"fr:Marionnaud Parfumeries",name:"Marionnaud",shop:"perfumery"},matchScore:2,suggestion:true},"shop/perfumery/O Boticário":{name:"O Boticário",icon:"maki-shop",geometry:["point","area"],tags:{shop:"perfumery","brand:wikidata":"Q7073219"},addTags:{brand:"O Boticário","brand:wikidata":"Q7073219","brand:wikipedia":"en:O Boticário",name:"O Boticário",shop:"perfumery"},removeTags:{brand:"O Boticário","brand:wikidata":"Q7073219","brand:wikipedia":"en:O Boticário",name:"O Boticário",shop:"perfumery"},matchScore:2,suggestion:true},"shop/pet/Das Futterhaus":{name:"Das Futterhaus",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q1167914"},addTags:{brand:"Das Futterhaus","brand:wikidata":"Q1167914","brand:wikipedia":"de:Das Futterhaus",name:"Das Futterhaus",shop:"pet"},removeTags:{brand:"Das Futterhaus","brand:wikidata":"Q1167914","brand:wikipedia":"de:Das Futterhaus",name:"Das Futterhaus",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Fressnapf":{name:"Fressnapf",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q875796"},addTags:{brand:"Fressnapf","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Fressnapf",shop:"pet"},removeTags:{brand:"Fressnapf","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Fressnapf",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Global Pet Foods":{name:"Global Pet Foods",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q57985699"},addTags:{brand:"Global Pet Foods","brand:wikidata":"Q57985699",name:"Global Pet Foods",shop:"pet"},removeTags:{brand:"Global Pet Foods","brand:wikidata":"Q57985699",name:"Global Pet Foods",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Maxi Zoo":{name:"Maxi Zoo",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q875796"},addTags:{brand:"Maxi Zoo","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Maxi Zoo",shop:"pet"},removeTags:{brand:"Maxi Zoo","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Maxi Zoo",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Mud Bay":{name:"Mud Bay",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q30324179"},addTags:{brand:"Mud Bay","brand:wikidata":"Q30324179","brand:wikipedia":"en:Mud Bay pet store",name:"Mud Bay",shop:"pet"},removeTags:{brand:"Mud Bay","brand:wikidata":"Q30324179","brand:wikipedia":"en:Mud Bay pet store",name:"Mud Bay",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Pet Supplies Plus":{name:"Pet Supplies Plus",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q7171563"},addTags:{brand:"Pet Supplies Plus","brand:wikidata":"Q7171563","brand:wikipedia":"en:Pet Supplies Plus",name:"Pet Supplies Plus",shop:"pet"},removeTags:{brand:"Pet Supplies Plus","brand:wikidata":"Q7171563","brand:wikipedia":"en:Pet Supplies Plus",name:"Pet Supplies Plus",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Pet Valu":{name:"Pet Valu",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q58009635"},addTags:{brand:"Pet Valu","brand:wikidata":"Q58009635",name:"Pet Valu",shop:"pet"},removeTags:{brand:"Pet Valu","brand:wikidata":"Q58009635",name:"Pet Valu",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/PetSmart":{name:"PetSmart",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q3307147"},addTags:{brand:"PetSmart","brand:wikidata":"Q3307147","brand:wikipedia":"en:PetSmart",name:"PetSmart",shop:"pet"},removeTags:{brand:"PetSmart","brand:wikidata":"Q3307147","brand:wikipedia":"en:PetSmart",name:"PetSmart",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Petco":{name:"Petco",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q7171798"},addTags:{brand:"Petco","brand:wikidata":"Q7171798","brand:wikipedia":"en:Petco",name:"Petco",shop:"pet"},removeTags:{brand:"Petco","brand:wikidata":"Q7171798","brand:wikipedia":"en:Petco",name:"Petco",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Pets at Home":{name:"Pets at Home",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q7179258"},addTags:{brand:"Pets at Home","brand:wikidata":"Q7179258","brand:wikipedia":"en:Pets at Home",name:"Pets at Home",shop:"pet"},removeTags:{brand:"Pets at Home","brand:wikidata":"Q7179258","brand:wikipedia":"en:Pets at Home",name:"Pets at Home",shop:"pet"},matchScore:2,suggestion:true},"shop/photo/Kodak Express":{name:"Kodak Express",icon:"maki-attraction",geometry:["point","area"],tags:{shop:"photo","brand:wikidata":"Q6425126"},addTags:{brand:"Kodak Express","brand:wikidata":"Q6425126","brand:wikipedia":"en:Kodak Express",name:"Kodak Express",shop:"photo"},removeTags:{brand:"Kodak Express","brand:wikidata":"Q6425126","brand:wikipedia":"en:Kodak Express",name:"Kodak Express",shop:"photo"},matchScore:2,suggestion:true},"shop/second_hand/Value Village":{name:"Value Village",icon:"maki-shop",geometry:["point","area"],tags:{shop:"second_hand","brand:wikidata":"Q7428188"},addTags:{brand:"Value Village","brand:wikidata":"Q7428188","brand:wikipedia":"en:Savers",name:"Value Village",shop:"second_hand"},removeTags:{brand:"Value Village","brand:wikidata":"Q7428188","brand:wikipedia":"en:Savers",name:"Value Village",shop:"second_hand"},matchScore:2,suggestion:true},"shop/shoes/Aldo":{name:"Aldo",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2832297"},addTags:{brand:"Aldo","brand:wikidata":"Q2832297","brand:wikipedia":"en:Aldo Group",name:"Aldo",shop:"shoes"},removeTags:{brand:"Aldo","brand:wikidata":"Q2832297","brand:wikipedia":"en:Aldo Group",name:"Aldo",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/André":{name:"André",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2847114"},addTags:{brand:"André","brand:wikidata":"Q2847114","brand:wikipedia":"fr:André (chaussure)",name:"André",shop:"shoes"},removeTags:{brand:"André","brand:wikidata":"Q2847114","brand:wikipedia":"fr:André (chaussure)",name:"André",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Bata":{name:"Bata",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q688082"},addTags:{brand:"Bata","brand:wikidata":"Q688082","brand:wikipedia":"en:Bata (company)",name:"Bata",shop:"shoes"},removeTags:{brand:"Bata","brand:wikidata":"Q688082","brand:wikipedia":"en:Bata (company)",name:"Bata",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Besson Chaussures":{name:"Besson Chaussures",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2899930"},addTags:{brand:"Besson Chaussures","brand:wikidata":"Q2899930","brand:wikipedia":"fr:Besson Chaussures",name:"Besson Chaussures",shop:"shoes"},removeTags:{brand:"Besson Chaussures","brand:wikidata":"Q2899930","brand:wikipedia":"fr:Besson Chaussures",name:"Besson Chaussures",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Birkenstock":{name:"Birkenstock",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q648458"},addTags:{brand:"Birkenstock","brand:wikidata":"Q648458","brand:wikipedia":"en:Birkenstock",name:"Birkenstock",shop:"shoes"},removeTags:{brand:"Birkenstock","brand:wikidata":"Q648458","brand:wikipedia":"en:Birkenstock",name:"Birkenstock",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Brantano":{name:"Brantano",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q4957616"},addTags:{brand:"Brantano","brand:wikidata":"Q4957616","brand:wikipedia":"en:Brantano Footwear",name:"Brantano",shop:"shoes"},removeTags:{brand:"Brantano","brand:wikidata":"Q4957616","brand:wikipedia":"en:Brantano Footwear",name:"Brantano",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/CCC":{name:"CCC",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q11788344"},addTags:{brand:"CCC","brand:wikidata":"Q11788344","brand:wikipedia":"de:CCC (Unternehmen)",name:"CCC",shop:"shoes"},removeTags:{brand:"CCC","brand:wikidata":"Q11788344","brand:wikipedia":"de:CCC (Unternehmen)",name:"CCC",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Camper":{name:"Camper",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1030922"},addTags:{brand:"Camper","brand:wikidata":"Q1030922","brand:wikipedia":"en:Camper (company)",name:"Camper",shop:"shoes"},removeTags:{brand:"Camper","brand:wikidata":"Q1030922","brand:wikipedia":"en:Camper (company)",name:"Camper",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Clarks":{name:"Clarks",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1095857"},addTags:{brand:"Clarks","brand:wikidata":"Q1095857","brand:wikipedia":"en:C. & J. Clark",name:"Clarks",shop:"shoes"},removeTags:{brand:"Clarks","brand:wikidata":"Q1095857","brand:wikipedia":"en:C. & J. Clark",name:"Clarks",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Converse":{name:"Converse",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q319515"},addTags:{brand:"Converse","brand:wikidata":"Q319515","brand:wikipedia":"en:Converse (shoe company)",name:"Converse",shop:"shoes"},removeTags:{brand:"Converse","brand:wikidata":"Q319515","brand:wikipedia":"en:Converse (shoe company)",name:"Converse",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Crocs":{name:"Crocs",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q926699"},addTags:{brand:"Crocs","brand:wikidata":"Q926699","brand:wikipedia":"en:Crocs",name:"Crocs",shop:"shoes"},removeTags:{brand:"Crocs","brand:wikidata":"Q926699","brand:wikipedia":"en:Crocs",name:"Crocs",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/DSW":{name:"DSW",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q5206207"},addTags:{brand:"DSW","brand:wikidata":"Q5206207","brand:wikipedia":"en:DSW, Inc.",name:"DSW",shop:"shoes"},removeTags:{brand:"DSW","brand:wikidata":"Q5206207","brand:wikipedia":"en:DSW, Inc.",name:"DSW",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Deichmann":{name:"Deichmann",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q664543"},addTags:{brand:"Deichmann","brand:wikidata":"Q664543","brand:wikipedia":"en:Deichmann SE",name:"Deichmann",shop:"shoes"},removeTags:{brand:"Deichmann","brand:wikidata":"Q664543","brand:wikipedia":"en:Deichmann SE",name:"Deichmann",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Din sko":{name:"Din sko",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q10472869"},addTags:{brand:"Din sko","brand:wikidata":"Q10472869","brand:wikipedia":"sv:Din sko",name:"Din sko",shop:"shoes"},removeTags:{brand:"Din sko","brand:wikidata":"Q10472869","brand:wikipedia":"sv:Din sko",name:"Din sko",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Dosenbach":{name:"Dosenbach",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2677329"},addTags:{brand:"Dosenbach","brand:wikidata":"Q2677329","brand:wikipedia":"de:Dosenbach-Ochsner",name:"Dosenbach",shop:"shoes"},removeTags:{brand:"Dosenbach","brand:wikidata":"Q2677329","brand:wikipedia":"de:Dosenbach-Ochsner",name:"Dosenbach",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Ecco":{name:"Ecco",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1280255"},addTags:{brand:"Ecco","brand:wikidata":"Q1280255","brand:wikipedia":"en:ECCO",name:"Ecco",shop:"shoes"},removeTags:{brand:"Ecco","brand:wikidata":"Q1280255","brand:wikipedia":"en:ECCO",name:"Ecco",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Famous Footwear":{name:"Famous Footwear",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q5433457"},addTags:{brand:"Famous Footwear","brand:wikidata":"Q5433457","brand:wikipedia":"en:Famous Footwear",name:"Famous Footwear",shop:"shoes"},removeTags:{brand:"Famous Footwear","brand:wikidata":"Q5433457","brand:wikipedia":"en:Famous Footwear",name:"Famous Footwear",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Foot Locker":{name:"Foot Locker",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q63335"},addTags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Foot Locker",shop:"shoes"},removeTags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Foot Locker",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Geox":{name:"Geox",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q588001"},addTags:{brand:"Geox","brand:wikidata":"Q588001","brand:wikipedia":"en:Geox",name:"Geox",shop:"shoes"},removeTags:{brand:"Geox","brand:wikidata":"Q588001","brand:wikipedia":"en:Geox",name:"Geox",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Humanic":{name:"Humanic",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1636668"},addTags:{brand:"Humanic","brand:wikidata":"Q1636668","brand:wikipedia":"en:Humanic",name:"Humanic",shop:"shoes"},removeTags:{brand:"Humanic","brand:wikidata":"Q1636668","brand:wikipedia":"en:Humanic",name:"Humanic",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Mephisto":{name:"Mephisto",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q822975"},addTags:{brand:"Mephisto","brand:wikidata":"Q822975","brand:wikipedia":"fr:Mephisto (chaussure)",name:"Mephisto",shop:"shoes"},removeTags:{brand:"Mephisto","brand:wikidata":"Q822975","brand:wikipedia":"fr:Mephisto (chaussure)",name:"Mephisto",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/New Balance":{name:"New Balance",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q742988"},addTags:{brand:"New Balance","brand:wikidata":"Q742988","brand:wikipedia":"en:New Balance",name:"New Balance",shop:"shoes"},removeTags:{brand:"New Balance","brand:wikidata":"Q742988","brand:wikipedia":"en:New Balance",name:"New Balance",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Payless ShoeSource":{name:"Payless ShoeSource",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q7156755"},addTags:{brand:"Payless ShoeSource","brand:wikidata":"Q7156755","brand:wikipedia":"en:Payless ShoeSource",name:"Payless ShoeSource",shop:"shoes"},removeTags:{brand:"Payless ShoeSource","brand:wikidata":"Q7156755","brand:wikipedia":"en:Payless ShoeSource",name:"Payless ShoeSource",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Quick Schuh":{name:"Quick Schuh",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2123069"},addTags:{brand:"Quick Schuh","brand:wikidata":"Q2123069","brand:wikipedia":"de:Quick Schuh",name:"Quick Schuh",shop:"shoes"},removeTags:{brand:"Quick Schuh","brand:wikidata":"Q2123069","brand:wikipedia":"de:Quick Schuh",name:"Quick Schuh",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Rack Room Shoes":{name:"Rack Room Shoes",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q17109937"},addTags:{brand:"Rack Room Shoes","brand:wikidata":"Q17109937","brand:wikipedia":"en:Rack Room Shoes",name:"Rack Room Shoes",shop:"shoes"},removeTags:{brand:"Rack Room Shoes","brand:wikidata":"Q17109937","brand:wikipedia":"en:Rack Room Shoes",name:"Rack Room Shoes",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Reno":{name:"Reno",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2144204"},addTags:{brand:"Reno","brand:wikidata":"Q2144204","brand:wikipedia":"de:Reno (Schuhhandel)",name:"Reno",shop:"shoes"},removeTags:{brand:"Reno","brand:wikidata":"Q2144204","brand:wikipedia":"de:Reno (Schuhhandel)",name:"Reno",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Rieker":{name:"Rieker",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2152193"},addTags:{brand:"Rieker","brand:wikidata":"Q2152193","brand:wikipedia":"en:Rieker Shoes",name:"Rieker",shop:"shoes"},removeTags:{brand:"Rieker","brand:wikidata":"Q2152193","brand:wikipedia":"en:Rieker Shoes",name:"Rieker",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Salamander":{name:"Salamander",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q878354"},addTags:{brand:"Salamander","brand:wikidata":"Q878354","brand:wikipedia":"de:Salamander (Schuhe)",name:"Salamander",shop:"shoes"},removeTags:{brand:"Salamander","brand:wikidata":"Q878354","brand:wikipedia":"de:Salamander (Schuhe)",name:"Salamander",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/San Marina":{name:"San Marina",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q3471558"},addTags:{brand:"San Marina","brand:wikidata":"Q3471558","brand:wikipedia":"fr:San Marina",name:"San Marina",shop:"shoes"},removeTags:{brand:"San Marina","brand:wikidata":"Q3471558","brand:wikipedia":"fr:San Marina",name:"San Marina",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Scapino":{name:"Scapino",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2298792"},addTags:{brand:"Scapino","brand:wikidata":"Q2298792","brand:wikipedia":"nl:Scapino (winkelketen)",name:"Scapino",shop:"shoes"},removeTags:{brand:"Scapino","brand:wikidata":"Q2298792","brand:wikipedia":"nl:Scapino (winkelketen)",name:"Scapino",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Schuh":{name:"Schuh",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q7432952"},addTags:{brand:"Schuh","brand:wikidata":"Q7432952","brand:wikipedia":"en:Schuh",name:"Schuh",shop:"shoes"},removeTags:{brand:"Schuh","brand:wikidata":"Q7432952","brand:wikipedia":"en:Schuh",name:"Schuh",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Shoe Carnival":{name:"Shoe Carnival",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q7500007"},addTags:{brand:"Shoe Carnival","brand:wikidata":"Q7500007","brand:wikipedia":"en:Shoe Carnival",name:"Shoe Carnival",shop:"shoes"},removeTags:{brand:"Shoe Carnival","brand:wikidata":"Q7500007","brand:wikipedia":"en:Shoe Carnival",name:"Shoe Carnival",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Shoe Zone":{name:"Shoe Zone",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q7500016"},addTags:{brand:"Shoe Zone","brand:wikidata":"Q7500016","brand:wikipedia":"en:Shoe Zone",name:"Shoe Zone",shop:"shoes"},removeTags:{brand:"Shoe Zone","brand:wikidata":"Q7500016","brand:wikipedia":"en:Shoe Zone",name:"Shoe Zone",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Siemes Schuhcenter":{name:"Siemes Schuhcenter",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2800720"},addTags:{brand:"Siemes Schuhcenter","brand:wikidata":"Q2800720","brand:wikipedia":"de:Siemes (Unternehmen)",name:"Siemes Schuhcenter",shop:"shoes"},removeTags:{brand:"Siemes Schuhcenter","brand:wikidata":"Q2800720","brand:wikipedia":"de:Siemes (Unternehmen)",name:"Siemes Schuhcenter",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Skechers":{name:"Skechers",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2945643"},addTags:{brand:"Skechers","brand:wikidata":"Q2945643","brand:wikipedia":"en:Skechers",name:"Skechers",shop:"shoes"},removeTags:{brand:"Skechers","brand:wikidata":"Q2945643","brand:wikipedia":"en:Skechers",name:"Skechers",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Vans":{name:"Vans",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1135366"},addTags:{brand:"Vans","brand:wikidata":"Q1135366","brand:wikipedia":"en:Vans",name:"Vans",shop:"shoes"},removeTags:{brand:"Vans","brand:wikidata":"Q1135366","brand:wikipedia":"en:Vans",name:"Vans",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Éram":{name:"Éram",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q16684192"},addTags:{brand:"Éram","brand:wikidata":"Q16684192","brand:wikipedia":"fr:Éram",name:"Éram",shop:"shoes"},removeTags:{brand:"Éram","brand:wikidata":"Q16684192","brand:wikipedia":"fr:Éram",name:"Éram",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/ЦентрОбувь":{name:"ЦентрОбувь",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q4504072"},addTags:{brand:"ЦентрОбувь","brand:wikidata":"Q4504072","brand:wikipedia":"ru:ЦентрОбувь",name:"ЦентрОбувь",shop:"shoes"},removeTags:{brand:"ЦентрОбувь","brand:wikidata":"Q4504072","brand:wikipedia":"ru:ЦентрОбувь",name:"ЦентрОбувь",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/東京靴流通センター":{name:"東京靴流通センター",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q11318515"},addTags:{brand:"東京靴流通センター","brand:en":"Tokyo Shoes Retailing Center","brand:wikidata":"Q11318515","brand:wikipedia":"ja:チヨダ",name:"東京靴流通センター","name:en":"Tokyo Shoes Retailing Center",shop:"shoes"},removeTags:{brand:"東京靴流通センター","brand:en":"Tokyo Shoes Retailing Center","brand:wikidata":"Q11318515","brand:wikipedia":"ja:チヨダ",name:"東京靴流通センター","name:en":"Tokyo Shoes Retailing Center",shop:"shoes"},matchScore:2,suggestion:true},"shop/sports/Adidas":{name:"Adidas",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q3895"},addTags:{brand:"Adidas","brand:wikidata":"Q3895","brand:wikipedia":"en:Adidas",name:"Adidas",shop:"sports"},removeTags:{brand:"Adidas","brand:wikidata":"Q3895","brand:wikipedia":"en:Adidas",name:"Adidas",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Aktiesport":{name:"Aktiesport",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q57546889"},addTags:{brand:"Aktiesport","brand:wikidata":"Q57546889",name:"Aktiesport",shop:"sports"},removeTags:{brand:"Aktiesport","brand:wikidata":"Q57546889",name:"Aktiesport",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Bass Pro Shops":{name:"Bass Pro Shops",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q4867953"},addTags:{brand:"Bass Pro Shops","brand:wikidata":"Q4867953","brand:wikipedia":"en:Bass Pro Shops",name:"Bass Pro Shops",shop:"sports"},removeTags:{brand:"Bass Pro Shops","brand:wikidata":"Q4867953","brand:wikipedia":"en:Bass Pro Shops",name:"Bass Pro Shops",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Big 5 Sporting Goods":{name:"Big 5 Sporting Goods",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q4904902"},addTags:{brand:"Big 5 Sporting Goods","brand:wikidata":"Q4904902","brand:wikipedia":"en:Big 5 Sporting Goods",name:"Big 5 Sporting Goods",shop:"sports"},removeTags:{brand:"Big 5 Sporting Goods","brand:wikidata":"Q4904902","brand:wikipedia":"en:Big 5 Sporting Goods",name:"Big 5 Sporting Goods",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Cabela's":{name:"Cabela's",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q2793714"},addTags:{brand:"Cabela's","brand:wikidata":"Q2793714","brand:wikipedia":"en:Cabela's",name:"Cabela's",shop:"sports"},removeTags:{brand:"Cabela's","brand:wikidata":"Q2793714","brand:wikipedia":"en:Cabela's",name:"Cabela's",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Decathlon":{name:"Decathlon",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q509349"},addTags:{brand:"Decathlon","brand:wikidata":"Q509349","brand:wikipedia":"en:Decathlon Group",name:"Decathlon",shop:"sports"},removeTags:{brand:"Decathlon","brand:wikidata":"Q509349","brand:wikipedia":"en:Decathlon Group",name:"Decathlon",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Dick's Sporting Goods":{name:"Dick's Sporting Goods",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q5272601"},addTags:{brand:"Dick's Sporting Goods","brand:wikidata":"Q5272601","brand:wikipedia":"en:Dick's Sporting Goods",name:"Dick's Sporting Goods",shop:"sports"},removeTags:{brand:"Dick's Sporting Goods","brand:wikidata":"Q5272601","brand:wikipedia":"en:Dick's Sporting Goods",name:"Dick's Sporting Goods",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Hervis":{name:"Hervis",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q1614816"},addTags:{brand:"Hervis","brand:wikidata":"Q1614816","brand:wikipedia":"de:Hervis",name:"Hervis",shop:"sports"},removeTags:{brand:"Hervis","brand:wikidata":"Q1614816","brand:wikipedia":"de:Hervis",name:"Hervis",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Hibbett Sports":{name:"Hibbett Sports",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q5750671"},addTags:{brand:"Hibbett Sports","brand:wikidata":"Q5750671","brand:wikipedia":"en:Hibbett Sports",name:"Hibbett Sports",shop:"sports"},removeTags:{brand:"Hibbett Sports","brand:wikidata":"Q5750671","brand:wikipedia":"en:Hibbett Sports",name:"Hibbett Sports",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Intersport":{name:"Intersport",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q666888"},addTags:{brand:"Intersport","brand:wikidata":"Q666888","brand:wikipedia":"en:Intersport",name:"Intersport",shop:"sports"},removeTags:{brand:"Intersport","brand:wikidata":"Q666888","brand:wikipedia":"en:Intersport",name:"Intersport",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/JD Sports":{name:"JD Sports",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q6108019"},addTags:{brand:"JD Sports","brand:wikidata":"Q6108019","brand:wikipedia":"en:JD Sports",name:"JD Sports",shop:"sports"},removeTags:{brand:"JD Sports","brand:wikidata":"Q6108019","brand:wikipedia":"en:JD Sports",name:"JD Sports",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Play It Again Sports":{name:"Play It Again Sports",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q7203029"},addTags:{brand:"Play It Again Sports","brand:wikidata":"Q7203029","brand:wikipedia":"en:Play It Again Sports",name:"Play It Again Sports",shop:"sports"},removeTags:{brand:"Play It Again Sports","brand:wikidata":"Q7203029","brand:wikipedia":"en:Play It Again Sports",name:"Play It Again Sports",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Sport 2000":{name:"Sport 2000",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q262394"},addTags:{brand:"Sport 2000","brand:wikidata":"Q262394","brand:wikipedia":"de:Sport 2000",name:"Sport 2000",shop:"sports"},removeTags:{brand:"Sport 2000","brand:wikidata":"Q262394","brand:wikipedia":"de:Sport 2000",name:"Sport 2000",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Sportisimo":{name:"Sportisimo",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q54974273"},addTags:{brand:"Sportisimo","brand:wikidata":"Q54974273",name:"Sportisimo",shop:"sports"},removeTags:{brand:"Sportisimo","brand:wikidata":"Q54974273",name:"Sportisimo",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Sports Authority":{name:"Sports Authority",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q7579688"},addTags:{brand:"Sports Authority","brand:wikidata":"Q7579688","brand:wikipedia":"en:Sports Authority",name:"Sports Authority",shop:"sports"},removeTags:{brand:"Sports Authority","brand:wikidata":"Q7579688","brand:wikipedia":"en:Sports Authority",name:"Sports Authority",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Sports Direct":{name:"Sports Direct",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q2913554"},addTags:{brand:"Sports Direct","brand:wikidata":"Q2913554","brand:wikipedia":"en:Sports Direct",name:"Sports Direct",shop:"sports"},removeTags:{brand:"Sports Direct","brand:wikidata":"Q2913554","brand:wikipedia":"en:Sports Direct",name:"Sports Direct",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Спортмастер":{name:"Спортмастер",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q4438176"},addTags:{brand:"Спортмастер","brand:wikidata":"Q4438176","brand:wikipedia":"ru:Спортмастер",name:"Спортмастер",shop:"sports"},removeTags:{brand:"Спортмастер","brand:wikidata":"Q4438176","brand:wikipedia":"ru:Спортмастер",name:"Спортмастер",shop:"sports"},matchScore:2,suggestion:true},"shop/stationery/Bureau Vallée":{name:"Bureau Vallée",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q18385014"},addTags:{brand:"Bureau Vallée","brand:wikidata":"Q18385014","brand:wikipedia":"fr:Bureau Vallée",name:"Bureau Vallée",shop:"stationery"},removeTags:{brand:"Bureau Vallée","brand:wikidata":"Q18385014","brand:wikipedia":"fr:Bureau Vallée",name:"Bureau Vallée",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/McPaper":{name:"McPaper",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q1915329"},addTags:{brand:"McPaper","brand:wikidata":"Q1915329","brand:wikipedia":"de:McPaper",name:"McPaper",shop:"stationery"},removeTags:{brand:"McPaper","brand:wikidata":"Q1915329","brand:wikipedia":"de:McPaper",name:"McPaper",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Office Depot":{name:"Office Depot",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q1337797"},addTags:{brand:"Office Depot","brand:wikidata":"Q1337797","brand:wikipedia":"en:Office Depot",name:"Office Depot",shop:"stationery"},removeTags:{brand:"Office Depot","brand:wikidata":"Q1337797","brand:wikipedia":"en:Office Depot",name:"Office Depot",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/OfficeMax":{name:"OfficeMax",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q7079111"},addTags:{brand:"OfficeMax","brand:wikidata":"Q7079111","brand:wikipedia":"en:OfficeMax",name:"OfficeMax",shop:"stationery"},removeTags:{brand:"OfficeMax","brand:wikidata":"Q7079111","brand:wikipedia":"en:OfficeMax",name:"OfficeMax",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Officeworks":{name:"Officeworks",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q7079486"},addTags:{brand:"Officeworks","brand:wikidata":"Q7079486","brand:wikipedia":"en:Officeworks",name:"Officeworks",shop:"stationery"},removeTags:{brand:"Officeworks","brand:wikidata":"Q7079486","brand:wikipedia":"en:Officeworks",name:"Officeworks",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Pagro":{name:"Pagro",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q57550022"},addTags:{brand:"Pagro","brand:wikidata":"Q57550022",name:"Pagro",shop:"stationery"},removeTags:{brand:"Pagro","brand:wikidata":"Q57550022",name:"Pagro",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Paper Source":{name:"Paper Source",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q25000269"},addTags:{brand:"Paper Source","brand:wikidata":"Q25000269","brand:wikipedia":"en:Paper Source",name:"Paper Source",shop:"stationery"},removeTags:{brand:"Paper Source","brand:wikidata":"Q25000269","brand:wikipedia":"en:Paper Source",name:"Paper Source",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Paperchase":{name:"Paperchase",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q7132739"},addTags:{brand:"Paperchase","brand:wikidata":"Q7132739","brand:wikipedia":"en:Paperchase",name:"Paperchase",shop:"stationery"},removeTags:{brand:"Paperchase","brand:wikidata":"Q7132739","brand:wikipedia":"en:Paperchase",name:"Paperchase",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Ryman":{name:"Ryman",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q7385188"},addTags:{brand:"Ryman","brand:wikidata":"Q7385188","brand:wikipedia":"en:Ryman",name:"Ryman",shop:"stationery"},removeTags:{brand:"Ryman","brand:wikidata":"Q7385188","brand:wikipedia":"en:Ryman",name:"Ryman",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Staples":{name:"Staples",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q785943"},addTags:{brand:"Staples","brand:wikidata":"Q785943","brand:wikipedia":"en:Staples Inc.",name:"Staples",shop:"stationery"},removeTags:{brand:"Staples","brand:wikidata":"Q785943","brand:wikipedia":"en:Staples Inc.",name:"Staples",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Комус":{name:"Комус",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q4230314"},addTags:{brand:"Комус","brand:en":"Komus","brand:wikidata":"Q4230314","brand:wikipedia":"en:Komus (company)",name:"Комус","name:en":"Komus",shop:"stationery"},removeTags:{brand:"Комус","brand:en":"Komus","brand:wikidata":"Q4230314","brand:wikipedia":"en:Komus (company)",name:"Комус","name:en":"Komus",shop:"stationery"},matchScore:2,suggestion:true},"shop/storage_rental/Extra Space Storage":{name:"Extra Space Storage",icon:"fas-warehouse",geometry:["point","area"],tags:{shop:"storage_rental","brand:wikidata":"Q5422162"},addTags:{brand:"Extra Space Storage","brand:wikidata":"Q5422162","brand:wikipedia":"en:Extra Space Storage",name:"Extra Space Storage",shop:"storage_rental"},removeTags:{brand:"Extra Space Storage","brand:wikidata":"Q5422162","brand:wikipedia":"en:Extra Space Storage",name:"Extra Space Storage",shop:"storage_rental"},matchScore:2,suggestion:true},"shop/storage_rental/Public Storage":{name:"Public Storage",icon:"fas-warehouse",geometry:["point","area"],tags:{shop:"storage_rental","brand:wikidata":"Q1156045"},addTags:{brand:"Public Storage","brand:wikidata":"Q1156045","brand:wikipedia":"en:Public Storage",name:"Public Storage",shop:"storage_rental"},removeTags:{brand:"Public Storage","brand:wikidata":"Q1156045","brand:wikipedia":"en:Public Storage",name:"Public Storage",shop:"storage_rental"},matchScore:2,suggestion:true},"shop/supermarket/A&O":{name:"A&O",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3600279"},addTags:{brand:"A&O","brand:wikidata":"Q3600279","brand:wikipedia":"it:A&O",name:"A&O",shop:"supermarket"},removeTags:{brand:"A&O","brand:wikidata":"Q3600279","brand:wikipedia":"it:A&O",name:"A&O",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/A101":{name:"A101",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6034496"},addTags:{brand:"A101","brand:wikidata":"Q6034496","brand:wikipedia":"tr:A101",name:"A101",shop:"supermarket"},removeTags:{brand:"A101","brand:wikidata":"Q6034496","brand:wikipedia":"tr:A101",name:"A101",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ADEG":{name:"ADEG",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q290211"},addTags:{brand:"ADEG","brand:wikidata":"Q290211","brand:wikipedia":"de:ADEG Österreich",name:"ADEG",shop:"supermarket"},removeTags:{brand:"ADEG","brand:wikidata":"Q290211","brand:wikipedia":"de:ADEG Österreich",name:"ADEG",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ahorramás":{name:"Ahorramás",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58221883"},addTags:{brand:"Ahorramás","brand:wikidata":"Q58221883",name:"Ahorramás",shop:"supermarket"},removeTags:{brand:"Ahorramás","brand:wikidata":"Q58221883",name:"Ahorramás",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Albert":{name:"Albert",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q9144241"},addTags:{brand:"Albert","brand:wikidata":"Q9144241","brand:wikipedia":"cs:Albert (obchodní řetězec)",name:"Albert",shop:"supermarket"},removeTags:{brand:"Albert","brand:wikidata":"Q9144241","brand:wikipedia":"cs:Albert (obchodní řetězec)",name:"Albert",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Albert Heijn":{name:"Albert Heijn",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1653985"},addTags:{brand:"Albert Heijn","brand:wikidata":"Q1653985","brand:wikipedia":"nl:Albert Heijn (supermarkt)",name:"Albert Heijn",shop:"supermarket"},removeTags:{brand:"Albert Heijn","brand:wikidata":"Q1653985","brand:wikipedia":"nl:Albert Heijn (supermarkt)",name:"Albert Heijn",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Albertsons":{name:"Albertsons",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4712282"},addTags:{brand:"Albertsons","brand:wikidata":"Q4712282","brand:wikipedia":"en:Albertsons",name:"Albertsons",shop:"supermarket"},removeTags:{brand:"Albertsons","brand:wikidata":"Q4712282","brand:wikipedia":"en:Albertsons",name:"Albertsons",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Aldi":{name:"Aldi",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q125054"},addTags:{brand:"Aldi","brand:wikidata":"Q125054","brand:wikipedia":"en:Aldi",name:"Aldi",shop:"supermarket"},removeTags:{brand:"Aldi","brand:wikidata":"Q125054","brand:wikipedia":"en:Aldi",name:"Aldi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Aldi Nord":{name:"Aldi Nord",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q41171373"},addTags:{brand:"Aldi Nord","brand:wikidata":"Q41171373","brand:wikipedia":"en:Aldi",name:"Aldi Nord",shop:"supermarket"},removeTags:{brand:"Aldi Nord","brand:wikidata":"Q41171373","brand:wikipedia":"en:Aldi",name:"Aldi Nord",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Aldi Süd":{name:"Aldi Süd",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q41171672"},addTags:{brand:"Aldi Süd","brand:wikidata":"Q41171672","brand:wikipedia":"en:Aldi",name:"Aldi Süd",shop:"supermarket"},removeTags:{brand:"Aldi Süd","brand:wikidata":"Q41171672","brand:wikipedia":"en:Aldi",name:"Aldi Süd",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Alimerka":{name:"Alimerka",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16482738"},addTags:{brand:"Alimerka","brand:wikidata":"Q16482738","brand:wikipedia":"es:Alimerka",name:"Alimerka",shop:"supermarket"},removeTags:{brand:"Alimerka","brand:wikidata":"Q16482738","brand:wikipedia":"es:Alimerka",name:"Alimerka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Alnatura":{name:"Alnatura",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q876811"},addTags:{brand:"Alnatura","brand:wikidata":"Q876811","brand:wikipedia":"en:Alnatura",name:"Alnatura",shop:"supermarket"},removeTags:{brand:"Alnatura","brand:wikidata":"Q876811","brand:wikipedia":"en:Alnatura",name:"Alnatura",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Atacadão":{name:"Atacadão",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2868739"},addTags:{brand:"Atacadão","brand:wikidata":"Q2868739","brand:wikipedia":"en:Atacadão",name:"Atacadão",shop:"supermarket"},removeTags:{brand:"Atacadão","brand:wikidata":"Q2868739","brand:wikipedia":"en:Atacadão",name:"Atacadão",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Auchan":{name:"Auchan",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q758603"},addTags:{brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan",shop:"supermarket"},removeTags:{brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Bi-Lo":{name:"Bi-Lo",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4835622"},addTags:{brand:"Bi-Lo","brand:wikidata":"Q4835622","brand:wikipedia":"en:BI-LO (Australia)",name:"Bi-Lo",shop:"supermarket"},removeTags:{brand:"Bi-Lo","brand:wikidata":"Q4835622","brand:wikipedia":"en:BI-LO (Australia)",name:"Bi-Lo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Biedronka":{name:"Biedronka",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q857182"},addTags:{brand:"Biedronka","brand:wikidata":"Q857182","brand:wikipedia":"en:Biedronka",name:"Biedronka",shop:"supermarket"},removeTags:{brand:"Biedronka","brand:wikidata":"Q857182","brand:wikipedia":"en:Biedronka",name:"Biedronka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Big C":{name:"Big C",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q858665"},addTags:{brand:"Big C","brand:wikidata":"Q858665","brand:wikipedia":"en:Big C",name:"Big C",shop:"supermarket"},removeTags:{brand:"Big C","brand:wikidata":"Q858665","brand:wikipedia":"en:Big C",name:"Big C",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Billa":{name:"Billa",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q537781"},addTags:{brand:"Billa","brand:wikidata":"Q537781","brand:wikipedia":"en:Billa (supermarket)",name:"Billa",shop:"supermarket"},removeTags:{brand:"Billa","brand:wikidata":"Q537781","brand:wikipedia":"en:Billa (supermarket)",name:"Billa",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Bingo":{name:"Bingo",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16842066"},addTags:{brand:"Bingo","brand:wikidata":"Q16842066","brand:wikipedia":"bs:Bingo (kompanija)",name:"Bingo",shop:"supermarket"},removeTags:{brand:"Bingo","brand:wikidata":"Q16842066","brand:wikipedia":"bs:Bingo (kompanija)",name:"Bingo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Biocoop":{name:"Biocoop",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2904039"},addTags:{brand:"Biocoop","brand:wikidata":"Q2904039","brand:wikipedia":"fr:Biocoop",name:"Biocoop",shop:"supermarket"},removeTags:{brand:"Biocoop","brand:wikidata":"Q2904039","brand:wikipedia":"fr:Biocoop",name:"Biocoop",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Brookshire Brothers":{name:"Brookshire Brothers",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4975084"},addTags:{brand:"Brookshire Brothers","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",name:"Brookshire Brothers",shop:"supermarket"},removeTags:{brand:"Brookshire Brothers","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",name:"Brookshire Brothers",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Brookshire's":{name:"Brookshire's",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4975085"},addTags:{brand:"Brookshire's","brand:wikidata":"Q4975085","brand:wikipedia":"en:Brookshire Grocery Company",name:"Brookshire's",shop:"supermarket"},removeTags:{brand:"Brookshire's","brand:wikidata":"Q4975085","brand:wikipedia":"en:Brookshire Grocery Company",name:"Brookshire's",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Budgens":{name:"Budgens",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4985016"},addTags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"supermarket"},removeTags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Bulk Barn":{name:"Bulk Barn",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4996466"},addTags:{brand:"Bulk Barn","brand:wikidata":"Q4996466",name:"Bulk Barn",shop:"supermarket"},removeTags:{brand:"Bulk Barn","brand:wikidata":"Q4996466",name:"Bulk Barn",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Bunnpris":{name:"Bunnpris",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1774634"},addTags:{brand:"Bunnpris","brand:wikidata":"Q1774634","brand:wikipedia":"en:Bunnpris",name:"Bunnpris",shop:"supermarket"},removeTags:{brand:"Bunnpris","brand:wikidata":"Q1774634","brand:wikipedia":"en:Bunnpris",name:"Bunnpris",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/COOP Jednota":{name:"COOP Jednota",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q41629254"},addTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"supermarket"},removeTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Caprabo":{name:"Caprabo",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1980781"},addTags:{brand:"Caprabo","brand:wikidata":"Q1980781","brand:wikipedia":"en:Caprabo",name:"Caprabo",shop:"supermarket"},removeTags:{brand:"Caprabo","brand:wikidata":"Q1980781","brand:wikipedia":"en:Caprabo",name:"Caprabo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Cargills Food City":{name:"Cargills Food City",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58353955"},addTags:{brand:"Cargills Food City","brand:wikidata":"Q58353955",name:"Cargills Food City","operator:wikidata":"Q5039260","operator:wikipedia":"en:Cargills (Ceylon)",shop:"supermarket"},removeTags:{brand:"Cargills Food City","brand:wikidata":"Q58353955",name:"Cargills Food City","operator:wikidata":"Q5039260","operator:wikipedia":"en:Cargills (Ceylon)",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour":{name:"Carrefour",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q217599"},addTags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour City":{name:"Carrefour City",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2940187"},addTags:{brand:"Carrefour City","brand:wikidata":"Q2940187","brand:wikipedia":"fr:Carrefour City",name:"Carrefour City",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour City","brand:wikidata":"Q2940187","brand:wikipedia":"fr:Carrefour City",name:"Carrefour City",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour Contact":{name:"Carrefour Contact",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2940188"},addTags:{brand:"Carrefour Contact","brand:wikidata":"Q2940188","brand:wikipedia":"fr:Carrefour Contact",name:"Carrefour Contact",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour Contact","brand:wikidata":"Q2940188","brand:wikipedia":"fr:Carrefour Contact",name:"Carrefour Contact",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour Express":{name:"Carrefour Express",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2940190"},addTags:{brand:"Carrefour Express","brand:wikidata":"Q2940190","brand:wikipedia":"fr:Carrefour Express",name:"Carrefour Express",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour Express","brand:wikidata":"Q2940190","brand:wikipedia":"fr:Carrefour Express",name:"Carrefour Express",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour Market":{name:"Carrefour Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2689639"},addTags:{brand:"Carrefour Market","brand:wikidata":"Q2689639","brand:wikipedia":"fr:Carrefour Market",name:"Carrefour Market",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour Market","brand:wikidata":"Q2689639","brand:wikipedia":"fr:Carrefour Market",name:"Carrefour Market",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carulla":{name:"Carulla",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5047480"},addTags:{brand:"Carulla","brand:wikidata":"Q5047480","brand:wikipedia":"en:Carulla",name:"Carulla",shop:"supermarket"},removeTags:{brand:"Carulla","brand:wikidata":"Q5047480","brand:wikipedia":"en:Carulla",name:"Carulla",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Checkers":{name:"Checkers",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5089126"},addTags:{brand:"Checkers","brand:wikidata":"Q5089126","brand:wikipedia":"en:Checkers (supermarket chain)",name:"Checkers",shop:"supermarket"},removeTags:{brand:"Checkers","brand:wikidata":"Q5089126","brand:wikipedia":"en:Checkers (supermarket chain)",name:"Checkers",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Chedraui":{name:"Chedraui",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2961952"},addTags:{brand:"Chedraui","brand:wikidata":"Q2961952","brand:wikipedia":"en:Chedraui",name:"Chedraui",shop:"supermarket"},removeTags:{brand:"Chedraui","brand:wikidata":"Q2961952","brand:wikipedia":"en:Chedraui",name:"Chedraui",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/City Market":{name:"City Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5123299"},addTags:{brand:"City Market","brand:wikidata":"Q5123299","brand:wikipedia":"en:City Market (US grocery store chain)",name:"City Market",shop:"supermarket"},removeTags:{brand:"City Market","brand:wikidata":"Q5123299","brand:wikipedia":"en:City Market (US grocery store chain)",name:"City Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Co-op":{name:"Co-op",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5440676"},addTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"supermarket"},removeTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Coles":{name:"Coles",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1108172"},addTags:{brand:"Coles","brand:wikidata":"Q1108172","brand:wikipedia":"en:Coles Supermarkets",name:"Coles",shop:"supermarket"},removeTags:{brand:"Coles","brand:wikidata":"Q1108172","brand:wikipedia":"en:Coles Supermarkets",name:"Coles",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Colruyt":{name:"Colruyt",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2363991"},addTags:{brand:"Colruyt","brand:wikidata":"Q2363991","brand:wikipedia":"en:Colruyt (supermarket)",name:"Colruyt",shop:"supermarket"},removeTags:{brand:"Colruyt","brand:wikidata":"Q2363991","brand:wikipedia":"en:Colruyt (supermarket)",name:"Colruyt",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Combi":{name:"Combi",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1113618"},addTags:{brand:"Combi","brand:wikidata":"Q1113618","brand:wikipedia":"de:Combi (Einkaufsmarkt)",name:"Combi",shop:"supermarket"},removeTags:{brand:"Combi","brand:wikidata":"Q1113618","brand:wikipedia":"de:Combi (Einkaufsmarkt)",name:"Combi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Comercial Mexicana":{name:"Comercial Mexicana",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2985173"},addTags:{brand:"Comercial Mexicana","brand:wikidata":"Q2985173","brand:wikipedia":"en:Comercial Mexicana",name:"Comercial Mexicana",shop:"supermarket"},removeTags:{brand:"Comercial Mexicana","brand:wikidata":"Q2985173","brand:wikipedia":"en:Comercial Mexicana",name:"Comercial Mexicana",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Conad":{name:"Conad",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q639075"},addTags:{brand:"Conad","brand:wikidata":"Q639075","brand:wikipedia":"it:Conad",name:"Conad",shop:"supermarket"},removeTags:{brand:"Conad","brand:wikidata":"Q639075","brand:wikipedia":"it:Conad",name:"Conad",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Conad City":{name:"Conad City",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57543102"},addTags:{brand:"Conad City","brand:wikidata":"Q57543102",name:"Conad City",shop:"supermarket"},removeTags:{brand:"Conad City","brand:wikidata":"Q57543102",name:"Conad City",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Condis":{name:"Condis",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57417581"},addTags:{brand:"Condis","brand:wikidata":"Q57417581",name:"Condis",shop:"supermarket"},removeTags:{brand:"Condis","brand:wikidata":"Q57417581",name:"Condis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Consum":{name:"Consum",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q8350308"},addTags:{brand:"Consum","brand:wikidata":"Q8350308","brand:wikipedia":"es:Consum",name:"Consum",shop:"supermarket"},removeTags:{brand:"Consum","brand:wikidata":"Q8350308","brand:wikipedia":"es:Consum",name:"Consum",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Continente":{name:"Continente",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2995683"},addTags:{brand:"Continente","brand:wikidata":"Q2995683","brand:wikipedia":"en:Continente (Supermarket)",name:"Continente",shop:"supermarket"},removeTags:{brand:"Continente","brand:wikidata":"Q2995683","brand:wikipedia":"en:Continente (Supermarket)",name:"Continente",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Coop Prix":{name:"Coop Prix",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5167705"},addTags:{brand:"Coop Prix","brand:wikidata":"Q5167705","brand:wikipedia":"no:Coop Prix",name:"Coop Prix",shop:"supermarket"},removeTags:{brand:"Coop Prix","brand:wikidata":"Q5167705","brand:wikipedia":"no:Coop Prix",name:"Coop Prix",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Cora":{name:"Cora",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q686643"},addTags:{brand:"Cora","brand:wikidata":"Q686643","brand:wikipedia":"en:Cora (hypermarket)",name:"Cora",shop:"supermarket"},removeTags:{brand:"Cora","brand:wikidata":"Q686643","brand:wikipedia":"en:Cora (hypermarket)",name:"Cora",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Costcutter":{name:"Costcutter",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5175072"},addTags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"supermarket"},removeTags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Coto":{name:"Coto",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5175411"},addTags:{brand:"Coto","brand:wikidata":"Q5175411","brand:wikipedia":"es:Coto (supermercado)",name:"Coto",shop:"supermarket"},removeTags:{brand:"Coto","brand:wikidata":"Q5175411","brand:wikipedia":"es:Coto (supermercado)",name:"Coto",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Countdown":{name:"Countdown",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5176845"},addTags:{brand:"Countdown","brand:wikidata":"Q5176845","brand:wikipedia":"en:Countdown (supermarket)",name:"Countdown",shop:"supermarket"},removeTags:{brand:"Countdown","brand:wikidata":"Q5176845","brand:wikipedia":"en:Countdown (supermarket)",name:"Countdown",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Cub Foods":{name:"Cub Foods",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5191916"},addTags:{brand:"Cub Foods","brand:wikidata":"Q5191916","brand:wikipedia":"en:Cub Foods",name:"Cub Foods",shop:"supermarket"},removeTags:{brand:"Cub Foods","brand:wikidata":"Q5191916","brand:wikipedia":"en:Cub Foods",name:"Cub Foods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/D1":{name:"D1",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q43403418"},addTags:{brand:"D1","brand:wikidata":"Q43403418","brand:wikipedia":"es:Tiendas D1",name:"D1",shop:"supermarket"},removeTags:{brand:"D1","brand:wikidata":"Q43403418","brand:wikipedia":"es:Tiendas D1",name:"D1",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dagli'Brugsen":{name:"Dagli'Brugsen",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12307017"},addTags:{brand:"Dagli'Brugsen","brand:wikidata":"Q12307017","brand:wikipedia":"en:Dagli'Brugsen",name:"Dagli'Brugsen",shop:"supermarket"},removeTags:{brand:"Dagli'Brugsen","brand:wikidata":"Q12307017","brand:wikipedia":"en:Dagli'Brugsen",name:"Dagli'Brugsen",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Deen":{name:"Deen",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q13571727"},addTags:{brand:"Deen","brand:wikidata":"Q13571727","brand:wikipedia":"nl:Deen (supermarkt)",name:"Deen",shop:"supermarket"},removeTags:{brand:"Deen","brand:wikidata":"Q13571727","brand:wikipedia":"nl:Deen (supermarkt)",name:"Deen",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Delhaize":{name:"Delhaize",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1184173"},addTags:{brand:"Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"Delhaize",shop:"supermarket"},removeTags:{brand:"Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"Delhaize",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Delikatesy Centrum":{name:"Delikatesy Centrum",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11693824"},addTags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"supermarket"},removeTags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Denner":{name:"Denner",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q379911"},addTags:{brand:"Denner","brand:wikidata":"Q379911","brand:wikipedia":"en:Denner (supermarkets)",name:"Denner",shop:"supermarket"},removeTags:{brand:"Denner","brand:wikidata":"Q379911","brand:wikipedia":"en:Denner (supermarkets)",name:"Denner",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Despar":{name:"Despar",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q610492"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Despar",shop:"supermarket"},removeTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Despar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dia":{name:"Dia",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q925132"},addTags:{brand:"Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Dia",shop:"supermarket"},removeTags:{brand:"Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Dia",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dia Market":{name:"Dia Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q925132"},addTags:{brand:"Dia Market","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Dia Market",shop:"supermarket"},removeTags:{brand:"Dia Market","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Dia Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dino":{name:"Dino",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11694239"},addTags:{brand:"Dino","brand:wikidata":"Q11694239","brand:wikipedia":"pl:Dino Polska",name:"Dino",shop:"supermarket"},removeTags:{brand:"Dino","brand:wikidata":"Q11694239","brand:wikipedia":"pl:Dino Polska",name:"Dino",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dirk van den Broek":{name:"Dirk van den Broek",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q17502722"},addTags:{brand:"Dirk van den Broek","brand:wikidata":"Q17502722","brand:wikipedia":"en:Dirk (supermarket)",name:"Dirk van den Broek",shop:"supermarket"},removeTags:{brand:"Dirk van den Broek","brand:wikidata":"Q17502722","brand:wikipedia":"en:Dirk (supermarket)",name:"Dirk van den Broek",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dunnes Stores":{name:"Dunnes Stores",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1266203"},addTags:{brand:"Dunnes Stores","brand:wikidata":"Q1266203","brand:wikipedia":"en:Dunnes Stores",name:"Dunnes Stores",shop:"supermarket"},removeTags:{brand:"Dunnes Stores","brand:wikidata":"Q1266203","brand:wikipedia":"en:Dunnes Stores",name:"Dunnes Stores",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/E. Leclerc":{name:"E. Leclerc",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1273376"},addTags:{brand:"E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"en:E.Leclerc",name:"E. Leclerc",shop:"supermarket"},removeTags:{brand:"E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"en:E.Leclerc",name:"E. Leclerc",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/E. Leclerc Drive":{name:"E. Leclerc Drive",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1273376"},addTags:{brand:"E. Leclerc Drive","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"E. Leclerc Drive",operator:"E.Leclerc","operator:wikidata":"Q1273376","operator:wikipedia":"en:E.Leclerc",shop:"supermarket"},removeTags:{brand:"E. Leclerc Drive","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"E. Leclerc Drive",operator:"E.Leclerc","operator:wikidata":"Q1273376","operator:wikipedia":"en:E.Leclerc",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/EMTÉ":{name:"EMTÉ",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3119122"},addTags:{brand:"EMTÉ","brand:wikidata":"Q3119122","brand:wikipedia":"en:EMTÉ",name:"EMTÉ",shop:"supermarket"},removeTags:{brand:"EMTÉ","brand:wikidata":"Q3119122","brand:wikipedia":"en:EMTÉ",name:"EMTÉ",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Edeka":{name:"Edeka",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q701755"},addTags:{brand:"Edeka","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"Edeka",shop:"supermarket"},removeTags:{brand:"Edeka","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"Edeka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Eko":{name:"Eko",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q9251859"},addTags:{brand:"Eko","brand:wikidata":"Q9251859","brand:wikipedia":"pl:Eko Holding",name:"Eko",shop:"supermarket"},removeTags:{brand:"Eko","brand:wikidata":"Q9251859","brand:wikipedia":"pl:Eko Holding",name:"Eko",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ekono":{name:"Ekono",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2842729"},addTags:{brand:"Ekono","brand:wikidata":"Q2842729","brand:wikipedia":"es:Ekono",name:"Ekono",shop:"supermarket"},removeTags:{brand:"Ekono","brand:wikidata":"Q2842729","brand:wikipedia":"es:Ekono",name:"Ekono",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Eroski":{name:"Eroski",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1361349"},addTags:{brand:"Eroski","brand:wikidata":"Q1361349","brand:wikipedia":"en:Eroski",name:"Eroski",shop:"supermarket"},removeTags:{brand:"Eroski","brand:wikidata":"Q1361349","brand:wikipedia":"en:Eroski",name:"Eroski",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Esselunga":{name:"Esselunga",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1059636"},addTags:{brand:"Esselunga","brand:wikidata":"Q1059636","brand:wikipedia":"en:Esselunga",name:"Esselunga",shop:"supermarket"},removeTags:{brand:"Esselunga","brand:wikidata":"Q1059636","brand:wikipedia":"en:Esselunga",name:"Esselunga",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/EuroSpin":{name:"EuroSpin",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1374674"},addTags:{brand:"EuroSpin","brand:wikidata":"Q1374674","brand:wikipedia":"it:EuroSpin",name:"EuroSpin",shop:"supermarket"},removeTags:{brand:"EuroSpin","brand:wikidata":"Q1374674","brand:wikipedia":"it:EuroSpin",name:"EuroSpin",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Eurospar":{name:"Eurospar",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12309283"},addTags:{brand:"Eurospar","brand:wikidata":"Q12309283","brand:wikipedia":"da:Eurospar",name:"Eurospar",shop:"supermarket"},removeTags:{brand:"Eurospar","brand:wikidata":"Q12309283","brand:wikipedia":"da:Eurospar",name:"Eurospar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Extra":{name:"Extra",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11964085"},addTags:{brand:"Extra","brand:wikidata":"Q11964085","brand:wikipedia":"no:Extra (Coop)",name:"Extra",shop:"supermarket"},removeTags:{brand:"Extra","brand:wikidata":"Q11964085","brand:wikipedia":"no:Extra (Coop)",name:"Extra",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Famila":{name:"Famila",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1395108"},addTags:{brand:"Famila","brand:wikidata":"Q1395108","brand:wikipedia":"de:Famila",name:"Famila",shop:"supermarket"},removeTags:{brand:"Famila","brand:wikidata":"Q1395108","brand:wikipedia":"de:Famila",name:"Famila",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Fareway":{name:"Fareway",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5434998"},addTags:{brand:"Fareway","brand:wikidata":"Q5434998","brand:wikipedia":"en:Fareway",name:"Fareway",shop:"supermarket"},removeTags:{brand:"Fareway","brand:wikidata":"Q5434998","brand:wikipedia":"en:Fareway",name:"Fareway",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Farm Boy":{name:"Farm Boy",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5435469"},addTags:{brand:"Farm Boy","brand:wikidata":"Q5435469","brand:wikipedia":"en:Farm Boy",name:"Farm Boy",shop:"supermarket"},removeTags:{brand:"Farm Boy","brand:wikidata":"Q5435469","brand:wikipedia":"en:Farm Boy",name:"Farm Boy",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Farmfoods":{name:"Farmfoods",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5435841"},addTags:{brand:"Farmfoods","brand:wikidata":"Q5435841","brand:wikipedia":"en:Farmfoods",name:"Farmfoods",shop:"supermarket"},removeTags:{brand:"Farmfoods","brand:wikidata":"Q5435841","brand:wikipedia":"en:Farmfoods",name:"Farmfoods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Feneberg":{name:"Feneberg",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5345378"},addTags:{brand:"Feneberg","brand:wikidata":"Q5345378","brand:wikipedia":"de:Feneberg Lebensmittel",name:"Feneberg",shop:"supermarket"},removeTags:{brand:"Feneberg","brand:wikidata":"Q5345378","brand:wikipedia":"de:Feneberg Lebensmittel",name:"Feneberg",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Food 4 Less":{name:"Food 4 Less",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5465282"},addTags:{brand:"Food 4 Less","brand:wikidata":"Q5465282","brand:wikipedia":"en:Food 4 Less",name:"Food 4 Less",shop:"supermarket"},removeTags:{brand:"Food 4 Less","brand:wikidata":"Q5465282","brand:wikipedia":"en:Food 4 Less",name:"Food 4 Less",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Food Basics":{name:"Food Basics",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5465300"},addTags:{brand:"Food Basics","brand:wikidata":"Q5465300","brand:wikipedia":"en:Food Basics",name:"Food Basics",shop:"supermarket"},removeTags:{brand:"Food Basics","brand:wikidata":"Q5465300","brand:wikipedia":"en:Food Basics",name:"Food Basics",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Food City":{name:"Food City",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5465306"},addTags:{brand:"Food City","brand:wikidata":"Q5465306","brand:wikipedia":"en:Food City (Canada)",name:"Food City",shop:"supermarket"},removeTags:{brand:"Food City","brand:wikidata":"Q5465306","brand:wikipedia":"en:Food City (Canada)",name:"Food City",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Food Lion":{name:"Food Lion",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1435950"},addTags:{brand:"Food Lion","brand:wikidata":"Q1435950","brand:wikipedia":"en:Food Lion",name:"Food Lion",shop:"supermarket"},removeTags:{brand:"Food Lion","brand:wikidata":"Q1435950","brand:wikipedia":"en:Food Lion",name:"Food Lion",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Foodworks":{name:"Foodworks",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5465579"},addTags:{brand:"Foodworks","brand:wikidata":"Q5465579","brand:wikipedia":"en:Foodworks",name:"Foodworks",shop:"supermarket"},removeTags:{brand:"Foodworks","brand:wikidata":"Q5465579","brand:wikipedia":"en:Foodworks",name:"Foodworks",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Fred Meyer":{name:"Fred Meyer",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5495932"},addTags:{brand:"Fred Meyer","brand:wikidata":"Q5495932","brand:wikipedia":"en:Fred Meyer",name:"Fred Meyer",shop:"supermarket"},removeTags:{brand:"Fred Meyer","brand:wikidata":"Q5495932","brand:wikipedia":"en:Fred Meyer",name:"Fred Meyer",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/FreshCo":{name:"FreshCo",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5502915"},addTags:{brand:"FreshCo","brand:wikidata":"Q5502915","brand:wikipedia":"en:FreshCo",name:"FreshCo",shop:"supermarket"},removeTags:{brand:"FreshCo","brand:wikidata":"Q5502915","brand:wikipedia":"en:FreshCo",name:"FreshCo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Froiz":{name:"Froiz",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q17070775"},addTags:{brand:"Froiz","brand:wikidata":"Q17070775","brand:wikipedia":"en:Froiz",name:"Froiz",shop:"supermarket"},removeTags:{brand:"Froiz","brand:wikidata":"Q17070775","brand:wikipedia":"en:Froiz",name:"Froiz",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Føtex":{name:"Føtex",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1480395"},addTags:{brand:"Føtex","brand:wikidata":"Q1480395","brand:wikipedia":"en:Føtex",name:"Føtex",shop:"supermarket"},removeTags:{brand:"Føtex","brand:wikidata":"Q1480395","brand:wikipedia":"en:Føtex",name:"Føtex",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/G20":{name:"G20",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3504731"},addTags:{brand:"G20","brand:wikidata":"Q3504731","brand:wikipedia":"fr:Supermarchés G20",name:"G20",shop:"supermarket"},removeTags:{brand:"G20","brand:wikidata":"Q3504731","brand:wikipedia":"fr:Supermarchés G20",name:"G20",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Gadis":{name:"Gadis",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12389151"},addTags:{brand:"Gadis","brand:wikidata":"Q12389151","brand:wikipedia":"gl:Gadisa",name:"Gadis",shop:"supermarket"},removeTags:{brand:"Gadis","brand:wikidata":"Q12389151","brand:wikipedia":"gl:Gadisa",name:"Gadis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Giant Eagle":{name:"Giant Eagle",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1522721"},addTags:{brand:"Giant Eagle","brand:wikidata":"Q1522721","brand:wikipedia":"en:Giant Eagle",name:"Giant Eagle",shop:"supermarket"},removeTags:{brand:"Giant Eagle","brand:wikidata":"Q1522721","brand:wikipedia":"en:Giant Eagle",name:"Giant Eagle",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Globus":{name:"Globus",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q457503"},addTags:{brand:"Globus","brand:wikidata":"Q457503","brand:wikipedia":"en:Globus (hypermarket)",name:"Globus",shop:"supermarket"},removeTags:{brand:"Globus","brand:wikidata":"Q457503","brand:wikipedia":"en:Globus (hypermarket)",name:"Globus",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Grand Frais":{name:"Grand Frais",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3114675"},addTags:{brand:"Grand Frais","brand:wikidata":"Q3114675","brand:wikipedia":"fr:Grand Frais",name:"Grand Frais",shop:"supermarket"},removeTags:{brand:"Grand Frais","brand:wikidata":"Q3114675","brand:wikipedia":"fr:Grand Frais",name:"Grand Frais",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Grocery Outlet":{name:"Grocery Outlet",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5609934"},addTags:{brand:"Grocery Outlet","brand:wikidata":"Q5609934","brand:wikipedia":"en:Grocery Outlet",name:"Grocery Outlet",shop:"supermarket"},removeTags:{brand:"Grocery Outlet","brand:wikidata":"Q5609934","brand:wikipedia":"en:Grocery Outlet",name:"Grocery Outlet",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Géant Casino":{name:"Géant Casino",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1380537"},addTags:{brand:"Géant Casino","brand:wikidata":"Q1380537","brand:wikipedia":"en:Géant Casino",name:"Géant Casino",shop:"supermarket"},removeTags:{brand:"Géant Casino","brand:wikidata":"Q1380537","brand:wikipedia":"en:Géant Casino",name:"Géant Casino",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/H-E-B":{name:"H-E-B",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q830621"},addTags:{brand:"H-E-B","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B",shop:"supermarket"},removeTags:{brand:"H-E-B","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/HIT":{name:"HIT",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1548713"},addTags:{brand:"HIT","brand:wikidata":"Q1548713","brand:wikipedia":"de:HIT Handelsgruppe",name:"HIT",shop:"supermarket"},removeTags:{brand:"HIT","brand:wikidata":"Q1548713","brand:wikipedia":"de:HIT Handelsgruppe",name:"HIT",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hannaford":{name:"Hannaford",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5648760"},addTags:{brand:"Hannaford","brand:wikidata":"Q5648760","brand:wikipedia":"en:Hannaford Brothers Company",name:"Hannaford",shop:"supermarket"},removeTags:{brand:"Hannaford","brand:wikidata":"Q5648760","brand:wikipedia":"en:Hannaford Brothers Company",name:"Hannaford",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Harris Teeter":{name:"Harris Teeter",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5665067"},addTags:{brand:"Harris Teeter","brand:wikidata":"Q5665067","brand:wikipedia":"en:Harris Teeter",name:"Harris Teeter",shop:"supermarket"},removeTags:{brand:"Harris Teeter","brand:wikidata":"Q5665067","brand:wikipedia":"en:Harris Teeter",name:"Harris Teeter",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hemköp":{name:"Hemköp",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q10521746"},addTags:{brand:"Hemköp","brand:wikidata":"Q10521746","brand:wikipedia":"sv:Hemköp",name:"Hemköp",shop:"supermarket"},removeTags:{brand:"Hemköp","brand:wikidata":"Q10521746","brand:wikipedia":"sv:Hemköp",name:"Hemköp",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Heron Foods":{name:"Heron Foods",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5743472"},addTags:{brand:"Heron Foods","brand:wikidata":"Q5743472","brand:wikipedia":"en:Heron Foods",name:"Heron Foods",shop:"supermarket"},removeTags:{brand:"Heron Foods","brand:wikidata":"Q5743472","brand:wikipedia":"en:Heron Foods",name:"Heron Foods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hofer":{name:"Hofer",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q15815751"},addTags:{brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer",shop:"supermarket"},removeTags:{brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hoogvliet":{name:"Hoogvliet",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1642179"},addTags:{brand:"Hoogvliet","brand:wikidata":"Q1642179","brand:wikipedia":"nl:Hoogvliet (supermarkt)",name:"Hoogvliet",shop:"supermarket"},removeTags:{brand:"Hoogvliet","brand:wikidata":"Q1642179","brand:wikipedia":"nl:Hoogvliet (supermarkt)",name:"Hoogvliet",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hy-Vee":{name:"Hy-Vee",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1639719"},addTags:{brand:"Hy-Vee","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",name:"Hy-Vee",shop:"supermarket"},removeTags:{brand:"Hy-Vee","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",name:"Hy-Vee",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hyper U":{name:"Hyper U",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2529029"},addTags:{brand:"Hyper U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Hyper U",shop:"supermarket"},removeTags:{brand:"Hyper U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Hyper U",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ICA":{name:"ICA",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1663776"},addTags:{brand:"ICA","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA",shop:"supermarket"},removeTags:{brand:"ICA","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ICA Kvantum":{name:"ICA Kvantum",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1663776"},addTags:{brand:"ICA Kvantum","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Kvantum",shop:"supermarket"},removeTags:{brand:"ICA Kvantum","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Kvantum",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ICA Maxi":{name:"ICA Maxi",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1663776"},addTags:{brand:"ICA Maxi","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Maxi",shop:"supermarket"},removeTags:{brand:"ICA Maxi","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Maxi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/IDEA":{name:"IDEA",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q23461622"},addTags:{brand:"IDEA","brand:wikidata":"Q23461622","brand:wikipedia":"en:Idea (supermarkets)",name:"IDEA",shop:"supermarket"},removeTags:{brand:"IDEA","brand:wikidata":"Q23461622","brand:wikipedia":"en:Idea (supermarkets)",name:"IDEA",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/IGA":{name:"IGA",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3146662"},addTags:{brand:"IGA","brand:wikidata":"Q3146662","brand:wikipedia":"en:IGA (supermarkets)",name:"IGA",shop:"supermarket"},removeTags:{brand:"IGA","brand:wikidata":"Q3146662","brand:wikipedia":"en:IGA (supermarkets)",name:"IGA",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Iceland":{name:"Iceland",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q721810"},addTags:{brand:"Iceland","brand:wikidata":"Q721810","brand:wikipedia":"en:Iceland (supermarket)",name:"Iceland",shop:"supermarket"},removeTags:{brand:"Iceland","brand:wikidata":"Q721810","brand:wikipedia":"en:Iceland (supermarket)",name:"Iceland",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ingles":{name:"Ingles",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6032595"},addTags:{brand:"Ingles","brand:wikidata":"Q6032595","brand:wikipedia":"en:Ingles",name:"Ingles",shop:"supermarket"},removeTags:{brand:"Ingles","brand:wikidata":"Q6032595","brand:wikipedia":"en:Ingles",name:"Ingles",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Intermarché":{name:"Intermarché",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3153200"},addTags:{brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché",shop:"supermarket"},removeTags:{brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Intermarché Super":{name:"Intermarché Super",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3153200"},addTags:{brand:"Intermarché Super","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Super",shop:"supermarket"},removeTags:{brand:"Intermarché Super","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Super",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Interspar":{name:"Interspar",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q15820339"},addTags:{brand:"Interspar","brand:wikidata":"Q15820339","brand:wikipedia":"de:Interspar (Österreich)",name:"Interspar",shop:"supermarket"},removeTags:{brand:"Interspar","brand:wikidata":"Q15820339","brand:wikipedia":"de:Interspar (Österreich)",name:"Interspar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Irma":{name:"Irma",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q797150"},addTags:{brand:"Irma","brand:wikidata":"Q797150","brand:wikipedia":"en:Irma (supermarket)",name:"Irma",shop:"supermarket"},removeTags:{brand:"Irma","brand:wikidata":"Q797150","brand:wikipedia":"en:Irma (supermarket)",name:"Irma",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Jewel-Osco":{name:"Jewel-Osco",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3178470"},addTags:{brand:"Jewel-Osco","brand:wikidata":"Q3178470","brand:wikipedia":"en:Jewel (supermarket)",name:"Jewel-Osco",shop:"supermarket"},removeTags:{brand:"Jewel-Osco","brand:wikidata":"Q3178470","brand:wikipedia":"en:Jewel (supermarket)",name:"Jewel-Osco",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Joker":{name:"Joker",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q716328"},addTags:{brand:"Joker","brand:wikidata":"Q716328","brand:wikipedia":"en:Joker (store)",name:"Joker",shop:"supermarket"},removeTags:{brand:"Joker","brand:wikidata":"Q716328","brand:wikipedia":"en:Joker (store)",name:"Joker",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Jumbo":{name:"Jumbo",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2262314"},addTags:{brand:"Jumbo","brand:wikidata":"Q2262314","brand:wikipedia":"en:Jumbo (supermarket)",name:"Jumbo",shop:"supermarket"},removeTags:{brand:"Jumbo","brand:wikidata":"Q2262314","brand:wikipedia":"en:Jumbo (supermarket)",name:"Jumbo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Kaufland":{name:"Kaufland",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q685967"},addTags:{brand:"Kaufland","brand:wikidata":"Q685967","brand:wikipedia":"en:Kaufland",name:"Kaufland",shop:"supermarket"},removeTags:{brand:"Kaufland","brand:wikidata":"Q685967","brand:wikipedia":"en:Kaufland",name:"Kaufland",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/King Soopers":{name:"King Soopers",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6412065"},addTags:{brand:"King Soopers","brand:wikidata":"Q6412065","brand:wikipedia":"en:King Soopers",name:"King Soopers",shop:"supermarket"},removeTags:{brand:"King Soopers","brand:wikidata":"Q6412065","brand:wikipedia":"en:King Soopers",name:"King Soopers",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Kiwi":{name:"Kiwi",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1613639"},addTags:{brand:"Kiwi","brand:wikidata":"Q1613639","brand:wikipedia":"en:Kiwi (store)",name:"Kiwi",shop:"supermarket"},removeTags:{brand:"Kiwi","brand:wikidata":"Q1613639","brand:wikipedia":"en:Kiwi (store)",name:"Kiwi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Kroger":{name:"Kroger",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q153417"},addTags:{brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger",shop:"supermarket"},removeTags:{brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Kvickly":{name:"Kvickly",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7061148"},addTags:{brand:"Kvickly","brand:wikidata":"Q7061148","brand:wikipedia":"en:Kvickly",name:"Kvickly",shop:"supermarket"},removeTags:{brand:"Kvickly","brand:wikidata":"Q7061148","brand:wikipedia":"en:Kvickly",name:"Kvickly",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/La Anónima":{name:"La Anónima",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6135985"},addTags:{brand:"La Anónima","brand:wikidata":"Q6135985","brand:wikipedia":"es:La Anónima",name:"La Anónima",shop:"supermarket"},removeTags:{brand:"La Anónima","brand:wikidata":"Q6135985","brand:wikipedia":"es:La Anónima",name:"La Anónima",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/La Plaza de DIA":{name:"La Plaza de DIA",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58904673"},addTags:{brand:"La Plaza de DIA","brand:wikidata":"Q58904673",name:"La Plaza de DIA","operator:wikidata":"Q925132","operator:wikipedia":"es:Supermercados Dia",shop:"supermarket"},removeTags:{brand:"La Plaza de DIA","brand:wikidata":"Q58904673",name:"La Plaza de DIA","operator:wikidata":"Q925132","operator:wikipedia":"es:Supermercados Dia",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/La Vie Claire":{name:"La Vie Claire",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3213589"},addTags:{brand:"La Vie Claire","brand:wikidata":"Q3213589","brand:wikipedia":"en:La Vie Claire (company)",name:"La Vie Claire",shop:"supermarket"},removeTags:{brand:"La Vie Claire","brand:wikidata":"Q3213589","brand:wikipedia":"en:La Vie Claire (company)",name:"La Vie Claire",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Landi":{name:"Landi",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1803010"},addTags:{brand:"Landi","brand:wikidata":"Q1803010","brand:wikipedia":"en:Landi (Unternehmen)",name:"Landi",shop:"supermarket"},removeTags:{brand:"Landi","brand:wikidata":"Q1803010","brand:wikipedia":"en:Landi (Unternehmen)",name:"Landi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Leader Price":{name:"Leader Price",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2181426"},addTags:{brand:"Leader Price","brand:wikidata":"Q2181426","brand:wikipedia":"en:Leader Price",name:"Leader Price",shop:"supermarket"},removeTags:{brand:"Leader Price","brand:wikidata":"Q2181426","brand:wikipedia":"en:Leader Price",name:"Leader Price",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lider":{name:"Lider",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6711261"},addTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider",shop:"supermarket"},removeTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lider Express":{name:"Lider Express",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6711261"},addTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider Express",shop:"supermarket"},removeTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider Express",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lidl":{name:"Lidl",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q151954"},addTags:{brand:"Lidl","brand:wikidata":"Q151954","brand:wikipedia":"en:Lidl",name:"Lidl",shop:"supermarket"},removeTags:{brand:"Lidl","brand:wikidata":"Q151954","brand:wikipedia":"en:Lidl",name:"Lidl",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Loblaws":{name:"Loblaws",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3257626"},addTags:{brand:"Loblaws","brand:wikidata":"Q3257626","brand:wikipedia":"en:Loblaws",name:"Lonblaws",shop:"supermarket"},removeTags:{brand:"Loblaws","brand:wikidata":"Q3257626","brand:wikipedia":"en:Loblaws",name:"Lonblaws",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lowe's Market":{name:"Lowe's Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6693107"},addTags:{brand:"Lowe's Market","brand:wikidata":"Q6693107","brand:wikipedia":"en:Lowe's Market",name:"Lowe's Market",shop:"supermarket"},removeTags:{brand:"Lowe's Market","brand:wikidata":"Q6693107","brand:wikipedia":"en:Lowe's Market",name:"Lowe's Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lowes Foods":{name:"Lowes Foods",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6693991"},addTags:{brand:"Lowes Foods","brand:wikidata":"Q6693991","brand:wikipedia":"en:Lowes Foods",name:"Lowes Foods",shop:"supermarket"},removeTags:{brand:"Lowes Foods","brand:wikidata":"Q6693991","brand:wikipedia":"en:Lowes Foods",name:"Lowes Foods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lucky":{name:"Lucky",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6698032"},addTags:{brand:"Lucky","brand:wikidata":"Q6698032","brand:wikipedia":"en:Lucky Stores",name:"Lucky",shop:"supermarket"},removeTags:{brand:"Lucky","brand:wikidata":"Q6698032","brand:wikipedia":"en:Lucky Stores",name:"Lucky",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lupa":{name:"Lupa",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58044048"},addTags:{brand:"Lupa","brand:wikidata":"Q58044048",name:"Lupa",shop:"supermarket"},removeTags:{brand:"Lupa","brand:wikidata":"Q58044048",name:"Lupa",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/MD":{name:"MD",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3841263"},addTags:{brand:"MD","brand:wikidata":"Q3841263","brand:wikipedia":"en:MD Discount",name:"MD",shop:"supermarket"},removeTags:{brand:"MD","brand:wikidata":"Q3841263","brand:wikipedia":"en:MD Discount",name:"MD",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/MPREIS":{name:"MPREIS",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q873491"},addTags:{brand:"MPREIS","brand:wikidata":"Q873491","brand:wikipedia":"de:MPreis",name:"MPREIS",shop:"supermarket"},removeTags:{brand:"MPREIS","brand:wikidata":"Q873491","brand:wikipedia":"de:MPreis",name:"MPREIS",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Markant":{name:"Markant",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57523365"},addTags:{brand:"Markant","brand:wikidata":"Q57523365",name:"Markant",shop:"supermarket"},removeTags:{brand:"Markant","brand:wikidata":"Q57523365",name:"Markant",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Market Basket":{name:"Market Basket",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2079198"},addTags:{brand:"Market Basket","brand:wikidata":"Q2079198","brand:wikipedia":"en:Market Basket (New England)",name:"Market Basket",shop:"supermarket"},removeTags:{brand:"Market Basket","brand:wikidata":"Q2079198","brand:wikipedia":"en:Market Basket (New England)",name:"Market Basket",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Marktkauf":{name:"Marktkauf",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1533254"},addTags:{brand:"Marktkauf","brand:wikidata":"Q1533254","brand:wikipedia":"de:Marktkauf Holding",name:"Marktkauf",shop:"supermarket"},removeTags:{brand:"Marktkauf","brand:wikidata":"Q1533254","brand:wikipedia":"de:Marktkauf Holding",name:"Marktkauf",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Martin's Super Markets":{name:"Martin's Super Markets",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6774803"},addTags:{brand:"Martin's Super Markets","brand:wikidata":"Q6774803","brand:wikipedia":"en:Martin's Super Markets",name:"Martin's Super Markets",shop:"supermarket"},removeTags:{brand:"Martin's Super Markets","brand:wikidata":"Q6774803","brand:wikipedia":"en:Martin's Super Markets",name:"Martin's Super Markets",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Match":{name:"Match",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q513977"},addTags:{brand:"Match","brand:wikidata":"Q513977","brand:wikipedia":"en:Match (supermarket)",name:"Match",shop:"supermarket"},removeTags:{brand:"Match","brand:wikidata":"Q513977","brand:wikipedia":"en:Match (supermarket)",name:"Match",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxi Dia":{name:"Maxi Dia",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q925132"},addTags:{brand:"Maxi Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Maxi Dia",shop:"supermarket"},removeTags:{brand:"Maxi Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Maxi Dia",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxima X":{name:"Maxima X",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1881222"},addTags:{brand:"Maxima X","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima X",shop:"supermarket"},removeTags:{brand:"Maxima X","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima X",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxima XX":{name:"Maxima XX",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1881222"},addTags:{brand:"Maxima XX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XX",shop:"supermarket"},removeTags:{brand:"Maxima XX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XX",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxima XXX":{name:"Maxima XXX",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1881222"},addTags:{brand:"Maxima XXX",name:"Maxima XXX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",shop:"supermarket"},removeTags:{brand:"Maxima XXX",name:"Maxima XXX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxi (Canada)":{name:"Maxi (Canada)",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3302441"},addTags:{brand:"Maxi","brand:wikidata":"Q3302441","brand:wikipedia":"en:Maxi (Canadian supermarket)",name:"Maxi",shop:"supermarket"},removeTags:{brand:"Maxi","brand:wikidata":"Q3302441","brand:wikipedia":"en:Maxi (Canadian supermarket)",name:"Maxi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxi (Serbia)":{name:"Maxi (Serbia)",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6795490"},addTags:{brand:"Maxi","brand:wikidata":"Q6795490","brand:wikipedia":"en:Maxi (supermarkets)",name:"Maxi",shop:"supermarket"},removeTags:{brand:"Maxi","brand:wikidata":"Q6795490","brand:wikipedia":"en:Maxi (supermarkets)",name:"Maxi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Mega Image":{name:"Mega Image",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6808085"},addTags:{brand:"Mega Image","brand:wikidata":"Q6808085","brand:wikipedia":"en:Mega Image",name:"Mega Image",shop:"supermarket"},removeTags:{brand:"Mega Image","brand:wikidata":"Q6808085","brand:wikipedia":"en:Mega Image",name:"Mega Image",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Mego":{name:"Mego",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16363314"},addTags:{brand:"Mego","brand:wikidata":"Q16363314","brand:wikipedia":"lv:Mego",name:"Mego",shop:"supermarket"},removeTags:{brand:"Mego","brand:wikidata":"Q16363314","brand:wikipedia":"lv:Mego",name:"Mego",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Meijer":{name:"Meijer",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1917753"},addTags:{brand:"Meijer","brand:wikidata":"Q1917753","brand:wikipedia":"en:Meijer",name:"Meijer",shop:"supermarket"},removeTags:{brand:"Meijer","brand:wikidata":"Q1917753","brand:wikipedia":"en:Meijer",name:"Meijer",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Meny":{name:"Meny",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q10581720"},addTags:{brand:"Meny","brand:wikidata":"Q10581720","brand:wikipedia":"en:Meny",name:"Meny",shop:"supermarket"},removeTags:{brand:"Meny","brand:wikidata":"Q10581720","brand:wikipedia":"en:Meny",name:"Meny",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Mercadona":{name:"Mercadona",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q377705"},addTags:{brand:"Mercadona","brand:wikidata":"Q377705","brand:wikipedia":"en:Mercadona",name:"Mercadona",shop:"supermarket"},removeTags:{brand:"Mercadona","brand:wikidata":"Q377705","brand:wikipedia":"en:Mercadona",name:"Mercadona",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Merkur":{name:"Merkur",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1921857"},addTags:{brand:"Merkur","brand:wikidata":"Q1921857","brand:wikipedia":"de:Merkur (Österreich)",name:"Merkur",shop:"supermarket"},removeTags:{brand:"Merkur","brand:wikidata":"Q1921857","brand:wikipedia":"de:Merkur (Österreich)",name:"Merkur",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Metro (Canada)":{name:"Metro (Canada)",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1145669"},addTags:{brand:"Metro","brand:wikidata":"Q1145669","brand:wikipedia":"en:Metro Inc.",name:"Metro",shop:"supermarket"},removeTags:{brand:"Metro","brand:wikidata":"Q1145669","brand:wikipedia":"en:Metro Inc.",name:"Metro",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Migros":{name:"Migros",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q680727"},addTags:{brand:"Migros","brand:wikidata":"Q680727","brand:wikipedia":"en:Migros",name:"Migros",shop:"supermarket"},removeTags:{brand:"Migros","brand:wikidata":"Q680727","brand:wikipedia":"en:Migros",name:"Migros",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Mila":{name:"Mila",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q48844636"},addTags:{brand:"Mila","brand:wikidata":"Q48844636","brand:wikipedia":"pl:Mila (sieć sklepów)",name:"Mila",shop:"supermarket"},removeTags:{brand:"Mila","brand:wikidata":"Q48844636","brand:wikipedia":"pl:Mila (sieć sklepów)",name:"Mila",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Minipreço":{name:"Minipreço",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3042224"},addTags:{brand:"Minipreço","brand:wikidata":"Q3042224","brand:wikipedia":"en:Minipreço",name:"Minipreço",shop:"supermarket"},removeTags:{brand:"Minipreço","brand:wikidata":"Q3042224","brand:wikipedia":"en:Minipreço",name:"Minipreço",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Mix Markt":{name:"Mix Markt",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q327854"},addTags:{brand:"Mix Markt","brand:wikidata":"Q327854","brand:wikipedia":"de:Mix Markt",name:"Mix Markt",shop:"supermarket"},removeTags:{brand:"Mix Markt","brand:wikidata":"Q327854","brand:wikipedia":"de:Mix Markt",name:"Mix Markt",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Monoprix":{name:"Monoprix",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3321241"},addTags:{brand:"Monoprix","brand:wikidata":"Q3321241","brand:wikipedia":"en:Monoprix",name:"Monoprix",shop:"supermarket"},removeTags:{brand:"Monoprix","brand:wikidata":"Q3321241","brand:wikipedia":"en:Monoprix",name:"Monoprix",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/More":{name:"More",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6910891"},addTags:{brand:"More","brand:wikidata":"Q6910891","brand:wikipedia":"en:More (store)",name:"More",shop:"supermarket"},removeTags:{brand:"More","brand:wikidata":"Q6910891","brand:wikipedia":"en:More (store)",name:"More",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Morrisons":{name:"Morrisons",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q922344"},addTags:{brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons",shop:"supermarket"},removeTags:{brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Nah & Frisch":{name:"Nah & Frisch",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1963643"},addTags:{brand:"Nah & Frisch","brand:wikidata":"Q1963643","brand:wikipedia":"de:Nah & Frisch",name:"Nah & Frisch",shop:"supermarket"},removeTags:{brand:"Nah & Frisch","brand:wikidata":"Q1963643","brand:wikipedia":"de:Nah & Frisch",name:"Nah & Frisch",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Nahkauf":{name:"Nahkauf",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57515238"},addTags:{brand:"Nahkauf","brand:wikidata":"Q57515238",name:"Nahkauf",shop:"supermarket"},removeTags:{brand:"Nahkauf","brand:wikidata":"Q57515238",name:"Nahkauf",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Naturalia":{name:"Naturalia",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3337081"},addTags:{brand:"Naturalia","brand:wikidata":"Q3337081","brand:wikipedia":"fr:Naturalia",name:"Naturalia",shop:"supermarket"},removeTags:{brand:"Naturalia","brand:wikidata":"Q3337081","brand:wikipedia":"fr:Naturalia",name:"Naturalia",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Netto":{name:"Netto",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q552652"},addTags:{brand:"Netto","brand:wikidata":"Q552652","brand:wikipedia":"en:Netto (store)",name:"Netto",shop:"supermarket"},removeTags:{brand:"Netto","brand:wikidata":"Q552652","brand:wikipedia":"en:Netto (store)",name:"Netto",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Netto Marken-Discount":{name:"Netto Marken-Discount",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q879858"},addTags:{brand:"Netto Marken-Discount","brand:wikidata":"Q879858","brand:wikipedia":"en:Netto Marken-Discount",name:"Netto Marken-Discount",shop:"supermarket"},removeTags:{brand:"Netto Marken-Discount","brand:wikidata":"Q879858","brand:wikipedia":"en:Netto Marken-Discount",name:"Netto Marken-Discount",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/New World":{name:"New World",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7012488"},addTags:{brand:"New World","brand:wikidata":"Q7012488","brand:wikipedia":"en:New World (supermarket)",name:"New World",shop:"supermarket"},removeTags:{brand:"New World","brand:wikidata":"Q7012488","brand:wikipedia":"en:New World (supermarket)",name:"New World",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/No Frills":{name:"No Frills",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3342407"},addTags:{brand:"No Frills","brand:wikidata":"Q3342407","brand:wikipedia":"en:No Frills (grocery store)",name:"No Frills",shop:"supermarket"},removeTags:{brand:"No Frills","brand:wikidata":"Q3342407","brand:wikipedia":"en:No Frills (grocery store)",name:"No Frills",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Norfa XL":{name:"Norfa XL",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1998983"},addTags:{brand:"Norfa XL","brand:wikidata":"Q1998983","brand:wikipedia":"lt:Norfa",name:"Norfa XL",shop:"supermarket"},removeTags:{brand:"Norfa XL","brand:wikidata":"Q1998983","brand:wikipedia":"lt:Norfa",name:"Norfa XL",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Norma":{name:"Norma",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q450180"},addTags:{brand:"Norma","brand:wikidata":"Q450180","brand:wikipedia":"de:Norma (Handelskette)",name:"Norma",shop:"supermarket"},removeTags:{brand:"Norma","brand:wikidata":"Q450180","brand:wikipedia":"de:Norma (Handelskette)",name:"Norma",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Okay":{name:"Okay",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2159701"},addTags:{brand:"Okay","brand:wikidata":"Q2159701","brand:wikipedia":"fr:OKay",name:"Okay",shop:"supermarket"},removeTags:{brand:"Okay","brand:wikidata":"Q2159701","brand:wikipedia":"fr:OKay",name:"Okay",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Olímpica":{name:"Olímpica",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q24749847"},addTags:{brand:"Olímpica","brand:wikidata":"Q24749847","brand:wikipedia":"es:Olímpica (supermercado)",name:"Olímpica",shop:"supermarket"},removeTags:{brand:"Olímpica","brand:wikidata":"Q24749847","brand:wikipedia":"es:Olímpica (supermercado)",name:"Olímpica",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/PLUS":{name:"PLUS",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1978981"},addTags:{brand:"PLUS","brand:wikidata":"Q1978981","brand:wikipedia":"nl:PLUS (Nederlandse supermarkt)",name:"PLUS",shop:"supermarket"},removeTags:{brand:"PLUS","brand:wikidata":"Q1978981","brand:wikipedia":"nl:PLUS (Nederlandse supermarkt)",name:"PLUS",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/POLOmarket":{name:"POLOmarket",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11821937"},addTags:{brand:"POLOmarket","brand:wikidata":"Q11821937","brand:wikipedia":"en:Polomarket",name:"POLOmarket",shop:"supermarket"},removeTags:{brand:"POLOmarket","brand:wikidata":"Q11821937","brand:wikipedia":"en:Polomarket",name:"POLOmarket",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Palí":{name:"Palí",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1064887"},addTags:{brand:"Palí","brand:wikidata":"Q1064887","brand:wikipedia":"es:Walmart de México y Centroamérica",name:"Palí",shop:"supermarket"},removeTags:{brand:"Palí","brand:wikidata":"Q1064887","brand:wikipedia":"es:Walmart de México y Centroamérica",name:"Palí",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pam":{name:"Pam",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3777398"},addTags:{brand:"Pam","brand:wikidata":"Q3777398","brand:wikipedia":"it:Gruppo PAM",name:"Pam",shop:"supermarket"},removeTags:{brand:"Pam","brand:wikidata":"Q3777398","brand:wikipedia":"it:Gruppo PAM",name:"Pam",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pavilions":{name:"Pavilions",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7155886"},addTags:{brand:"Pavilions","brand:wikidata":"Q7155886","brand:wikipedia":"en:Pavilions (supermarket)",name:"Pavilions",shop:"supermarket"},removeTags:{brand:"Pavilions","brand:wikidata":"Q7155886","brand:wikipedia":"en:Pavilions (supermarket)",name:"Pavilions",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Penny":{name:"Penny",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q284688"},addTags:{brand:"Penny","brand:wikidata":"Q284688","brand:wikipedia":"en:Penny (supermarket)",name:"Penny",shop:"supermarket"},removeTags:{brand:"Penny","brand:wikidata":"Q284688","brand:wikipedia":"en:Penny (supermarket)",name:"Penny",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pick 'n Save":{name:"Pick 'n Save",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7371288"},addTags:{brand:"Pick 'n Save","brand:wikidata":"Q7371288","brand:wikipedia":"en:Roundy's",name:"Pick 'n Save",shop:"supermarket"},removeTags:{brand:"Pick 'n Save","brand:wikidata":"Q7371288","brand:wikipedia":"en:Roundy's",name:"Pick 'n Save",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pick n Pay":{name:"Pick n Pay",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7190735"},addTags:{brand:"Pick n Pay","brand:wikidata":"Q7190735","brand:wikipedia":"en:Pick n Pay Stores",name:"Pick n Pay",shop:"supermarket"},removeTags:{brand:"Pick n Pay","brand:wikidata":"Q7190735","brand:wikipedia":"en:Pick n Pay Stores",name:"Pick n Pay",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Piggly Wiggly":{name:"Piggly Wiggly",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3388303"},addTags:{brand:"Piggly Wiggly","brand:wikidata":"Q3388303","brand:wikipedia":"en:Piggly Wiggly",name:"Piggly Wiggly",shop:"supermarket"},removeTags:{brand:"Piggly Wiggly","brand:wikidata":"Q3388303","brand:wikipedia":"en:Piggly Wiggly",name:"Piggly Wiggly",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pingo Doce":{name:"Pingo Doce",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1575057"},addTags:{brand:"Pingo Doce","brand:wikidata":"Q1575057","brand:wikipedia":"en:Pingo Doce",name:"Pingo Doce",shop:"supermarket"},removeTags:{brand:"Pingo Doce","brand:wikidata":"Q1575057","brand:wikipedia":"en:Pingo Doce",name:"Pingo Doce",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Piotr i Paweł":{name:"Piotr i Paweł",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2096356"},addTags:{brand:"Piotr i Paweł","brand:wikidata":"Q2096356","brand:wikipedia":"en:Piotr i Paweł",name:"Piotr i Paweł",shop:"supermarket"},removeTags:{brand:"Piotr i Paweł","brand:wikidata":"Q2096356","brand:wikipedia":"en:Piotr i Paweł",name:"Piotr i Paweł",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Plaza Vea":{name:"Plaza Vea",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7203672"},addTags:{brand:"Plaza Vea","brand:wikidata":"Q7203672","brand:wikipedia":"en:Plaza Vea",name:"Plaza Vea",shop:"supermarket"},removeTags:{brand:"Plaza Vea","brand:wikidata":"Q7203672","brand:wikipedia":"en:Plaza Vea",name:"Plaza Vea",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Plodine":{name:"Plodine",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58040098"},addTags:{brand:"Plodine","brand:wikidata":"Q58040098",name:"Plodine",shop:"supermarket"},removeTags:{brand:"Plodine","brand:wikidata":"Q58040098",name:"Plodine",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Poiesz":{name:"Poiesz",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2521700"},addTags:{brand:"Poiesz","brand:wikidata":"Q2521700","brand:wikipedia":"nl:Poiesz Supermarkten",name:"Poiesz",shop:"supermarket"},removeTags:{brand:"Poiesz","brand:wikidata":"Q2521700","brand:wikipedia":"nl:Poiesz Supermarkten",name:"Poiesz",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Price Chopper (Kansas City)":{name:"Price Chopper (Kansas City)",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7242572"},addTags:{brand:"Price Chopper","brand:wikidata":"Q7242572","brand:wikipedia":"en:Price Chopper (supermarket)",name:"Price Chopper",shop:"supermarket"},removeTags:{brand:"Price Chopper","brand:wikidata":"Q7242572","brand:wikipedia":"en:Price Chopper (supermarket)",name:"Price Chopper",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Price Chopper (New York)":{name:"Price Chopper (New York)",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7242574"},addTags:{brand:"Price Chopper","brand:wikidata":"Q7242574","brand:wikipedia":"en:Price Chopper Supermarkets",name:"Price Chopper",shop:"supermarket"},removeTags:{brand:"Price Chopper","brand:wikidata":"Q7242574","brand:wikipedia":"en:Price Chopper Supermarkets",name:"Price Chopper",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Profi":{name:"Profi",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q956664"},addTags:{brand:"Profi","brand:wikidata":"Q956664","brand:wikipedia":"en:Profi",name:"Profi",shop:"supermarket"},removeTags:{brand:"Profi","brand:wikidata":"Q956664","brand:wikipedia":"en:Profi",name:"Profi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Provigo":{name:"Provigo",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3408306"},addTags:{brand:"Provigo","brand:wikidata":"Q3408306","brand:wikipedia":"en:Provigo",name:"Provigo",shop:"supermarket"},removeTags:{brand:"Provigo","brand:wikidata":"Q3408306","brand:wikipedia":"en:Provigo",name:"Provigo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Proxi":{name:"Proxi",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3408522"},addTags:{brand:"Proxi","brand:wikidata":"Q3408522","brand:wikipedia":"fr:Proxi",name:"Proxi",shop:"supermarket"},removeTags:{brand:"Proxi","brand:wikidata":"Q3408522","brand:wikipedia":"fr:Proxi",name:"Proxi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Proxy Delhaize":{name:"Proxy Delhaize",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q14903417"},addTags:{brand:"Proxy Delhaize","brand:wikidata":"Q14903417","brand:wikipedia":"en:Delhaize Group",name:"Proxy Delhaize",shop:"supermarket"},removeTags:{brand:"Proxy Delhaize","brand:wikidata":"Q14903417","brand:wikipedia":"en:Delhaize Group",name:"Proxy Delhaize",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Publix":{name:"Publix",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q672170"},addTags:{brand:"Publix","brand:wikidata":"Q672170","brand:wikipedia":"en:Publix",name:"Publix",shop:"supermarket"},removeTags:{brand:"Publix","brand:wikidata":"Q672170","brand:wikipedia":"en:Publix",name:"Publix",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Punto Simply":{name:"Punto Simply",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3484790"},addTags:{brand:"Punto Simply","brand:wikidata":"Q3484790","brand:wikipedia":"it:Simply Market",name:"Punto Simply",shop:"supermarket"},removeTags:{brand:"Punto Simply","brand:wikidata":"Q3484790","brand:wikipedia":"it:Simply Market",name:"Punto Simply",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Puregold":{name:"Puregold",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7261170"},addTags:{brand:"Puregold","brand:wikidata":"Q7261170","brand:wikipedia":"en:Puregold",name:"Puregold",shop:"supermarket"},removeTags:{brand:"Puregold","brand:wikidata":"Q7261170","brand:wikipedia":"en:Puregold",name:"Puregold",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pão de Açúcar":{name:"Pão de Açúcar",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3411543"},addTags:{brand:"Pão de Açúcar","brand:wikidata":"Q3411543","brand:wikipedia":"pt:Pão de Açúcar (supermercado brasileiro)",name:"Pão de Açúcar",shop:"supermarket"},removeTags:{brand:"Pão de Açúcar","brand:wikidata":"Q3411543","brand:wikipedia":"pt:Pão de Açúcar (supermercado brasileiro)",name:"Pão de Açúcar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/QFC":{name:"QFC",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7265425"},addTags:{brand:"QFC","brand:wikidata":"Q7265425","brand:wikipedia":"en:QFC",name:"QFC",shop:"supermarket"},removeTags:{brand:"QFC","brand:wikidata":"Q7265425","brand:wikipedia":"en:QFC",name:"QFC",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ralphs":{name:"Ralphs",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3929820"},addTags:{brand:"Ralphs","brand:wikidata":"Q3929820","brand:wikipedia":"en:Ralphs",name:"Ralphs",shop:"supermarket"},removeTags:{brand:"Ralphs","brand:wikidata":"Q3929820","brand:wikipedia":"en:Ralphs",name:"Ralphs",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Real":{name:"Real",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q698473"},addTags:{brand:"Real","brand:wikidata":"Q698473","brand:wikipedia":"en:Real (hypermarket)",name:"Real",shop:"supermarket"},removeTags:{brand:"Real","brand:wikidata":"Q698473","brand:wikipedia":"en:Real (hypermarket)",name:"Real",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Real Canadian Superstore":{name:"Real Canadian Superstore",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7300856"},addTags:{brand:"Real Canadian Superstore","brand:wikidata":"Q7300856","brand:wikipedia":"en:Real Canadian Superstore",name:"Real Canadian Superstore",shop:"supermarket"},removeTags:{brand:"Real Canadian Superstore","brand:wikidata":"Q7300856","brand:wikipedia":"en:Real Canadian Superstore",name:"Real Canadian Superstore",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Redner's Markets":{name:"Redner's Markets",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7306166"},addTags:{brand:"Redner's Markets","brand:wikidata":"Q7306166","brand:wikipedia":"en:Redner's Markets",name:"Redner's Markets",shop:"supermarket"},removeTags:{brand:"Redner's Markets","brand:wikidata":"Q7306166","brand:wikipedia":"en:Redner's Markets",name:"Redner's Markets",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Reliance Fresh":{name:"Reliance Fresh",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7311014"},addTags:{brand:"Reliance Fresh","brand:wikidata":"Q7311014","brand:wikipedia":"en:Reliance Fresh",name:"Reliance Fresh",shop:"supermarket"},removeTags:{brand:"Reliance Fresh","brand:wikidata":"Q7311014","brand:wikipedia":"en:Reliance Fresh",name:"Reliance Fresh",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Rema 1000":{name:"Rema 1000",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q28459"},addTags:{brand:"Rema 1000","brand:wikidata":"Q28459","brand:wikipedia":"en:REMA 1000",name:"Rema 1000",shop:"supermarket"},removeTags:{brand:"Rema 1000","brand:wikidata":"Q28459","brand:wikipedia":"en:REMA 1000",name:"Rema 1000",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Rewe":{name:"Rewe",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16968817"},addTags:{brand:"Rewe","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe",shop:"supermarket"},removeTags:{brand:"Rewe","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Rewe City":{name:"Rewe City",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16968817"},addTags:{brand:"Rewe City","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe City",shop:"supermarket"},removeTags:{brand:"Rewe City","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe City",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Rimi":{name:"Rimi",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7334456"},addTags:{brand:"Rimi","brand:wikidata":"Q7334456","brand:wikipedia":"en:Rimi (Norway)",name:"Rimi",shop:"supermarket"},removeTags:{brand:"Rimi","brand:wikidata":"Q7334456","brand:wikipedia":"en:Rimi (Norway)",name:"Rimi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/S-Market":{name:"S-Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11891613"},addTags:{brand:"S-Market","brand:wikidata":"Q11891613","brand:wikipedia":"fi:S-market",name:"S-Market",shop:"supermarket"},removeTags:{brand:"S-Market","brand:wikidata":"Q11891613","brand:wikipedia":"fi:S-market",name:"S-Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Safeway":{name:"Safeway",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1508234"},addTags:{brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway",shop:"supermarket"},removeTags:{brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Sainsbury's":{name:"Sainsbury's",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q152096"},addTags:{brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's",shop:"supermarket"},removeTags:{brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Santa Isabel":{name:"Santa Isabel",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7419620"},addTags:{brand:"Santa Isabel","brand:wikidata":"Q7419620","brand:wikipedia":"es:Santa Isabel (supermercado)",name:"Santa Isabel",shop:"supermarket"},removeTags:{brand:"Santa Isabel","brand:wikidata":"Q7419620","brand:wikipedia":"es:Santa Isabel (supermercado)",name:"Santa Isabel",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Save-A-Lot":{name:"Save-A-Lot",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7427972"},addTags:{brand:"Save-A-Lot","brand:wikidata":"Q7427972","brand:wikipedia":"en:Save-A-Lot",name:"Save-A-Lot",shop:"supermarket"},removeTags:{brand:"Save-A-Lot","brand:wikidata":"Q7427972","brand:wikipedia":"en:Save-A-Lot",name:"Save-A-Lot",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Schnucks":{name:"Schnucks",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7431920"},addTags:{brand:"Schnucks","brand:wikidata":"Q7431920","brand:wikipedia":"en:Schnucks",name:"Schnucks",shop:"supermarket"},removeTags:{brand:"Schnucks","brand:wikidata":"Q7431920","brand:wikipedia":"en:Schnucks",name:"Schnucks",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Shaw's":{name:"Shaw's",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q578387"},addTags:{brand:"Shaw's","brand:wikidata":"Q578387","brand:wikipedia":"en:Shaw's and Star Market",name:"Shaw's",shop:"supermarket"},removeTags:{brand:"Shaw's","brand:wikidata":"Q578387","brand:wikipedia":"en:Shaw's and Star Market",name:"Shaw's",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ShopRite":{name:"ShopRite",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7501097"},addTags:{brand:"ShopRite","brand:wikidata":"Q7501097","brand:wikipedia":"en:ShopRite (United States)",name:"ShopRite",shop:"supermarket"},removeTags:{brand:"ShopRite","brand:wikidata":"Q7501097","brand:wikipedia":"en:ShopRite (United States)",name:"ShopRite",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Shoprite":{name:"Shoprite",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1857639"},addTags:{brand:"Shoprite","brand:wikidata":"Q1857639","brand:wikipedia":"en:ShopRite (South Africa)",name:"Shoprite",shop:"supermarket"},removeTags:{brand:"Shoprite","brand:wikidata":"Q1857639","brand:wikipedia":"en:ShopRite (South Africa)",name:"Shoprite",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Sigma":{name:"Sigma",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3977979"},addTags:{brand:"Sigma","brand:wikidata":"Q3977979","brand:wikipedia":"it:Supermercati Sigma",name:"Sigma",shop:"supermarket"},removeTags:{brand:"Sigma","brand:wikidata":"Q3977979","brand:wikipedia":"it:Supermercati Sigma",name:"Sigma",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Simply Market":{name:"Simply Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3484790"},addTags:{brand:"Simply Market","brand:wikidata":"Q3484790","brand:wikipedia":"en:Simply Market",name:"Simply Market",shop:"supermarket"},removeTags:{brand:"Simply Market","brand:wikidata":"Q3484790","brand:wikipedia":"en:Simply Market",name:"Simply Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Sky":{name:"Sky",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1129779"},addTags:{name:"Sky",brand:"Sky","brand:wikipedia":"de:Coop eG","brand:wikidata":"Q1129779",shop:"supermarket"},removeTags:{name:"Sky",brand:"Sky","brand:wikipedia":"de:Coop eG","brand:wikidata":"Q1129779",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Smith's":{name:"Smith's",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7544856"},addTags:{brand:"Smith's","brand:wikidata":"Q7544856","brand:wikipedia":"en:Smith's Food and Drug",name:"Smith's",shop:"supermarket"},removeTags:{brand:"Smith's","brand:wikidata":"Q7544856","brand:wikipedia":"en:Smith's Food and Drug",name:"Smith's",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Sobeys":{name:"Sobeys",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1143340"},addTags:{brand:"Sobeys","brand:wikidata":"Q1143340","brand:wikipedia":"en:Sobeys",name:"Sobeys",shop:"supermarket"},removeTags:{brand:"Sobeys","brand:wikidata":"Q1143340","brand:wikipedia":"en:Sobeys",name:"Sobeys",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Soriana":{name:"Soriana",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q735562"},addTags:{brand:"Soriana","brand:wikidata":"Q735562","brand:wikipedia":"en:Soriana",name:"Soriana",shop:"supermarket"},removeTags:{brand:"Soriana","brand:wikidata":"Q735562","brand:wikipedia":"en:Soriana",name:"Soriana",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Spar":{name:"Spar",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q610492"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"supermarket"},removeTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Społem":{name:"Społem",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11826043"},addTags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"supermarket"},removeTags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Sprouts Farmers Market":{name:"Sprouts Farmers Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7581369"},addTags:{brand:"Sprouts Farmers Market","brand:wikidata":"Q7581369","brand:wikipedia":"en:Sprouts Farmers Market",name:"Sprouts Farmers Market",shop:"supermarket"},removeTags:{brand:"Sprouts Farmers Market","brand:wikidata":"Q7581369","brand:wikipedia":"en:Sprouts Farmers Market",name:"Sprouts Farmers Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Stater Bros.":{name:"Stater Bros.",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7604016"},addTags:{brand:"Stater Bros.","brand:wikidata":"Q7604016","brand:wikipedia":"en:Stater Bros.",name:"Stater Bros.",shop:"supermarket"},removeTags:{brand:"Stater Bros.","brand:wikidata":"Q7604016","brand:wikipedia":"en:Stater Bros.",name:"Stater Bros.",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Stokrotka":{name:"Stokrotka",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q9345945"},addTags:{brand:"Stokrotka","brand:wikidata":"Q9345945","brand:wikipedia":"en:Stokrotka",name:"Stokrotka",shop:"supermarket"},removeTags:{brand:"Stokrotka","brand:wikidata":"Q9345945","brand:wikipedia":"en:Stokrotka",name:"Stokrotka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Stop & Shop":{name:"Stop & Shop",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3658429"},addTags:{brand:"Stop & Shop","brand:wikidata":"Q3658429","brand:wikipedia":"en:Stop & Shop",name:"Stop & Shop",shop:"supermarket"},removeTags:{brand:"Stop & Shop","brand:wikidata":"Q3658429","brand:wikipedia":"en:Stop & Shop",name:"Stop & Shop",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Suma":{name:"Suma",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58012362"},addTags:{brand:"Suma","brand:wikidata":"Q58012362",name:"Suma",shop:"supermarket"},removeTags:{brand:"Suma","brand:wikidata":"Q58012362",name:"Suma",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Super C":{name:"Super C",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3504127"},addTags:{brand:"Super C","brand:wikidata":"Q3504127","brand:wikipedia":"en:Super C (supermarket)",name:"Super C",shop:"supermarket"},removeTags:{brand:"Super C","brand:wikidata":"Q3504127","brand:wikipedia":"en:Super C (supermarket)",name:"Super C",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Super U":{name:"Super U",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2529029"},addTags:{brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U",shop:"supermarket"},removeTags:{brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/SuperBrugsen":{name:"SuperBrugsen",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12337746"},addTags:{brand:"SuperBrugsen","brand:wikidata":"Q12337746","brand:wikipedia":"en:SuperBrugsen",name:"SuperBrugsen",shop:"supermarket"},removeTags:{brand:"SuperBrugsen","brand:wikidata":"Q12337746","brand:wikipedia":"en:SuperBrugsen",name:"SuperBrugsen",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/SuperValu":{name:"SuperValu",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7642081"},addTags:{brand:"SuperValu","brand:wikidata":"Q7642081","brand:wikipedia":"en:SuperValu (Ireland)`",name:"SuperValu",shop:"supermarket"},removeTags:{brand:"SuperValu","brand:wikidata":"Q7642081","brand:wikipedia":"en:SuperValu (Ireland)`",name:"SuperValu",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Superama":{name:"Superama",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6135762"},addTags:{brand:"Superama","brand:wikidata":"Q6135762","brand:wikipedia":"es:Superama",name:"Superama",shop:"supermarket"},removeTags:{brand:"Superama","brand:wikidata":"Q6135762","brand:wikipedia":"es:Superama",name:"Superama",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Superspar":{name:"Superspar",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q610492"},addTags:{brand:"Superspar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Superspar",shop:"supermarket"},removeTags:{brand:"Superspar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Superspar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tegut":{name:"Tegut",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1547993"},addTags:{brand:"Tegut","brand:wikidata":"Q1547993","brand:wikipedia":"en:Tegut",name:"Tegut",shop:"supermarket"},removeTags:{brand:"Tegut","brand:wikidata":"Q1547993","brand:wikipedia":"en:Tegut",name:"Tegut",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tesco":{name:"Tesco",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q487494"},addTags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"supermarket"},removeTags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tesco Express":{name:"Tesco Express",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q487494"},addTags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"supermarket"},removeTags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tesco Extra":{name:"Tesco Extra",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q25172225"},addTags:{brand:"Tesco Extra","brand:wikidata":"Q25172225","brand:wikipedia":"en:Tesco Extra",name:"Tesco Extra",shop:"supermarket"},removeTags:{brand:"Tesco Extra","brand:wikidata":"Q25172225","brand:wikipedia":"en:Tesco Extra",name:"Tesco Extra",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tesco Metro":{name:"Tesco Metro",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57551648"},addTags:{brand:"Tesco Metro","brand:wikidata":"Q57551648",name:"Tesco Metro",shop:"supermarket"},removeTags:{brand:"Tesco Metro","brand:wikidata":"Q57551648",name:"Tesco Metro",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/The Co-operative Food":{name:"The Co-operative Food",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3277439"},addTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"supermarket"},removeTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/The Fresh Market":{name:"The Fresh Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7735265"},addTags:{brand:"The Fresh Market","brand:wikidata":"Q7735265","brand:wikipedia":"en:The Fresh Market",name:"The Fresh Market",shop:"supermarket"},removeTags:{brand:"The Fresh Market","brand:wikidata":"Q7735265","brand:wikipedia":"en:The Fresh Market",name:"The Fresh Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Todis":{name:"Todis",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3992174"},addTags:{brand:"Todis","brand:wikidata":"Q3992174","brand:wikipedia":"it:Todis",name:"Todis",shop:"supermarket"},removeTags:{brand:"Todis","brand:wikidata":"Q3992174","brand:wikipedia":"it:Todis",name:"Todis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tommy":{name:"Tommy",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12643718"},addTags:{brand:"Tommy","brand:wikidata":"Q12643718","brand:wikipedia":"hr:Tommy",name:"Tommy",shop:"supermarket"},removeTags:{brand:"Tommy","brand:wikidata":"Q12643718","brand:wikipedia":"hr:Tommy",name:"Tommy",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tops":{name:"Tops",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7825137"},addTags:{brand:"Tops","brand:wikidata":"Q7825137","brand:wikipedia":"en:Tops Friendly Markets",name:"Tops",shop:"supermarket"},removeTags:{brand:"Tops","brand:wikidata":"Q7825137","brand:wikipedia":"en:Tops Friendly Markets",name:"Tops",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tottus":{name:"Tottus",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7828510"},addTags:{brand:"Tottus","brand:wikidata":"Q7828510","brand:wikipedia":"en:Tottus",name:"Tottus",shop:"supermarket"},removeTags:{brand:"Tottus","brand:wikidata":"Q7828510","brand:wikipedia":"en:Tottus",name:"Tottus",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Trader Joe's":{name:"Trader Joe's",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q688825"},addTags:{brand:"Trader Joe's","brand:wikidata":"Q688825","brand:wikipedia":"en:Trader Joe's",name:"Trader Joe's",shop:"supermarket"},removeTags:{brand:"Trader Joe's","brand:wikidata":"Q688825","brand:wikipedia":"en:Trader Joe's",name:"Trader Joe's",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Treff 3000":{name:"Treff 3000",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q701755"},addTags:{brand:"Treff 3000","brand:wikidata":"Q701755","brand:wikipedia":"de:Edeka",name:"Treff 3000",shop:"supermarket"},removeTags:{brand:"Treff 3000","brand:wikidata":"Q701755","brand:wikipedia":"de:Edeka",name:"Treff 3000",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tuodì":{name:"Tuodì",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3706995"},addTags:{brand:"Tuodì","brand:wikidata":"Q3706995","brand:wikipedia":"it:Tuodì",name:"Tuodì",shop:"supermarket"},removeTags:{brand:"Tuodì","brand:wikidata":"Q3706995","brand:wikipedia":"it:Tuodì",name:"Tuodì",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/U Express":{name:"U Express",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2529029"},addTags:{brand:"U Express","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"U Express",shop:"supermarket"},removeTags:{brand:"U Express","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"U Express",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Unimarc":{name:"Unimarc",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6156244"},addTags:{brand:"Unimarc","brand:wikidata":"Q6156244","brand:wikipedia":"es:Unimarc",name:"Unimarc",shop:"supermarket"},removeTags:{brand:"Unimarc","brand:wikidata":"Q6156244","brand:wikipedia":"es:Unimarc",name:"Unimarc",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Unimarkt":{name:"Unimarkt",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1169599"},addTags:{brand:"Unimarkt","brand:wikidata":"Q1169599","brand:wikipedia":"de:Unimarkt",name:"Unimarkt",shop:"supermarket"},removeTags:{brand:"Unimarkt","brand:wikidata":"Q1169599","brand:wikipedia":"de:Unimarkt",name:"Unimarkt",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Vea":{name:"Vea",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5858167"},addTags:{brand:"Vea","brand:wikidata":"Q5858167","brand:wikipedia":"es:Vea (supermercado)",name:"Vea",shop:"supermarket"},removeTags:{brand:"Vea","brand:wikidata":"Q5858167","brand:wikipedia":"es:Vea (supermercado)",name:"Vea",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/VinMart":{name:"VinMart",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q60245505"},addTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart",shop:"supermarket"},removeTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Vomar":{name:"Vomar",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3202837"},addTags:{brand:"Vomar","brand:wikidata":"Q3202837","brand:wikipedia":"nl:Vomar",name:"Vomar",shop:"supermarket"},removeTags:{brand:"Vomar","brand:wikidata":"Q3202837","brand:wikipedia":"nl:Vomar",name:"Vomar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Vons":{name:"Vons",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7941609"},addTags:{brand:"Vons","brand:wikidata":"Q7941609","brand:wikipedia":"en:Vons",name:"Vons",shop:"supermarket"},removeTags:{brand:"Vons","brand:wikidata":"Q7941609","brand:wikipedia":"en:Vons",name:"Vons",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Waitrose":{name:"Waitrose",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q771734"},addTags:{brand:"Waitrose","brand:wikidata":"Q771734","brand:wikipedia":"en:Waitrose",name:"Waitrose",shop:"supermarket"},removeTags:{brand:"Waitrose","brand:wikidata":"Q771734","brand:wikipedia":"en:Waitrose",name:"Waitrose",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Walmart Neighborhood Market":{name:"Walmart Neighborhood Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q483551"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Neighborhood Market",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"},removeTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Neighborhood Market",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Walmart Supercenter":{name:"Walmart Supercenter",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q483551"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Supercenter",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"},removeTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Supercenter",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Wasgau":{name:"Wasgau",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2536857"},addTags:{brand:"Wasgau","brand:wikidata":"Q2536857","brand:wikipedia":"de:Wasgau (Unternehmen)",name:"Wasgau",shop:"supermarket"},removeTags:{brand:"Wasgau","brand:wikidata":"Q2536857","brand:wikipedia":"de:Wasgau (Unternehmen)",name:"Wasgau",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Wegmans":{name:"Wegmans",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11288478"},addTags:{brand:"Wegmans","brand:wikidata":"Q11288478","brand:wikipedia":"en:Wegmans",name:"Wegmans",shop:"supermarket"},removeTags:{brand:"Wegmans","brand:wikidata":"Q11288478","brand:wikipedia":"en:Wegmans",name:"Wegmans",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Weis":{name:"Weis",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7980370"},addTags:{brand:"Weis","brand:wikidata":"Q7980370","brand:wikipedia":"en:Weis Markets",name:"Weis",shop:"supermarket"},removeTags:{brand:"Weis","brand:wikidata":"Q7980370","brand:wikipedia":"en:Weis Markets",name:"Weis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Whole Foods Market":{name:"Whole Foods Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1809448"},addTags:{brand:"Whole Foods Market","brand:wikidata":"Q1809448","brand:wikipedia":"en:Whole Foods Market",name:"Whole Foods Market",shop:"supermarket"},removeTags:{brand:"Whole Foods Market","brand:wikidata":"Q1809448","brand:wikipedia":"en:Whole Foods Market",name:"Whole Foods Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Willys":{name:"Willys",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q10720214"},addTags:{brand:"Willys","brand:wikidata":"Q10720214","brand:wikipedia":"sv:Willys",name:"Willys",shop:"supermarket"},removeTags:{brand:"Willys","brand:wikidata":"Q10720214","brand:wikipedia":"sv:Willys",name:"Willys",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/WinCo Foods":{name:"WinCo Foods",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q8023592"},addTags:{brand:"WinCo Foods","brand:wikidata":"Q8023592","brand:wikipedia":"en:WinCo Foods",name:"WinCo Foods",shop:"supermarket"},removeTags:{brand:"WinCo Foods","brand:wikidata":"Q8023592","brand:wikipedia":"en:WinCo Foods",name:"WinCo Foods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Winn Dixie":{name:"Winn Dixie",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1264366"},addTags:{brand:"Winn Dixie","brand:wikidata":"Q1264366","brand:wikipedia":"en:Winn-Dixie",name:"Winn Dixie",shop:"supermarket"},removeTags:{brand:"Winn Dixie","brand:wikidata":"Q1264366","brand:wikipedia":"en:Winn-Dixie",name:"Winn Dixie",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Woolworths":{name:"Woolworths",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3249145"},addTags:{brand:"Woolworths","brand:wikidata":"Q3249145","brand:wikipedia":"en:Woolworths Supermarkets",name:"Woolworths",shop:"supermarket"},removeTags:{brand:"Woolworths","brand:wikidata":"Q3249145","brand:wikipedia":"en:Woolworths Supermarkets",name:"Woolworths",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Your Independent Grocer":{name:"Your Independent Grocer",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q8058833"},addTags:{brand:"Your Independent Grocer","brand:wikidata":"Q8058833","brand:wikipedia":"en:Your Independent Grocer",name:"Your Independent Grocer",shop:"supermarket"},removeTags:{brand:"Your Independent Grocer","brand:wikidata":"Q8058833","brand:wikipedia":"en:Your Independent Grocer",name:"Your Independent Grocer",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/denn's Biomarkt":{name:"denn's Biomarkt",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q48883773"},addTags:{brand:"denn's Biomarkt","brand:wikidata":"Q48883773","brand:wikipedia":"de:Dennree",name:"denn's Biomarkt",shop:"supermarket"},removeTags:{brand:"denn's Biomarkt","brand:wikidata":"Q48883773","brand:wikipedia":"de:Dennree",name:"denn's Biomarkt",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/fakta":{name:"fakta",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3172238"},addTags:{brand:"fakta","brand:wikidata":"Q3172238","brand:wikipedia":"en:Fakta",name:"fakta",shop:"supermarket"},removeTags:{brand:"fakta","brand:wikidata":"Q3172238","brand:wikipedia":"en:Fakta",name:"fakta",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Şok":{name:"Şok",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q19613992"},addTags:{brand:"Şok","brand:wikidata":"Q19613992","brand:wikipedia":"tr:Şok (market)",name:"Şok",shop:"supermarket"},removeTags:{brand:"Şok","brand:wikidata":"Q19613992","brand:wikipedia":"tr:Şok (market)",name:"Şok",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ΑΒ Βασιλόπουλος":{name:"ΑΒ Βασιλόπουλος",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4721807"},addTags:{brand:"ΑΒ Βασιλόπουλος","brand:en":"AB Vassilopoulos","brand:wikidata":"Q4721807","brand:wikipedia":"el:Άλφα Βήτα Βασιλόπουλος",name:"ΑΒ Βασιλόπουλος","name:en":"AB Vassilopoulos",shop:"supermarket"},removeTags:{brand:"ΑΒ Βασιλόπουλος","brand:en":"AB Vassilopoulos","brand:wikidata":"Q4721807","brand:wikipedia":"el:Άλφα Βήτα Βασιλόπουλος",name:"ΑΒ Βασιλόπουλος","name:en":"AB Vassilopoulos",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Γαλαξίας":{name:"Γαλαξίας",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5518063"},addTags:{brand:"Γαλαξίας","brand:en":"Galaxias","brand:wikidata":"Q5518063","brand:wikipedia":"el:Γαλαξίας (σούπερ μάρκετ)",name:"Γαλαξίας","name:en":"Galaxias",shop:"supermarket"},removeTags:{brand:"Γαλαξίας","brand:en":"Galaxias","brand:wikidata":"Q5518063","brand:wikipedia":"el:Γαλαξίας (σούπερ μάρκετ)",name:"Γαλαξίας","name:en":"Galaxias",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Μασούτης":{name:"Μασούτης",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6783887"},addTags:{brand:"Μασούτης","brand:en":"Masoutis","brand:wikidata":"Q6783887","brand:wikipedia":"en:Masoutis",name:"Μασούτης","name:en":"Masoutis",shop:"supermarket"},removeTags:{brand:"Μασούτης","brand:en":"Masoutis","brand:wikidata":"Q6783887","brand:wikipedia":"en:Masoutis",name:"Μασούτης","name:en":"Masoutis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Σκλαβενίτης":{name:"Σκλαβενίτης",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7536037"},addTags:{brand:"Σκλαβενίτης","brand:en":"Sklavenitis","brand:wikidata":"Q7536037","brand:wikipedia":"el:Σκλαβενίτης",name:"Σκλαβενίτης","name:en":"Sklavenitis",shop:"supermarket"},removeTags:{brand:"Σκλαβενίτης","brand:en":"Sklavenitis","brand:wikidata":"Q7536037","brand:wikipedia":"el:Σκλαβενίτης",name:"Σκλαβενίτης","name:en":"Sklavenitis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Азбука Вкуса":{name:"Азбука Вкуса",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4058209"},addTags:{brand:"Азбука Вкуса","brand:en":"Azbuka Vkusa","brand:wikidata":"Q4058209","brand:wikipedia":"en:Azbuka Vkusa",name:"Азбука Вкуса","name:en":"Azbuka Vkusa",shop:"supermarket"},removeTags:{brand:"Азбука Вкуса","brand:en":"Azbuka Vkusa","brand:wikidata":"Q4058209","brand:wikipedia":"en:Azbuka Vkusa",name:"Азбука Вкуса","name:en":"Azbuka Vkusa",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Атак":{name:"Атак",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2868738"},addTags:{brand:"Атак","brand:en":"Atac","brand:wikidata":"Q2868738","brand:wikipedia":"ru:Atac",name:"Атак","name:en":"Atac",shop:"supermarket"},removeTags:{brand:"Атак","brand:en":"Atac","brand:wikidata":"Q2868738","brand:wikipedia":"ru:Atac",name:"Атак","name:en":"Atac",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ашан":{name:"Ашан",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q758603"},addTags:{brand:"Ашан","brand:en":"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"ru:Auchan",name:"Ашан","name:en":"Auchan",shop:"supermarket"},removeTags:{brand:"Ашан","brand:en":"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"ru:Auchan",name:"Ашан","name:en":"Auchan",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Брусничка":{name:"Брусничка",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q21656645"},addTags:{brand:"Брусничка","brand:en":"Brusnichka","brand:wikidata":"Q21656645","brand:wikipedia":"uk:Брусничка (торгова мережа)",name:"Брусничка","name:en":"Brusnichka",shop:"supermarket"},removeTags:{brand:"Брусничка","brand:en":"Brusnichka","brand:wikidata":"Q21656645","brand:wikipedia":"uk:Брусничка (торгова мережа)",name:"Брусничка","name:en":"Brusnichka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Виктория":{name:"Виктория",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4111046"},addTags:{brand:"Виктория","brand:wikidata":"Q4111046","brand:wikipedia":"ru:Виктория (сеть магазинов)",name:"Виктория",shop:"supermarket"},removeTags:{brand:"Виктория","brand:wikidata":"Q4111046","brand:wikipedia":"ru:Виктория (сеть магазинов)",name:"Виктория",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Вопак":{name:"Вопак",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q30966107"},addTags:{brand:"Вопак","brand:en":"Vopak","brand:wikidata":"Q30966107","brand:wikipedia":"uk:Вопак",name:"Вопак","name:en":"Vopak",shop:"supermarket"},removeTags:{brand:"Вопак","brand:en":"Vopak","brand:wikidata":"Q30966107","brand:wikipedia":"uk:Вопак",name:"Вопак","name:en":"Vopak",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Гулливер":{name:"Гулливер",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58003470"},addTags:{brand:"Гулливер","brand:wikidata":"Q58003470",name:"Гулливер",shop:"supermarket"},removeTags:{brand:"Гулливер","brand:wikidata":"Q58003470",name:"Гулливер",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Дикси":{name:"Дикси",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4161561"},addTags:{brand:"Дикси","brand:en":"Dixy","brand:wikidata":"Q4161561","brand:wikipedia":"ru:Дикси (сеть магазинов)",name:"Дикси",shop:"supermarket"},removeTags:{brand:"Дикси","brand:en":"Dixy","brand:wikidata":"Q4161561","brand:wikipedia":"ru:Дикси (сеть магазинов)",name:"Дикси",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Карусель":{name:"Карусель",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4216307"},addTags:{brand:"Карусель","brand:en":"Karusel","brand:wikidata":"Q4216307","brand:wikipedia":"ru:Карусель (сеть магазинов)",name:"Карусель","name:en":"Karusel",shop:"supermarket"},removeTags:{brand:"Карусель","brand:en":"Karusel","brand:wikidata":"Q4216307","brand:wikipedia":"ru:Карусель (сеть магазинов)",name:"Карусель","name:en":"Karusel",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Лента":{name:"Лента",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4258608"},addTags:{brand:"Лента","brand:en":"Lenta","brand:wikidata":"Q4258608","brand:wikipedia":"ru:Лента (сеть магазинов)",name:"Лента","name:en":"Lenta",shop:"supermarket"},removeTags:{brand:"Лента","brand:en":"Lenta","brand:wikidata":"Q4258608","brand:wikipedia":"ru:Лента (сеть магазинов)",name:"Лента","name:en":"Lenta",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Магнит":{name:"Магнит",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q940518"},addTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"supermarket"},removeTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Мария-Ра":{name:"Мария-Ра",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4281631"},addTags:{brand:"Мария-Ра","brand:en":"Maria-ra","brand:wikidata":"Q4281631","brand:wikipedia":"ru:Мария-Ра",name:"Мария-Ра","name:en":"Maria-ra",shop:"supermarket"},removeTags:{brand:"Мария-Ра","brand:en":"Maria-ra","brand:wikidata":"Q4281631","brand:wikipedia":"ru:Мария-Ра",name:"Мария-Ра","name:en":"Maria-ra",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Монетка":{name:"Монетка",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4301704"},addTags:{brand:"Монетка","brand:en":"Monetka","brand:wikidata":"Q4301704","brand:wikipedia":"ru:Монетка (сеть магазинов)",name:"Монетка","name:en":"Monetka",shop:"supermarket"},removeTags:{brand:"Монетка","brand:en":"Monetka","brand:wikidata":"Q4301704","brand:wikipedia":"ru:Монетка (сеть магазинов)",name:"Монетка","name:en":"Monetka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Народная 7Я семьЯ":{name:"Народная 7Я семьЯ",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4032436"},addTags:{brand:"Народная 7Я семьЯ","brand:en":"People's 7th Family","brand:wikidata":"Q4032436","brand:wikipedia":"ru:Народная 7Я семья",name:"Народная 7Я семьЯ","name:en":"People's 7th Family",shop:"supermarket"},removeTags:{brand:"Народная 7Я семьЯ","brand:en":"People's 7th Family","brand:wikidata":"Q4032436","brand:wikipedia":"ru:Народная 7Я семья",name:"Народная 7Я семьЯ","name:en":"People's 7th Family",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Перекрёсток":{name:"Перекрёсток",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1684639"},addTags:{brand:"Перекрёсток","brand:en":"Perekryostok","brand:wikidata":"Q1684639","brand:wikipedia":"en:Perekrestok (supermarket chain)",name:"Перекрёсток",shop:"supermarket"},removeTags:{brand:"Перекрёсток","brand:en":"Perekryostok","brand:wikidata":"Q1684639","brand:wikipedia":"en:Perekrestok (supermarket chain)",name:"Перекрёсток",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Покупочка":{name:"Покупочка",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58003270"},addTags:{brand:"Покупочка","brand:wikidata":"Q58003270",name:"Покупочка",shop:"supermarket"},removeTags:{brand:"Покупочка","brand:wikidata":"Q58003270",name:"Покупочка",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Полушка":{name:"Полушка",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4371080"},addTags:{brand:"Полушка","brand:en":"Polushka","brand:wikidata":"Q4371080","brand:wikipedia":"ru:Полушка (сеть магазинов)",name:"Полушка","name:en":"Polushka",shop:"supermarket"},removeTags:{brand:"Полушка","brand:en":"Polushka","brand:wikidata":"Q4371080","brand:wikipedia":"ru:Полушка (сеть магазинов)",name:"Полушка","name:en":"Polushka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Пятёрочка":{name:"Пятёрочка",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1768969"},addTags:{brand:"Пятёрочка","brand:en":"Pyaterochka","brand:wikidata":"Q1768969","brand:wikipedia":"ru:Пятёрочка",name:"Пятёрочка","name:en":"Pyaterochka",shop:"supermarket"},removeTags:{brand:"Пятёрочка","brand:en":"Pyaterochka","brand:wikidata":"Q1768969","brand:wikipedia":"ru:Пятёрочка",name:"Пятёрочка","name:en":"Pyaterochka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Радеж":{name:"Радеж",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4387165"},addTags:{brand:"Радеж","brand:en":"Radezh","brand:wikidata":"Q4387165","brand:wikipedia":"ru:Радеж (торговая сеть)",name:"Радеж","name:en":"Radezh",shop:"supermarket"},removeTags:{brand:"Радеж","brand:en":"Radezh","brand:wikidata":"Q4387165","brand:wikipedia":"ru:Радеж (торговая сеть)",name:"Радеж","name:en":"Radezh",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Рукавичка":{name:"Рукавичка",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q20092568"},addTags:{brand:"Рукавичка","brand:en":"Rukavychka","brand:wikidata":"Q20092568","brand:wikipedia":"uk:Рукавичка (торгова мережа)",name:"Рукавичка","name:en":"Rukavychka",shop:"supermarket"},removeTags:{brand:"Рукавичка","brand:en":"Rukavychka","brand:wikidata":"Q20092568","brand:wikipedia":"uk:Рукавичка (торгова мережа)",name:"Рукавичка","name:en":"Rukavychka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Семишагофф":{name:"Семишагофф",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58003374"},addTags:{brand:"Семишагофф","brand:wikidata":"Q58003374",name:"Семишагофф",shop:"supermarket"},removeTags:{brand:"Семишагофф","brand:wikidata":"Q58003374",name:"Семишагофф",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Сільпо":{name:"Сільпо",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4419434"},addTags:{brand:"Сільпо","brand:en":"Silpo","brand:wikidata":"Q4419434","brand:wikipedia":"en:Silpo",name:"Сільпо","name:en":"Silpo",shop:"supermarket"},removeTags:{brand:"Сільпо","brand:en":"Silpo","brand:wikidata":"Q4419434","brand:wikipedia":"en:Silpo",name:"Сільпо","name:en":"Silpo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Фора":{name:"Фора",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12165977"},addTags:{brand:"Фора","brand:en":"Fora","brand:wikidata":"Q12165977","brand:wikipedia":"uk:Фора (мережа магазинів)",name:"Фора","name:en":"Fora",shop:"supermarket"},removeTags:{brand:"Фора","brand:en":"Fora","brand:wikidata":"Q12165977","brand:wikipedia":"uk:Фора (мережа магазинів)",name:"Фора","name:en":"Fora",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Фуршет":{name:"Фуршет",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4493564"},addTags:{brand:"Фуршет","brand:en":"Furshet","brand:wikidata":"Q4493564","brand:wikipedia":"uk:Фуршет (мережа супермаркетів)",name:"Фуршет","name:en":"Furshet",shop:"supermarket"},removeTags:{brand:"Фуршет","brand:en":"Furshet","brand:wikidata":"Q4493564","brand:wikipedia":"uk:Фуршет (мережа супермаркетів)",name:"Фуршет","name:en":"Furshet",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Эдельвейс":{name:"Эдельвейс",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57979368"},addTags:{brand:"Эдельвейс","brand:en":"Edelveis","brand:wikidata":"Q57979368",name:"Эдельвейс","name:en":"Edelveis",shop:"supermarket"},removeTags:{brand:"Эдельвейс","brand:en":"Edelveis","brand:wikidata":"Q57979368",name:"Эдельвейс","name:en":"Edelveis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/いなげや":{name:"いなげや",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q17193392"},addTags:{brand:"いなげや","brand:en":"Inageya","brand:wikidata":"Q17193392","brand:wikipedia":"ja:いなげや",name:"いなげや","name:en":"Inageya",shop:"supermarket"},removeTags:{brand:"いなげや","brand:en":"Inageya","brand:wikidata":"Q17193392","brand:wikipedia":"ja:いなげや",name:"いなげや","name:en":"Inageya",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/まいばすけっと":{name:"まいばすけっと",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11278154"},addTags:{brand:"まいばすけっと","brand:en":"My Basket","brand:wikidata":"Q11278154","brand:wikipedia":"ja:まいばすけっと",name:"まいばすけっと","name:en":"My Basket",shop:"supermarket"},removeTags:{brand:"まいばすけっと","brand:en":"My Basket","brand:wikidata":"Q11278154","brand:wikipedia":"ja:まいばすけっと",name:"まいばすけっと","name:en":"My Basket",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/イオン":{name:"イオン",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11285951"},addTags:{brand:"イオン","brand:en":"AEON","brand:wikidata":"Q11285951","brand:wikipedia":"ja:イオン (店舗ブランド)",name:"イオン","name:en":"AEON",shop:"supermarket"},removeTags:{brand:"イオン","brand:en":"AEON","brand:wikidata":"Q11285951","brand:wikipedia":"ja:イオン (店舗ブランド)",name:"イオン","name:en":"AEON",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/イトーヨーカドー":{name:"イトーヨーカドー",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3088746"},addTags:{brand:"イトーヨーカドー","brand:en":"Ito-Yokado","brand:wikidata":"Q3088746","brand:wikipedia":"en:Ito-Yokado",name:"イトーヨーカドー","name:en":"Ito-Yokado",shop:"supermarket"},removeTags:{brand:"イトーヨーカドー","brand:en":"Ito-Yokado","brand:wikidata":"Q3088746","brand:wikipedia":"en:Ito-Yokado",name:"イトーヨーカドー","name:en":"Ito-Yokado",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/カスミ":{name:"カスミ",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11294160"},addTags:{brand:"カスミ","brand:en":"Kasumi","brand:wikidata":"Q11294160","brand:wikipedia":"ja:カスミ",name:"カスミ","name:en":"Kasumi",shop:"supermarket"},removeTags:{brand:"カスミ","brand:en":"Kasumi","brand:wikidata":"Q11294160","brand:wikipedia":"ja:カスミ",name:"カスミ","name:en":"Kasumi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/バロー":{name:"バロー",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11328346"},addTags:{brand:"バロー","brand:en":"Valor","brand:wikidata":"Q11328346","brand:wikipedia":"ja:バロー (チェーンストア)",name:"バロー","name:en":"Valor",shop:"supermarket"},removeTags:{brand:"バロー","brand:en":"Valor","brand:wikidata":"Q11328346","brand:wikipedia":"ja:バロー (チェーンストア)",name:"バロー","name:en":"Valor",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/マックスバリュ":{name:"マックスバリュ",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1960109"},addTags:{brand:"マックスバリュ","brand:en":"Maxvalu Tokai","brand:wikidata":"Q1960109","brand:wikipedia":"en:MaxValu",name:"マックスバリュ","name:en":"Maxvalu Tokai",shop:"supermarket"},removeTags:{brand:"マックスバリュ","brand:en":"Maxvalu Tokai","brand:wikidata":"Q1960109","brand:wikipedia":"en:MaxValu",name:"マックスバリュ","name:en":"Maxvalu Tokai",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/マルエツ":{name:"マルエツ",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11341197"},addTags:{brand:"マルエツ","brand:en":"Maruetsu","brand:wikidata":"Q11341197","brand:wikipedia":"ja:マルエツ",name:"マルエツ","name:en":"Maruetsu",shop:"supermarket"},removeTags:{brand:"マルエツ","brand:en":"Maruetsu","brand:wikidata":"Q11341197","brand:wikipedia":"ja:マルエツ",name:"マルエツ","name:en":"Maruetsu",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ヤオコー":{name:"ヤオコー",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11344967"},addTags:{brand:"ヤオコー","brand:en":"Yaoko","brand:wikidata":"Q11344967","brand:wikipedia":"ja:ヤオコー",name:"ヤオコー","name:en":"Yaoko",shop:"supermarket"},removeTags:{brand:"ヤオコー","brand:en":"Yaoko","brand:wikidata":"Q11344967","brand:wikipedia":"ja:ヤオコー",name:"ヤオコー","name:en":"Yaoko",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ヨークベニマル":{name:"ヨークベニマル",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11346199"},addTags:{brand:"ヨークベニマル","brand:en":"York Benimaru","brand:wikidata":"Q11346199","brand:wikipedia":"ja:ヨークベニマル",name:"ヨークベニマル","name:en":"York Benimaru",shop:"supermarket"},removeTags:{brand:"ヨークベニマル","brand:en":"York Benimaru","brand:wikidata":"Q11346199","brand:wikipedia":"ja:ヨークベニマル",name:"ヨークベニマル","name:en":"York Benimaru",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ライフ":{name:"ライフ",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11346476"},addTags:{brand:"ライフ","brand:en":"Life","brand:wikidata":"Q11346476","brand:wikipedia":"ja:ライフコーポレーション",name:"ライフ","name:en":"Life",shop:"supermarket"},removeTags:{brand:"ライフ","brand:en":"Life","brand:wikidata":"Q11346476","brand:wikipedia":"ja:ライフコーポレーション",name:"ライフ","name:en":"Life",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/全聯":{name:"全聯",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7262792"},addTags:{brand:"全聯","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯","name:en":"Pxmart",shop:"supermarket"},removeTags:{brand:"全聯","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯","name:en":"Pxmart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/全聯福利中心":{name:"全聯福利中心",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7262792"},addTags:{brand:"全聯福利中心","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯福利中心","name:en":"Pxmart",shop:"supermarket"},removeTags:{brand:"全聯福利中心","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯福利中心","name:en":"Pxmart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/惠康 Wellcome":{name:"惠康 Wellcome",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q706247"},addTags:{brand:"惠康 Wellcome","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"zh:惠康",name:"惠康 Wellcome","name:en":"Wellcome",shop:"supermarket"},removeTags:{brand:"惠康 Wellcome","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"zh:惠康",name:"惠康 Wellcome","name:en":"Wellcome",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/業務スーパー":{name:"業務スーパー",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11590183"},addTags:{brand:"業務スーパー","brand:en":"Gyōmu sūpā","brand:wikidata":"Q11590183","brand:wikipedia":"ja:業務スーパー",name:"業務スーパー","name:en":"Gyōmu sūpā",shop:"supermarket"},removeTags:{brand:"業務スーパー","brand:en":"Gyōmu sūpā","brand:wikidata":"Q11590183","brand:wikipedia":"ja:業務スーパー",name:"業務スーパー","name:en":"Gyōmu sūpā",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/美廉社":{name:"美廉社",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q15914017"},addTags:{brand:"美廉社","brand:en":"Simple Mart","brand:wikidata":"Q15914017","brand:wikipedia":"zh:美廉社",name:"美廉社","name:en":"Simple Mart",shop:"supermarket"},removeTags:{brand:"美廉社","brand:en":"Simple Mart","brand:wikidata":"Q15914017","brand:wikipedia":"zh:美廉社",name:"美廉社","name:en":"Simple Mart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/西友":{name:"西友",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3108542"},addTags:{brand:"西友","brand:en":"Seiyu Group","brand:wikidata":"Q3108542","brand:wikipedia":"en:Seiyu Group",name:"西友","name:en":"Seiyu Group",shop:"supermarket"},removeTags:{brand:"西友","brand:en":"Seiyu Group","brand:wikidata":"Q3108542","brand:wikipedia":"en:Seiyu Group",name:"西友","name:en":"Seiyu Group",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/頂好":{name:"頂好",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q706247"},addTags:{brand:"頂好","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好","name:en":"Wellcome",shop:"supermarket"},removeTags:{brand:"頂好","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好","name:en":"Wellcome",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/頂好超市":{name:"頂好超市",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q706247"},addTags:{brand:"頂好超市","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好超市","name:en":"Wellcome",shop:"supermarket"},removeTags:{brand:"頂好超市","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好超市","name:en":"Wellcome",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/하나로마트":{name:"하나로마트",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12590611"},addTags:{brand:"하나로마트","brand:en":"Hanaro Mart","brand:wikidata":"Q12590611","brand:wikipedia":"ko:농협유통",name:"하나로마트",shop:"supermarket"},removeTags:{brand:"하나로마트","brand:en":"Hanaro Mart","brand:wikidata":"Q12590611","brand:wikipedia":"ko:농협유통",name:"하나로마트",shop:"supermarket"},matchScore:2,suggestion:true},"shop/tea/T2":{name:"T2",icon:"maki-teahouse",geometry:["point","area"],tags:{shop:"tea","brand:wikidata":"Q48802134"},addTags:{brand:"T2","brand:wikidata":"Q48802134","brand:wikipedia":"en:T2 (Australian company)",name:"T2",shop:"tea"},removeTags:{brand:"T2","brand:wikidata":"Q48802134","brand:wikipedia":"en:T2 (Australian company)",name:"T2",shop:"tea"},matchScore:2,suggestion:true},"shop/ticket/Boutique Grandes Lignes":{name:"Boutique Grandes Lignes",icon:"maki-shop",geometry:["point","area"],tags:{shop:"ticket","brand:wikidata":"Q13646"},addTags:{brand:"Boutique Grandes Lignes","brand:wikidata":"Q13646","brand:wikipedia":"fr:Société nationale des chemins de fer français",name:"Boutique Grandes Lignes",shop:"ticket"},removeTags:{brand:"Boutique Grandes Lignes","brand:wikidata":"Q13646","brand:wikipedia":"fr:Société nationale des chemins de fer français",name:"Boutique Grandes Lignes",shop:"ticket"},matchScore:2,suggestion:true},"shop/ticket/Guichet Transilien":{name:"Guichet Transilien",icon:"maki-shop",geometry:["point","area"],tags:{shop:"ticket","brand:wikidata":"Q389554"},addTags:{brand:"Guichet Transilien","brand:wikidata":"Q389554","brand:wikipedia":"fr:Transilien",name:"Guichet Transilien",shop:"ticket"},removeTags:{brand:"Guichet Transilien","brand:wikidata":"Q389554","brand:wikipedia":"fr:Transilien",name:"Guichet Transilien",shop:"ticket"},matchScore:2,suggestion:true},"shop/toys/Dráčik":{name:"Dráčik",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q57653669"},addTags:{brand:"Dráčik","brand:wikidata":"Q57653669",name:"Dráčik",shop:"toys"},removeTags:{brand:"Dráčik","brand:wikidata":"Q57653669",name:"Dráčik",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Intertoys":{name:"Intertoys",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q1891407"},addTags:{brand:"Intertoys","brand:wikidata":"Q1891407","brand:wikipedia":"nl:Intertoys",name:"Intertoys",shop:"toys"},removeTags:{brand:"Intertoys","brand:wikidata":"Q1891407","brand:wikipedia":"nl:Intertoys",name:"Intertoys",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/JouéClub":{name:"JouéClub",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q3187152"},addTags:{brand:"JouéClub","brand:wikidata":"Q3187152","brand:wikipedia":"fr:JouéClub",name:"JouéClub",shop:"toys"},removeTags:{brand:"JouéClub","brand:wikidata":"Q3187152","brand:wikipedia":"fr:JouéClub",name:"JouéClub",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/King Jouet":{name:"King Jouet",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q3197009"},addTags:{brand:"King Jouet","brand:en":"King Toy","brand:wikidata":"Q3197009","brand:wikipedia":"fr:King Jouet",name:"King Jouet","name:en":"King Toy",shop:"toys"},removeTags:{brand:"King Jouet","brand:en":"King Toy","brand:wikidata":"Q3197009","brand:wikipedia":"fr:King Jouet",name:"King Jouet","name:en":"King Toy",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/La Grande Récré":{name:"La Grande Récré",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q3209556"},addTags:{brand:"La Grande Récré","brand:wikidata":"Q3209556","brand:wikipedia":"fr:La Grande Récré (magasin)",name:"La Grande Récré",shop:"toys"},removeTags:{brand:"La Grande Récré","brand:wikidata":"Q3209556","brand:wikipedia":"fr:La Grande Récré (magasin)",name:"La Grande Récré",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Lego":{name:"Lego",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q1063455"},addTags:{brand:"Lego","brand:wikidata":"Q1063455","brand:wikipedia":"en:The Lego Group",name:"Lego",shop:"toys"},removeTags:{brand:"Lego","brand:wikidata":"Q1063455","brand:wikipedia":"en:The Lego Group",name:"Lego",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Lekia":{name:"Lekia",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q56303274"},addTags:{brand:"Lekia","brand:wikidata":"Q56303274","brand:wikipedia":"sv:Lekia",name:"Lekia",shop:"toys"},removeTags:{brand:"Lekia","brand:wikidata":"Q56303274","brand:wikipedia":"sv:Lekia",name:"Lekia",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Maxi Toys":{name:"Maxi Toys",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q16663879"},addTags:{brand:"Maxi Toys","brand:wikidata":"Q16663879","brand:wikipedia":"fr:Maxi Toys",name:"Maxi Toys",shop:"toys"},removeTags:{brand:"Maxi Toys","brand:wikidata":"Q16663879","brand:wikipedia":"fr:Maxi Toys",name:"Maxi Toys",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/The Entertainer":{name:"The Entertainer",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q7732289"},addTags:{brand:"The Entertainer","brand:wikidata":"Q7732289","brand:wikipedia":"en:The Entertainer (retailer)",name:"The Entertainer",shop:"toys"},removeTags:{brand:"The Entertainer","brand:wikidata":"Q7732289","brand:wikipedia":"en:The Entertainer (retailer)",name:"The Entertainer",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Toys R Us":{name:"Toys R Us",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q696334"},addTags:{brand:"Toys R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Toys R Us",shop:"toys"},removeTags:{brand:"Toys R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Toys R Us",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Детский мир":{name:"Детский мир",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q16643324"},addTags:{brand:"Детский мир","brand:en":"Detskiy Mir","brand:wikidata":"Q16643324","brand:wikipedia":"en:Detsky Mir",name:"Детский мир","name:en":"Detskiy Mir",shop:"toys"},removeTags:{brand:"Детский мир","brand:en":"Detskiy Mir","brand:wikidata":"Q16643324","brand:wikipedia":"en:Detsky Mir",name:"Детский мир","name:en":"Detskiy Mir",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Кораблик":{name:"Кораблик",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q57653416"},addTags:{brand:"Кораблик","brand:wikidata":"Q57653416",name:"Кораблик",shop:"toys"},removeTags:{brand:"Кораблик","brand:wikidata":"Q57653416",name:"Кораблик",shop:"toys"},matchScore:2,suggestion:true},"shop/travel_agency/Coral Travel":{name:"Coral Travel",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q58011479"},addTags:{brand:"Coral Travel","brand:wikidata":"Q58011479",name:"Coral Travel",shop:"travel_agency"},removeTags:{brand:"Coral Travel","brand:wikidata":"Q58011479",name:"Coral Travel",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/D-reizen":{name:"D-reizen",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q2445498"},addTags:{brand:"D-reizen","brand:wikidata":"Q2445498","brand:wikipedia":"nl:D-reizen",name:"D-reizen",shop:"travel_agency"},removeTags:{brand:"D-reizen","brand:wikidata":"Q2445498","brand:wikipedia":"nl:D-reizen",name:"D-reizen",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/DER Reisebüro":{name:"DER Reisebüro",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q56729186"},addTags:{brand:"DER Reisebüro","brand:wikidata":"Q56729186","brand:wikipedia":"de:Deutsches Reisebüro",name:"DER Reisebüro",shop:"travel_agency"},removeTags:{brand:"DER Reisebüro","brand:wikidata":"Q56729186","brand:wikipedia":"de:Deutsches Reisebüro",name:"DER Reisebüro",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/First Reisebüro":{name:"First Reisebüro",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q573103"},addTags:{brand:"First Reisebüro","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"First Reisebüro",shop:"travel_agency"},removeTags:{brand:"First Reisebüro","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"First Reisebüro",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Flight Centre":{name:"Flight Centre",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q5459202"},addTags:{brand:"Flight Centre","brand:wikidata":"Q5459202","brand:wikipedia":"en:Flight Centre",name:"Flight Centre",shop:"travel_agency"},removeTags:{brand:"Flight Centre","brand:wikidata":"Q5459202","brand:wikipedia":"en:Flight Centre",name:"Flight Centre",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Halcón Viajes":{name:"Halcón Viajes",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q57591939"},addTags:{brand:"Halcón Viajes","brand:wikidata":"Q57591939",name:"Halcón Viajes",shop:"travel_agency"},removeTags:{brand:"Halcón Viajes","brand:wikidata":"Q57591939",name:"Halcón Viajes",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Havas Voyages":{name:"Havas Voyages",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q57628091"},addTags:{brand:"Havas Voyages","brand:wikidata":"Q57628091",name:"Havas Voyages",shop:"travel_agency"},removeTags:{brand:"Havas Voyages","brand:wikidata":"Q57628091",name:"Havas Voyages",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Reiseland":{name:"Reiseland",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q40387610"},addTags:{brand:"Reiseland","brand:wikidata":"Q40387610","brand:wikipedia":"de:OTTO Reisen",name:"Reiseland",shop:"travel_agency"},removeTags:{brand:"Reiseland","brand:wikidata":"Q40387610","brand:wikipedia":"de:OTTO Reisen",name:"Reiseland",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/TUI":{name:"TUI",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q573103"},addTags:{brand:"TUI","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"TUI",shop:"travel_agency"},removeTags:{brand:"TUI","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"TUI",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/The Co-operative Travel":{name:"The Co-operative Travel",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q7726526"},addTags:{brand:"The Co-operative Travel","brand:wikidata":"Q7726526","brand:wikipedia":"en:The Co-operative Travel",name:"The Co-operative Travel",shop:"travel_agency"},removeTags:{brand:"The Co-operative Travel","brand:wikidata":"Q7726526","brand:wikipedia":"en:The Co-operative Travel",name:"The Co-operative Travel",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Thomas Cook":{name:"Thomas Cook",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q2141800"},addTags:{brand:"Thomas Cook","brand:wikidata":"Q2141800","brand:wikipedia":"en:Thomas Cook Group",name:"Thomas Cook",shop:"travel_agency"},removeTags:{brand:"Thomas Cook","brand:wikidata":"Q2141800","brand:wikipedia":"en:Thomas Cook Group",name:"Thomas Cook",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Thomson":{name:"Thomson",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q7795876"},addTags:{brand:"Thomson","brand:wikidata":"Q7795876","brand:wikipedia":"en:TUI UK",name:"Thomson",shop:"travel_agency"},removeTags:{brand:"Thomson","brand:wikidata":"Q7795876","brand:wikipedia":"en:TUI UK",name:"Thomson",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Поехали с нами":{name:"Поехали с нами",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q25439141"},addTags:{brand:"Поехали с нами","brand:wikidata":"Q25439141","brand:wikipedia":"uk:Поїхали з нами",name:"Поехали с нами",shop:"travel_agency"},removeTags:{brand:"Поехали с нами","brand:wikidata":"Q25439141","brand:wikipedia":"uk:Поїхали з нами",name:"Поехали с нами",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/tyres/Big O Tires":{name:"Big O Tires",icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q4906085"},addTags:{brand:"Big O Tires","brand:wikidata":"Q4906085","brand:wikipedia":"en:Big O Tires",name:"Big O Tires",shop:"tyres"},removeTags:{brand:"Big O Tires","brand:wikidata":"Q4906085","brand:wikipedia":"en:Big O Tires",name:"Big O Tires",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Bridgestone":{name:"Bridgestone",icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q179433"},addTags:{brand:"Bridgestone","brand:wikidata":"Q179433","brand:wikipedia":"en:Bridgestone",name:"Bridgestone",shop:"tyres"},removeTags:{brand:"Bridgestone","brand:wikidata":"Q179433","brand:wikipedia":"en:Bridgestone",name:"Bridgestone",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Discount Tire":{name:"Discount Tire",icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q5281735"},addTags:{brand:"Discount Tire","brand:wikidata":"Q5281735","brand:wikipedia":"en:Discount Tire",name:"Discount Tire",shop:"tyres"},removeTags:{brand:"Discount Tire","brand:wikidata":"Q5281735","brand:wikipedia":"en:Discount Tire",name:"Discount Tire",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Express Oil Change & Tire Engineers":{name:"Express Oil Change & Tire Engineers",icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q39057654"},addTags:{brand:"Express Oil Change & Tire Engineers","brand:wikidata":"Q39057654","brand:wikipedia":"en:Express Oil Change & Tire Engineers",name:"Express Oil Change & Tire Engineers",shop:"tyres"},removeTags:{brand:"Express Oil Change & Tire Engineers","brand:wikidata":"Q39057654","brand:wikipedia":"en:Express Oil Change & Tire Engineers",name:"Express Oil Change & Tire Engineers",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Les Schwab Tire Center":{name:"Les Schwab Tire Center",icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q6529977"},addTags:{brand:"Les Schwab Tire Center","brand:wikidata":"Q6529977","brand:wikipedia":"en:Les Schwab Tire Centers",name:"Les Schwab Tire Center",shop:"tyres"},removeTags:{brand:"Les Schwab Tire Center","brand:wikidata":"Q6529977","brand:wikipedia":"en:Les Schwab Tire Centers",name:"Les Schwab Tire Center",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Michelin":{name:"Michelin",icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q151107"},addTags:{brand:"Michelin","brand:wikidata":"Q151107","brand:wikipedia":"en:Michelin",name:"Michelin",shop:"tyres"},removeTags:{brand:"Michelin","brand:wikidata":"Q151107","brand:wikipedia":"en:Michelin",name:"Michelin",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Vianor":{name:"Vianor",icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q10714920"},addTags:{brand:"Vianor","brand:wikidata":"Q10714920","brand:wikipedia":"sv:Vianor",name:"Vianor",shop:"tyres"},removeTags:{brand:"Vianor","brand:wikidata":"Q10714920","brand:wikipedia":"sv:Vianor",name:"Vianor",shop:"tyres"},matchScore:2,suggestion:true},"shop/variety_store/Action":{name:"Action",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q2634111"},addTags:{brand:"Action","brand:wikidata":"Q2634111","brand:wikipedia":"nl:Action (winkel)",name:"Action",shop:"variety_store"},removeTags:{brand:"Action","brand:wikidata":"Q2634111","brand:wikipedia":"nl:Action (winkel)",name:"Action",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Big Bazaar":{name:"Big Bazaar",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q3631008"},addTags:{brand:"Big Bazaar","brand:wikidata":"Q3631008","brand:wikipedia":"en:Big Bazaar",name:"Big Bazaar",shop:"variety_store"},removeTags:{brand:"Big Bazaar","brand:wikidata":"Q3631008","brand:wikipedia":"en:Big Bazaar",name:"Big Bazaar",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Big Bazar":{name:"Big Bazar",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q15873104"},addTags:{brand:"Big Bazar","brand:wikidata":"Q15873104","brand:wikipedia":"nl:Big Bazar",name:"Big Bazar",shop:"variety_store"},removeTags:{brand:"Big Bazar","brand:wikidata":"Q15873104","brand:wikipedia":"nl:Big Bazar",name:"Big Bazar",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Dollar General":{name:"Dollar General",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q145168"},addTags:{brand:"Dollar General","brand:wikidata":"Q145168","brand:wikipedia":"en:Dollar General",name:"Dollar General",shop:"variety_store"},removeTags:{brand:"Dollar General","brand:wikidata":"Q145168","brand:wikipedia":"en:Dollar General",name:"Dollar General",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Dollar Tree":{name:"Dollar Tree",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q5289230"},addTags:{brand:"Dollar Tree","brand:wikidata":"Q5289230","brand:wikipedia":"en:Dollar Tree",name:"Dollar Tree",shop:"variety_store"},removeTags:{brand:"Dollar Tree","brand:wikidata":"Q5289230","brand:wikipedia":"en:Dollar Tree",name:"Dollar Tree",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Dollarama":{name:"Dollarama",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q3033947"},addTags:{brand:"Dollarama","brand:wikidata":"Q3033947","brand:wikipedia":"en:Dollarama",name:"Dollarama",shop:"variety_store"},removeTags:{brand:"Dollarama","brand:wikidata":"Q3033947","brand:wikipedia":"en:Dollarama",name:"Dollarama",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Family Dollar":{name:"Family Dollar",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q5433101"},addTags:{brand:"Family Dollar","brand:wikidata":"Q5433101","brand:wikipedia":"en:Family Dollar",name:"Family Dollar",shop:"variety_store"},removeTags:{brand:"Family Dollar","brand:wikidata":"Q5433101","brand:wikipedia":"en:Family Dollar",name:"Family Dollar",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Five Below":{name:"Five Below",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q5455836"},addTags:{brand:"Five Below","brand:wikidata":"Q5455836","brand:wikipedia":"en:Five Below",name:"Five Below",shop:"variety_store"},removeTags:{brand:"Five Below","brand:wikidata":"Q5455836","brand:wikipedia":"en:Five Below",name:"Five Below",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Fix Price":{name:"Fix Price",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q4038791"},addTags:{brand:"Fix Price","brand:wikidata":"Q4038791","brand:wikipedia":"ru:Fix Price (сеть магазинов)",name:"Fix Price",shop:"variety_store"},removeTags:{brand:"Fix Price","brand:wikidata":"Q4038791","brand:wikipedia":"ru:Fix Price (сеть магазинов)",name:"Fix Price",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/GiFi":{name:"GiFi",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q3105439"},addTags:{brand:"GiFi","brand:wikidata":"Q3105439","brand:wikipedia":"fr:Gifi",name:"GiFi",shop:"variety_store"},removeTags:{brand:"GiFi","brand:wikidata":"Q3105439","brand:wikipedia":"fr:Gifi",name:"GiFi",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Home Bargains":{name:"Home Bargains",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q5888229"},addTags:{brand:"Home Bargains","brand:wikidata":"Q5888229","brand:wikipedia":"en:Home Bargains",name:"Home Bargains",shop:"variety_store"},removeTags:{brand:"Home Bargains","brand:wikidata":"Q5888229","brand:wikipedia":"en:Home Bargains",name:"Home Bargains",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Mäc-Geiz":{name:"Mäc-Geiz",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q1957126"},addTags:{brand:"Mäc-Geiz","brand:wikidata":"Q1957126","brand:wikipedia":"de:Mäc-Geiz",name:"Mäc-Geiz",shop:"variety_store"},removeTags:{brand:"Mäc-Geiz","brand:wikidata":"Q1957126","brand:wikipedia":"de:Mäc-Geiz",name:"Mäc-Geiz",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/NOZ":{name:"NOZ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q3345688"},addTags:{brand:"NOZ","brand:wikidata":"Q3345688","brand:wikipedia":"fr:Noz",name:"NOZ",shop:"variety_store"},removeTags:{brand:"NOZ","brand:wikidata":"Q3345688","brand:wikipedia":"fr:Noz",name:"NOZ",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Poundland":{name:"Poundland",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q1434528"},addTags:{brand:"Poundland","brand:wikidata":"Q1434528","brand:wikipedia":"en:Poundland",name:"Poundland",shop:"variety_store"},removeTags:{brand:"Poundland","brand:wikidata":"Q1434528","brand:wikipedia":"en:Poundland",name:"Poundland",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Poundstretcher":{name:"Poundstretcher",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q7235675"},addTags:{brand:"Poundstretcher","brand:wikidata":"Q7235675","brand:wikipedia":"en:Poundstretcher",name:"Poundstretcher",shop:"variety_store"},removeTags:{brand:"Poundstretcher","brand:wikidata":"Q7235675","brand:wikipedia":"en:Poundstretcher",name:"Poundstretcher",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Poundworld":{name:"Poundworld",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q16967516"},addTags:{brand:"Poundworld","brand:wikidata":"Q16967516","brand:wikipedia":"en:Poundworld",name:"Poundworld",shop:"variety_store"},removeTags:{brand:"Poundworld","brand:wikidata":"Q16967516","brand:wikipedia":"en:Poundworld",name:"Poundworld",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/TEDi":{name:"TEDi",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q1364603"},addTags:{brand:"TEDi","brand:wikidata":"Q1364603","brand:wikipedia":"de:TEDi",name:"TEDi",shop:"variety_store"},removeTags:{brand:"TEDi","brand:wikidata":"Q1364603","brand:wikipedia":"de:TEDi",name:"TEDi",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Tokmanni":{name:"Tokmanni",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q13423470"},addTags:{name:"Tokmanni",brand:"Tokmanni","brand:wikidata":"Q13423470","brand:wikipedia":"fi:Tokmanni",shop:"variety_store"},removeTags:{name:"Tokmanni",brand:"Tokmanni","brand:wikidata":"Q13423470","brand:wikipedia":"fi:Tokmanni",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Wilko":{name:"Wilko",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q8002536"},addTags:{brand:"Wilko","brand:wikidata":"Q8002536","brand:wikipedia":"en:Wilko (retailer)",name:"Wilko",shop:"variety_store"},removeTags:{brand:"Wilko","brand:wikidata":"Q8002536","brand:wikipedia":"en:Wilko (retailer)",name:"Wilko",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/キャンドゥ":{name:"キャンドゥ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q11297367"},addTags:{brand:"キャンドゥ","brand:en":"CAN DO","brand:wikidata":"Q11297367","brand:wikipedia":"ja:キャンドゥ",name:"キャンドゥ","name:en":"CAN DO",shop:"variety_store"},removeTags:{brand:"キャンドゥ","brand:en":"CAN DO","brand:wikidata":"Q11297367","brand:wikipedia":"ja:キャンドゥ",name:"キャンドゥ","name:en":"CAN DO",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/セリア":{name:"セリア",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q11314509"},addTags:{brand:"セリア","brand:en":"Seria","brand:wikidata":"Q11314509","brand:wikipedia":"ja:セリア (100円ショップ)",name:"セリア","name:en":"Seria",shop:"variety_store"},removeTags:{brand:"セリア","brand:en":"Seria","brand:wikidata":"Q11314509","brand:wikipedia":"ja:セリア (100円ショップ)",name:"セリア","name:en":"Seria",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/ダイソー":{name:"ダイソー",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q866991"},addTags:{brand:"ダイソー","brand:en":"Daiso","brand:wikidata":"Q866991","brand:wikipedia":"ja:大創産業",name:"ダイソー","name:en":"Daiso",shop:"variety_store"},removeTags:{brand:"ダイソー","brand:en":"Daiso","brand:wikidata":"Q866991","brand:wikipedia":"ja:大創産業",name:"ダイソー","name:en":"Daiso",shop:"variety_store"},matchScore:2,suggestion:true},"shop/video_games/EB Games":{name:"EB Games",icon:"maki-gaming",geometry:["point","area"],tags:{shop:"video_games","brand:wikidata":"Q4993686"},addTags:{brand:"EB Games","brand:wikidata":"Q4993686","brand:wikipedia":"en:EB Games",name:"EB Games",shop:"video_games"},removeTags:{brand:"EB Games","brand:wikidata":"Q4993686","brand:wikipedia":"en:EB Games",name:"EB Games",shop:"video_games"},matchScore:2,suggestion:true},"shop/video_games/GameStop":{name:"GameStop",icon:"maki-gaming",geometry:["point","area"],tags:{shop:"video_games","brand:wikidata":"Q202210"},addTags:{brand:"GameStop","brand:wikidata":"Q202210","brand:wikipedia":"en:GameStop",name:"GameStop",shop:"video_games"},removeTags:{brand:"GameStop","brand:wikidata":"Q202210","brand:wikipedia":"en:GameStop",name:"GameStop",shop:"video_games"},matchScore:2,suggestion:true},"shop/video_games/Micromania":{name:"Micromania",icon:"maki-gaming",geometry:["point","area"],tags:{shop:"video_games","brand:wikidata":"Q3312221"},addTags:{brand:"Micromania","brand:wikidata":"Q3312221","brand:wikipedia":"en:Micromania (video game retailer)",name:"Micromania",shop:"video_games"},removeTags:{brand:"Micromania","brand:wikidata":"Q3312221","brand:wikipedia":"en:Micromania (video game retailer)",name:"Micromania",shop:"video_games"},matchScore:2,suggestion:true},"shop/video/Blockbuster":{name:"Blockbuster",icon:"temaki-movie_rental",geometry:["point","area"],tags:{shop:"video","brand:wikidata":"Q884711"},addTags:{brand:"Blockbuster","brand:wikidata":"Q884711","brand:wikipedia":"en:Blockbuster LLC",name:"Blockbuster",shop:"video"},removeTags:{brand:"Blockbuster","brand:wikidata":"Q884711","brand:wikipedia":"en:Blockbuster LLC",name:"Blockbuster",shop:"video"},matchScore:2,suggestion:true},"shop/video/Family Video":{name:"Family Video",icon:"temaki-movie_rental",geometry:["point","area"],tags:{shop:"video","brand:wikidata":"Q5433297"},addTags:{brand:"Family Video","brand:wikidata":"Q5433297","brand:wikipedia":"en:Family Video",name:"Family Video",shop:"video"},removeTags:{brand:"Family Video","brand:wikidata":"Q5433297","brand:wikipedia":"en:Family Video",name:"Family Video",shop:"video"},matchScore:2,suggestion:true},"shop/video/TSUTAYA":{name:"TSUTAYA",icon:"temaki-movie_rental",geometry:["point","area"],tags:{shop:"video","brand:wikidata":"Q5193457"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"video"},removeTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"video"},matchScore:2,suggestion:true},"shop/video/ゲオ":{name:"ゲオ",icon:"temaki-movie_rental",geometry:["point","area"],tags:{shop:"video","brand:wikidata":"Q5533938"},addTags:{brand:"GEO","brand:wikidata":"Q5533938","brand:wikipedia":"ja:ゲオ",name:"ゲオ",shop:"video"},removeTags:{brand:"GEO","brand:wikidata":"Q5533938","brand:wikipedia":"ja:ゲオ",name:"ゲオ",shop:"video"},matchScore:2,suggestion:true},"shop/watches/Swatch":{name:"Swatch",icon:"maki-watch",geometry:["point","area"],tags:{shop:"watches","brand:wikidata":"Q573422"},addTags:{brand:"Swatch","brand:wikidata":"Q573422","brand:wikipedia":"en:Swatch",name:"Swatch",shop:"watches"},removeTags:{brand:"Swatch","brand:wikidata":"Q573422","brand:wikipedia":"en:Swatch",name:"Swatch",shop:"watches"},matchScore:2,suggestion:true},"shop/wholesale/BJ's Wholesale Club":{name:"BJ's Wholesale Club",icon:"maki-warehouse",geometry:["point","area"],tags:{shop:"wholesale","brand:wikidata":"Q4835754"},addTags:{brand:"BJ's Wholesale Club","brand:wikidata":"Q4835754","brand:wikipedia":"en:BJ's Wholesale Club",name:"BJ's Wholesale Club",shop:"wholesale",operator:"BJ's Wholesale Club"},removeTags:{brand:"BJ's Wholesale Club","brand:wikidata":"Q4835754","brand:wikipedia":"en:BJ's Wholesale Club",name:"BJ's Wholesale Club",shop:"wholesale",operator:"BJ's Wholesale Club"},matchScore:2,suggestion:true},"shop/wholesale/Costco":{name:"Costco",icon:"maki-warehouse",geometry:["point","area"],tags:{shop:"wholesale","brand:wikidata":"Q715583"},addTags:{brand:"Costco","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco",shop:"wholesale",operator:"Costco"},removeTags:{brand:"Costco","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco",shop:"wholesale",operator:"Costco"},matchScore:2,suggestion:true},"shop/wholesale/Makro":{name:"Makro",icon:"maki-warehouse",geometry:["point","area"],tags:{shop:"wholesale","brand:wikidata":"Q704606"},addTags:{brand:"Makro","brand:wikidata":"Q704606","brand:wikipedia":"en:Makro",name:"Makro",shop:"wholesale"},removeTags:{brand:"Makro","brand:wikidata":"Q704606","brand:wikipedia":"en:Makro",name:"Makro",shop:"wholesale"},matchScore:2,suggestion:true},"shop/wholesale/Metro":{name:"Metro",icon:"maki-warehouse",geometry:["point","area"],tags:{shop:"wholesale","brand:wikidata":"Q13610282"},addTags:{brand:"Metro","brand:wikidata":"Q13610282","brand:wikipedia":"en:Metro Cash and Carry",name:"Metro",shop:"wholesale"},removeTags:{brand:"Metro","brand:wikidata":"Q13610282","brand:wikipedia":"en:Metro Cash and Carry",name:"Metro",shop:"wholesale"},matchScore:2,suggestion:true},"shop/wholesale/Sam's Club":{name:"Sam's Club",icon:"maki-warehouse",geometry:["point","area"],tags:{shop:"wholesale","brand:wikidata":"Q1972120"},addTags:{brand:"Sam's Club","brand:wikipedia":"en:Sam's Club","brand:wikidata":"Q1972120",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"wholesale"},removeTags:{brand:"Sam's Club","brand:wikipedia":"en:Sam's Club","brand:wikidata":"Q1972120",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"wholesale"},matchScore:2,suggestion:true},"tourism/hotel/B&B Hôtel":{name:"B&B Hôtel",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q794939"},addTags:{brand:"B&B Hôtel","brand:wikidata":"Q794939","brand:wikipedia":"en:B&B Hotels",name:"B&B Hôtel",tourism:"hotel"},removeTags:{brand:"B&B Hôtel","brand:wikidata":"Q794939","brand:wikipedia":"en:B&B Hotels",name:"B&B Hôtel",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Best Western":{name:"Best Western",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q830334"},addTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western",tourism:"hotel"},removeTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Best Western Plus":{name:"Best Western Plus",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q830334"},addTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western Plus",tourism:"hotel"},removeTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western Plus",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Campanile":{name:"Campanile",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q2412064"},addTags:{brand:"Campanile","brand:wikidata":"Q2412064","brand:wikipedia":"fr:Campanile (chaîne d'hôtels)",name:"Campanile",tourism:"hotel"},removeTags:{brand:"Campanile","brand:wikidata":"Q2412064","brand:wikipedia":"fr:Campanile (chaîne d'hôtels)",name:"Campanile",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Candlewood Suites":{name:"Candlewood Suites",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5032010"},addTags:{brand:"Candlewood Suites","brand:wikidata":"Q5032010","brand:wikipedia":"en:Candlewood Suites",name:"Candlewood Suites",tourism:"hotel"},removeTags:{brand:"Candlewood Suites","brand:wikidata":"Q5032010","brand:wikipedia":"en:Candlewood Suites",name:"Candlewood Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Comfort Inn":{name:"Comfort Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1075788"},addTags:{brand:"Comfort Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn",tourism:"hotel"},removeTags:{brand:"Comfort Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Comfort Inn & Suites":{name:"Comfort Inn & Suites",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1075788"},addTags:{brand:"Comfort Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn & Suites",tourism:"hotel"},removeTags:{brand:"Comfort Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn & Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Comfort Suites":{name:"Comfort Suites",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1075788"},addTags:{brand:"Comfort Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Suites",tourism:"hotel"},removeTags:{brand:"Comfort Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Country Inn & Suites":{name:"Country Inn & Suites",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5177332"},addTags:{brand:"Country Inn & Suites","brand:wikidata":"Q5177332","brand:wikipedia":"en:Country Inns & Suites",name:"Country Inn & Suites",tourism:"hotel"},removeTags:{brand:"Country Inn & Suites","brand:wikidata":"Q5177332","brand:wikipedia":"en:Country Inns & Suites",name:"Country Inn & Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Courtyard by Marriott":{name:"Courtyard by Marriott",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1053170"},addTags:{brand:"Courtyard by Marriott","brand:wikidata":"Q1053170","brand:wikipedia":"en:Courtyard by Marriott",name:"Courtyard by Marriott",tourism:"hotel"},removeTags:{brand:"Courtyard by Marriott","brand:wikidata":"Q1053170","brand:wikipedia":"en:Courtyard by Marriott",name:"Courtyard by Marriott",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Crowne Plaza":{name:"Crowne Plaza",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q2746220"},addTags:{brand:"Crowne Plaza","brand:wikidata":"Q2746220","brand:wikipedia":"en:Crowne Plaza",name:"Crowne Plaza",tourism:"hotel"},removeTags:{brand:"Crowne Plaza","brand:wikidata":"Q2746220","brand:wikipedia":"en:Crowne Plaza",name:"Crowne Plaza",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Days Inn":{name:"Days Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1047239"},addTags:{brand:"Days Inn","brand:wikidata":"Q1047239","brand:wikipedia":"en:Days Inn",name:"Days Inn",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},removeTags:{brand:"Days Inn","brand:wikidata":"Q1047239","brand:wikipedia":"en:Days Inn",name:"Days Inn",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Embassy Suites":{name:"Embassy Suites",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5369524"},addTags:{brand:"Embassy Suites","brand:wikidata":"Q5369524","brand:wikipedia":"en:Embassy Suites by Hilton",name:"Embassy Suites",tourism:"hotel"},removeTags:{brand:"Embassy Suites","brand:wikidata":"Q5369524","brand:wikipedia":"en:Embassy Suites by Hilton",name:"Embassy Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Extended Stay America":{name:"Extended Stay America",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5421850"},addTags:{brand:"Extended Stay America","brand:wikidata":"Q5421850","brand:wikipedia":"en:Extended Stay America",name:"Extended Stay America",tourism:"hotel"},removeTags:{brand:"Extended Stay America","brand:wikidata":"Q5421850","brand:wikipedia":"en:Extended Stay America",name:"Extended Stay America",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Fairfield Inn":{name:"Fairfield Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5430314"},addTags:{brand:"Fairfield Inn","brand:wikidata":"Q5430314","brand:wikipedia":"en:Fairfield Inn by Marriott",name:"Fairfield Inn",tourism:"hotel"},removeTags:{brand:"Fairfield Inn","brand:wikidata":"Q5430314","brand:wikipedia":"en:Fairfield Inn by Marriott",name:"Fairfield Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Formule 1":{name:"Formule 1",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1630895"},addTags:{brand:"Formule 1","brand:wikidata":"Q1630895","brand:wikipedia":"en:Hotel Formule 1",name:"Formule 1",tourism:"hotel"},removeTags:{brand:"Formule 1","brand:wikidata":"Q1630895","brand:wikipedia":"en:Hotel Formule 1",name:"Formule 1",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Grand Hyatt":{name:"Grand Hyatt",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1425063"},addTags:{brand:"Grand Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Grand Hyatt",operator:"Hyatt",tourism:"hotel"},removeTags:{brand:"Grand Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Grand Hyatt",operator:"Hyatt",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hampton Inn":{name:"Hampton Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5646230"},addTags:{brand:"Hampton Inn","brand:wikidata":"Q5646230","brand:wikipedia":"en:Hampton by Hilton",name:"Hampton Inn",tourism:"hotel"},removeTags:{brand:"Hampton Inn","brand:wikidata":"Q5646230","brand:wikipedia":"en:Hampton by Hilton",name:"Hampton Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hilton":{name:"Hilton",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q598884"},addTags:{brand:"Hilton","brand:wikidata":"Q598884","brand:wikipedia":"en:Hilton Hotels & Resorts",name:"Hilton",tourism:"hotel"},removeTags:{brand:"Hilton","brand:wikidata":"Q598884","brand:wikipedia":"en:Hilton Hotels & Resorts",name:"Hilton",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hilton Garden Inn":{name:"Hilton Garden Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1162859"},addTags:{brand:"Hilton Garden Inn","brand:wikidata":"Q1162859","brand:wikipedia":"en:Hilton Garden Inn",name:"Hilton Garden Inn",tourism:"hotel"},removeTags:{brand:"Hilton Garden Inn","brand:wikidata":"Q1162859","brand:wikipedia":"en:Hilton Garden Inn",name:"Hilton Garden Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn":{name:"Holiday Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q2717882"},addTags:{brand:"Holiday Inn","brand:wikidata":"Q2717882","brand:wikipedia":"en:Holiday Inn",name:"Holiday Inn",tourism:"hotel"},removeTags:{brand:"Holiday Inn","brand:wikidata":"Q2717882","brand:wikipedia":"en:Holiday Inn",name:"Holiday Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn Express":{name:"Holiday Inn Express",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5880423"},addTags:{brand:"Holiday Inn Express","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express",tourism:"hotel"},removeTags:{brand:"Holiday Inn Express","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn Express & Suites":{name:"Holiday Inn Express & Suites",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5880423"},addTags:{brand:"Holiday Inn Express & Suites","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express & Suites",tourism:"hotel"},removeTags:{brand:"Holiday Inn Express & Suites","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express & Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Homewood Suites":{name:"Homewood Suites",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5890701"},addTags:{brand:"Homewood Suites","brand:wikidata":"Q5890701","brand:wikipedia":"en:Homewood Suites by Hilton",name:"Homewood Suites",tourism:"hotel"},removeTags:{brand:"Homewood Suites","brand:wikidata":"Q5890701","brand:wikipedia":"en:Homewood Suites by Hilton",name:"Homewood Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hyatt":{name:"Hyatt",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1425063"},addTags:{brand:"Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt",operator:"Hyatt",tourism:"hotel"},removeTags:{brand:"Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt",operator:"Hyatt",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hyatt Centric":{name:"Hyatt Centric",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1425063"},addTags:{brand:"Hyatt Centric","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Centric",operator:"Hyatt",tourism:"hotel"},removeTags:{brand:"Hyatt Centric","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Centric",operator:"Hyatt",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hyatt House":{name:"Hyatt House",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1425063"},addTags:{brand:"Hyatt House","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt House",operator:"Hyatt",tourism:"hotel"},removeTags:{brand:"Hyatt House","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt House",operator:"Hyatt",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hyatt Place":{name:"Hyatt Place",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1425063"},addTags:{brand:"Hyatt Place","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Place",operator:"Hyatt",tourism:"hotel"},removeTags:{brand:"Hyatt Place","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Place",operator:"Hyatt",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hyatt Regency":{name:"Hyatt Regency",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1425063"},addTags:{brand:"Hyatt Regency","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Regency",operator:"Hyatt",tourism:"hotel"},removeTags:{brand:"Hyatt Regency","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Regency",operator:"Hyatt",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ibis":{name:"Ibis",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q920166"},addTags:{brand:"Ibis","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis",tourism:"hotel"},removeTags:{brand:"Ibis","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ibis Budget":{name:"Ibis Budget",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1458135"},addTags:{brand:"Ibis Budget","brand:wikidata":"Q1458135","brand:wikipedia":"en:Ibis Budget",name:"Ibis Budget",tourism:"hotel"},removeTags:{brand:"Ibis Budget","brand:wikidata":"Q1458135","brand:wikipedia":"en:Ibis Budget",name:"Ibis Budget",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ibis Hotel":{name:"Ibis Hotel",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q920166"},addTags:{brand:"Ibis Hotel","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis Hotel",tourism:"hotel"},removeTags:{brand:"Ibis Hotel","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis Hotel",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ibis Styles":{name:"Ibis Styles",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q3147425"},addTags:{brand:"Ibis Styles","brand:wikidata":"Q3147425","brand:wikipedia":"en:Ibis Styles",name:"Ibis Styles",tourism:"hotel"},removeTags:{brand:"Ibis Styles","brand:wikidata":"Q3147425","brand:wikipedia":"en:Ibis Styles",name:"Ibis Styles",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Kyriad":{name:"Kyriad",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q11751808"},addTags:{brand:"Kyriad","brand:wikidata":"Q11751808","brand:wikipedia":"pl:Kyriad",name:"Kyriad",tourism:"hotel"},removeTags:{brand:"Kyriad","brand:wikidata":"Q11751808","brand:wikipedia":"pl:Kyriad",name:"Kyriad",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/La Quinta":{name:"La Quinta",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q6464734"},addTags:{brand:"La Quinta","brand:wikidata":"Q6464734","brand:wikipedia":"en:La Quinta Inns & Suites",name:"La Quinta",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},removeTags:{brand:"La Quinta","brand:wikidata":"Q6464734","brand:wikipedia":"en:La Quinta Inns & Suites",name:"La Quinta",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Marriott":{name:"Marriott",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1141173"},addTags:{brand:"Marriott","brand:wikidata":"Q1141173","brand:wikipedia":"en:Marriott International",name:"Marriott",tourism:"hotel"},removeTags:{brand:"Marriott","brand:wikidata":"Q1141173","brand:wikipedia":"en:Marriott International",name:"Marriott",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Mercure":{name:"Mercure",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1709809"},addTags:{brand:"Mercure","brand:wikidata":"Q1709809","brand:wikipedia":"en:Mercure (hotel)",name:"Mercure",tourism:"hotel"},removeTags:{brand:"Mercure","brand:wikidata":"Q1709809","brand:wikipedia":"en:Mercure (hotel)",name:"Mercure",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Novotel":{name:"Novotel",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q420545"},addTags:{brand:"Novotel","brand:wikidata":"Q420545","brand:wikipedia":"en:Novotel",name:"Novotel",tourism:"hotel"},removeTags:{brand:"Novotel","brand:wikidata":"Q420545","brand:wikipedia":"en:Novotel",name:"Novotel",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Park Hyatt":{name:"Park Hyatt",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1425063"},addTags:{brand:"Park Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Park Hyatt",operator:"Hyatt",tourism:"hotel"},removeTags:{brand:"Park Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Park Hyatt",operator:"Hyatt",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Premier Inn":{name:"Premier Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q2108626"},addTags:{brand:"Premier Inn","brand:wikidata":"Q2108626","brand:wikipedia":"en:Premier Inn",name:"Premier Inn",tourism:"hotel"},removeTags:{brand:"Premier Inn","brand:wikidata":"Q2108626","brand:wikipedia":"en:Premier Inn",name:"Premier Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Première Classe":{name:"Première Classe",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5964551"},addTags:{brand:"Première Classe","brand:wikidata":"Q5964551","brand:wikipedia":"en:Hôtel Première Classe",name:"Première Classe",tourism:"hotel"},removeTags:{brand:"Première Classe","brand:wikidata":"Q5964551","brand:wikipedia":"en:Hôtel Première Classe",name:"Première Classe",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Quality Inn":{name:"Quality Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1075788"},addTags:{brand:"Quality Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn",tourism:"hotel"},removeTags:{brand:"Quality Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Quality Inn & Suites":{name:"Quality Inn & Suites",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1075788"},addTags:{brand:"Quality Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn & Suites",tourism:"hotel"},removeTags:{brand:"Quality Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn & Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ramada":{name:"Ramada",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1502859"},addTags:{brand:"Ramada","brand:wikidata":"Q1502859","brand:wikipedia":"en:Ramada",name:"Ramada",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},removeTags:{brand:"Ramada","brand:wikidata":"Q1502859","brand:wikipedia":"en:Ramada",name:"Ramada",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Red Roof Inn":{name:"Red Roof Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q7304949"},addTags:{brand:"Red Roof Inn","brand:wikidata":"Q7304949","brand:wikipedia":"en:Red Roof Inn",name:"Red Roof Inn",tourism:"hotel"},removeTags:{brand:"Red Roof Inn","brand:wikidata":"Q7304949","brand:wikipedia":"en:Red Roof Inn",name:"Red Roof Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Residence Inn":{name:"Residence Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q7315394"},addTags:{brand:"Residence Inn","brand:wikidata":"Q7315394","brand:wikipedia":"en:Residence Inn by Marriott",name:"Residence Inn",tourism:"hotel"},removeTags:{brand:"Residence Inn","brand:wikidata":"Q7315394","brand:wikipedia":"en:Residence Inn by Marriott",name:"Residence Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Sheraton":{name:"Sheraton",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q634831"},addTags:{brand:"Sheraton","brand:wikidata":"Q634831","brand:wikipedia":"en:Sheraton Hotels and Resorts",name:"Sheraton",tourism:"hotel"},removeTags:{brand:"Sheraton","brand:wikidata":"Q634831","brand:wikipedia":"en:Sheraton Hotels and Resorts",name:"Sheraton",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Sleep Inn":{name:"Sleep Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1075788"},addTags:{brand:"Sleep Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Sleep Inn",tourism:"hotel"},removeTags:{brand:"Sleep Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Sleep Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Staybridge Suites":{name:"Staybridge Suites",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q7605116"},addTags:{brand:"Staybridge Suites","brand:wikidata":"Q7605116","brand:wikipedia":"en:Staybridge Suites",name:"Staybridge Suites",tourism:"hotel"},removeTags:{brand:"Staybridge Suites","brand:wikidata":"Q7605116","brand:wikipedia":"en:Staybridge Suites",name:"Staybridge Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Travelodge":{name:"Travelodge",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q7836087"},addTags:{brand:"Travelodge","brand:wikidata":"Q7836087","brand:wikipedia":"en:Travelodge",name:"Travelodge",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},removeTags:{brand:"Travelodge","brand:wikidata":"Q7836087","brand:wikipedia":"en:Travelodge",name:"Travelodge",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/東横イン":{name:"東横イン",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1320541"},addTags:{brand:"東横イン","brand:en":"Toyoko Inn","brand:wikidata":"Q1320541","brand:wikipedia":"en:Toyoko Inn",name:"東横イン","name:en":"Toyoko Inn",tourism:"hotel"},removeTags:{brand:"東横イン","brand:en":"Toyoko Inn","brand:wikidata":"Q1320541","brand:wikipedia":"en:Toyoko Inn",name:"東横イン","name:en":"Toyoko Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/motel/Econo Lodge":{name:"Econo Lodge",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"motel","brand:wikidata":"Q5333330"},addTags:{brand:"Econo Lodge","brand:wikidata":"Q5333330","brand:wikipedia":"en:Econo Lodge",name:"Econo Lodge",tourism:"motel"},removeTags:{brand:"Econo Lodge","brand:wikidata":"Q5333330","brand:wikipedia":"en:Econo Lodge",name:"Econo Lodge",tourism:"motel"},matchScore:2,suggestion:true},"tourism/motel/Motel 6":{name:"Motel 6",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"motel","brand:wikidata":"Q2188884"},addTags:{brand:"Motel 6","brand:wikidata":"Q2188884","brand:wikipedia":"en:Motel 6",name:"Motel 6",tourism:"motel"},removeTags:{brand:"Motel 6","brand:wikidata":"Q2188884","brand:wikipedia":"en:Motel 6",name:"Motel 6",tourism:"motel"},matchScore:2,suggestion:true},"tourism/motel/Rodeway Inn":{name:"Rodeway Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"motel","brand:wikidata":"Q7356709"},addTags:{brand:"Rodeway Inn","brand:wikidata":"Q7356709","brand:wikipedia":"en:Rodeway Inn",name:"Rodeway Inn",tourism:"motel"},removeTags:{brand:"Rodeway Inn","brand:wikidata":"Q7356709","brand:wikipedia":"en:Rodeway Inn",name:"Rodeway Inn",tourism:"motel"},matchScore:2,suggestion:true},"tourism/motel/Super 8":{name:"Super 8",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"motel","brand:wikidata":"Q5364003"},addTags:{brand:"Super 8","brand:wikidata":"Q5364003","brand:wikipedia":"en:Super 8 Motels",name:"Super 8",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"motel"},removeTags:{brand:"Super 8","brand:wikidata":"Q5364003","brand:wikipedia":"en:Super 8 Motels",name:"Super 8",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"motel"},matchScore:2,suggestion:true}};
25812
25813   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","category-utility","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/crossing/marked","highway/crossing/unmarked","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/enforcement","type/site","relation"]};
25814
25815   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/garage","building/retail","building/commercial","building/industrial","building/residential"]},"category-golf-area":{icon:"maki-golf",geometry:"area",name:"Golf Features",members:["golf/fairway","golf/green","golf/lateral_water_hazard","golf/rough","golf/bunker","golf/tee","golf/water_hazard","golf/driving_range"]},"category-golf-line":{icon:"maki-golf",geometry:"line",name:"Golf Features",members:["golf/hole","golf/cartpath","golf/cartpath_service","golf/path"]},"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:["highway/footway/marked","highway/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-utility":{icon:"iD-category-utility",geometry:"line",name:"Utility Features",members:["power/line","power/minor_line","man_made/pipeline","power/cable/underground"]},"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"]}};
25816
25817   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",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"},architect:{key:"architect",type:"text",label:"Architect"},"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"},attraction:{key:"attraction",type:"typeCombo",label:"Type"},backrest:{key:"backrest",type:"check",label:"Backrest"},barrier:{key:"barrier",type:"typeCombo",label:"Type"},basin:{key:"basin",type:"combo",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:"Beauty Specialty"},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"},"bridge/support":{key:"bridge:support",type:"combo",label:"Type"},building_area:{key:"building",type:"combo","default":"yes",geometry:"area",label:"Building"},building:{key:"building",type:"combo",label:"Building"},"building/material":{key:"building:material",type:"combo",label:"Material"},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"},check_date:{key:"check_date",type:"text",label:"Last Checked Date"},clothes:{key:"clothes",type:"semiCombo",label:"Clothes"},club:{key:"club",type:"typeCombo",label:"Type"},collection_times:{key:"collection_times",type:"text",label:"Collection Times"},colour:{key:"colour",type:"text",label:"Color"},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"]},conveying:{key:"conveying",type:"typeCombo",label:"Movement Direction",strings:{options:{forward:"Forward",backward:"Backward",reversible:"Reversible"}}},country:{key:"country",type:"combo",label:"Country"},couplings:{key:"couplings",type:"number",minValue:1,label:"Couplings",placeholder:"1, 2, 3..."},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","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",prerequisiteTag:{key:"religion"}},denotation:{key:"denotation",type:"combo",label:"Denotation"},departures_board:{key:"departures_board",type:"combo",label:"Departures Board",strings:{options:{yes:"Yes",timetable:"Timetable",realtime:"Realtime",no:"None"}}},description:{key:"description",type:"textarea",label:"Description",universal:true},design:{key:"design",type:"combo",label:"Design"},destination_oneway:{key:"destination",type:"semiCombo",label:"Destinations",prerequisiteTag:{key:"oneway",value:"yes"},snake_case:false},"destination/ref_oneway":{key:"destination:ref",type:"semiCombo",label:"Destination Road Numbers",prerequisiteTag:{key:"oneway",value:"yes"},snake_case:false},"destination/symbol_oneway":{key:"destination:symbol",type:"semiCombo",label:"Destination Symbols",prerequisiteTag:{key:"oneway",value:"yes"}},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"]},diet_multi:{key:"diet:",type:"multiCombo",label:"Diet Types"},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:"Distance"},dock:{key:"dock",type:"combo",label:"Type"},dog:{key:"dog",type:"combo",label:"Dogs",strings:{options:{yes:"Allowed",leashed:"Leashed Only",no:"Not Allowed"}}},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",label:"Email"},embankment:{key:"embankment",type:"typeCombo",label:"Type",placeholder:"Default"},emergency:{key:"emergency",type:"check",label:"Emergency"},enforcement:{key:"enforcement",type:"combo",label:"Type"},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",placeholder:"+31 42 123 4567"},fee:{key:"fee",type:"check",label:"Fee"},fence_type:{key:"fence_type",type:"combo",label:"Type"},"fire_hydrant/diameter":{key:"fire_hydrant:diameter",type:"combo",label:"Diameter (mm, in, or letters)",snake_case:false},"fire_hydrant/pressure":{key:"fire_hydrant:pressure",type:"combo",label:"Pressure (bar)",snake_case:false},"fire_hydrant/type":{key:"fire_hydrant:type",type:"combo",label:"Shape",strings:{options:{pillar:"Pillar/Aboveground",underground:"Underground",wall:"Wall",pipe:"Capped Pipe"}}},fireplace:{key:"fireplace",type:"check",label:"Fireplace"},fitness_station:{key:"fitness_station",type:"typeCombo",label:"Equipment Type"},fixme:{key:"fixme",type:"textarea",label:"Fix Me",universal:true},"flag/type":{key:"flag:type",type:"combo",label:"Flag Type"},ford:{key:"ford",type:"typeCombo",label:"Type",placeholder:"Default"},frequency_electrified:{key:"frequency",type:"combo",label:"Operating Frequency",prerequisiteTag:{key:"electrified",valueNot:"no"}},frequency:{key:"frequency",type:"combo",label:"Operating Frequency"},from:{key:"from",type:"text",label:"From"},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:"typeCombo",label:"Power Output",placeholder:"50 MW, 100 MW, 200 MW...",snake_case:false},"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"},"historic/wreck/date_sunk":{key:"wreck:date_sunk",type:"text",label:"Date Sunk"},"historic/wreck/visible_at_high_tide":{key:"wreck:visible_at_high_tide",type:"check",label:"Visible At High Tide"},"historic/wreck/visible_at_low_tide":{key:"wreck:visible_at_low_tide",type:"check",label:"Visible At Low Tide"},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_yes:{key:"intermittent",type:"check",label:"Intermittent","default":"yes"},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",prerequisiteTag:{key:"internet_access",valueNot:"no"}},"internet_access/ssid":{key:"internet_access:ssid",type:"text",label:"SSID (Network Name)",prerequisiteTag:{key:"internet_access",valueNot:"no"}},junction_line:{key:"junction",type:"combo",label:"Junction",strings:{options:{roundabout:"Roundabout",circular:"Traffic Circle",jughandle:"Jughandle"}}},"junction/ref_oneway":{key:"junction:ref",type:"text",label:"Junction Number",prerequisiteTag:{key:"oneway",value:"yes"}},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..."},language_multi:{key:"language:",type:"multiCombo",label:"Languages"},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_pool:{key:"location",type:"typeCombo",label:"Location",strings:{options:{outdoor:"Outdoor",indoor:"Indoor",roof:"Rooftop"}}},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"},material:{key:"material",type:"combo",label:"Material"},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"},minspeed:{key:"minspeed",type:"maxspeed",label:"Minimum Speed Limit",placeholder:"20, 30, 40..."},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"}}},"oneway/bicycle":{key:"oneway:bicycle",type:"check",label:"One Way (Bicycles)",prerequisiteTag:{key:"oneway"}},opening_date:{key:"opening_date",type:"text",label:"Expected Opening Date"},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"}}},payment_multi:{key:"payment:",type:"multiCombo",label:"Payment Types"},phases:{key:"phases",type:"number",minValue:1,label:"Phases",placeholder:"1, 2, 3..."},phone:{key:"phone",type:"tel",icon:"maki-telephone",label:"Telephone",placeholder:"+31 42 123 4567"},"piste/difficulty_downhill":{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/difficulty_nordic":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice - Flat, no effort needed",easy:"Easy - Soft hills, short steep section",intermediate:"Intermediate - Steep section",advanced:"Advanced - Narrow, steep or icy section, sharp turn",expert:"Expert - Dangerous terrain around"}}},"piste/difficulty_skitour":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice - L: <30° incline",easy:"Easy - WS: 30-35° incline",intermediate:"Intermediate - ZS: 35-40° incline",advanced:"Advanced - S: 40-45° incline",expert:"Expert - SS: 45–50° incline",freeride:"Freeride - AS: 50–55° incline",extreme:"Extreme - EX: >55° incline"}}},"piste/difficulty":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice",easy:"Easy",intermediate:"Intermediate",advanced:"Advanced",expert:"Expert",freeride:"Freeride",extreme:"Extreme"}}},"piste/grooming_downhill":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry - no grooming"}}},"piste/grooming_hike":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic - Winter Hiking",backcountry:"Backcountry - Snowshoeing"}}},"piste/grooming_nordic":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",backcountry:"Backcountry, no grooming","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}}},"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",connection:"Connection"}}},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"},recycling_type:{key:"recycling_type",type:"combo",label:"Type",placeholder:"Container, Center",strings:{options:{container:"Container",centre:"Center"}}},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"},"roof/colour":{key:"roof:colour",type:"combo",label:"Roof Color"},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"}}},salt:{key:"salt",type:"check",label:"Salt"},sanitary_dump_station:{key:"sanitary_dump_station",type:"check",label:"Toilet Disposal"},scuba_diving:{key:"scuba_diving:",type:"multiCombo",label:"Services",options:["repair","courses","rental","filling","air_filling","nitrox_filling","trimix_filling","oxygen_filling"]},"seamark/beacon_isolated_danger/shape":{key:"seamark:beacon_isolated_danger:shape",type:"combo",label:"Shape"},"seamark/beacon_lateral/category":{key:"seamark:beacon_lateral:category",type:"combo",label:"Category",strings:{options:{port:"Port",starboard:"Starboard",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right"}}},"seamark/beacon_lateral/colour":{key:"seamark:beacon_lateral:colour",type:"combo",label:"Color",strings:{options:{red:"Red",green:"Green",grey:"Grey"}}},"seamark/beacon_lateral/shape":{key:"seamark:beacon_lateral:shape",type:"combo",label:"Shape"},"seamark/beacon_lateral/system":{key:"seamark:beacon_lateral:system",type:"combo",label:"System",strings:{options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}}},"seamark/buoy_lateral/category":{key:"seamark:buoy_lateral:category",type:"combo",label:"Category",strings:{options:{port:"Port",starboard:"Starboard",channel_left:"Channel Left",channel_right:"Channel Right",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right",preferred_channel_port:"Preferred Channel Port",preferred_channel_starboard:"Preferred Channel Starboard"}}},"seamark/buoy_lateral/colour":{key:"seamark:buoy_lateral:colour",type:"combo",label:"Color",strings:{options:{red:"Red",green:"Green","red;white;red;white":"Red-White-Red-White","green;white;green;white":"Green-White-Green-White","red;green;red":"Red-Green-Red","green;red;green":"Green-Red-Green",white:"White",yellow:"Yellow"}}},"seamark/buoy_lateral/shape":{key:"seamark:buoy_lateral:shape",type:"combo",label:"Shape"},"seamark/buoy_lateral/system":{key:"seamark:buoy_lateral:system",type:"combo",label:"System",strings:{options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}}},"seamark/mooring/category":{key:"seamark:mooring:category",type:"combo",label:"Category"},"seamark/type":{key:"seamark:type",type:"combo",label:"Seamark"},"seamark/wreck/category":{key:"seamark:wreck:category",type:"combo",label:"Category"},seasonal:{key:"seasonal",type:"check",label:"Seasonal"},seats:{key:"seats",type:"number",minValue:0,label:"Seats",placeholder:"2, 4, 6..."},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"},"survey/date":{key:"survey:date",type:"text",label:"Last Survey Date"},swimming_pool:{key:"swimming_pool",type:"combo",label:"Type"},"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"}}},tidal:{key:"tidal",type:"check",label:"Tidal"},to:{key:"to",type:"text",label:"To"},"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:{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_sign:{key:"traffic_sign",type:"typeCombo",label:"Traffic Sign"},"traffic_sign/direction":{key:"traffic_sign:direction",type:"combo",label:"Direction",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},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_electrified:{key:"voltage",type:"combo",label:"Voltage",prerequisiteTag:{key:"electrified",valueNot:"no"}},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_source:{key:"water_source","default":"main",type:"combo",label:"Water Source"},water_volume:{key:"water_volume",type:"number",label:"Water Reserve Volume (m³)",snake_case:false},water:{key:"water",type:"combo",label:"Type"},waterway:{key:"waterway",type:"typeCombo",label:"Type"},website:{key:"website",type:"url",icon:"website",placeholder:"https://example.com",label:"Website"},wetland:{key:"wetland",type:"combo",label:"Type"},wheelchair:{key:"wheelchair",type:"radio",options:["yes","limited","no"],icon:"maki-wheelchair",label:"Wheelchair Access"},wholesale:{key:"wholesale",type:"typeCombo",label:"Wholesale"},width:{key:"width",type:"number",minValue:0,label:"Width (Meters)"},wikidata:{key:"wikidata",type:"wikidata",icon:"wikipedia",universal:true,label:"Wikidata"},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"}}}};
25818
25819   var quickselect = createCommonjsModule(function (module, exports) {
25820   (function (global, factory) {
25821         module.exports = factory();
25822   }(commonjsGlobal, (function () {
25823   function quickselect(arr, k, left, right, compare) {
25824       quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
25825   }
25826
25827   function quickselectStep(arr, k, left, right, compare) {
25828
25829       while (right > left) {
25830           if (right - left > 600) {
25831               var n = right - left + 1;
25832               var m = k - left + 1;
25833               var z = Math.log(n);
25834               var s = 0.5 * Math.exp(2 * z / 3);
25835               var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
25836               var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
25837               var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
25838               quickselectStep(arr, k, newLeft, newRight, compare);
25839           }
25840
25841           var t = arr[k];
25842           var i = left;
25843           var j = right;
25844
25845           swap(arr, left, k);
25846           if (compare(arr[right], t) > 0) swap(arr, left, right);
25847
25848           while (i < j) {
25849               swap(arr, i, j);
25850               i++;
25851               j--;
25852               while (compare(arr[i], t) < 0) i++;
25853               while (compare(arr[j], t) > 0) j--;
25854           }
25855
25856           if (compare(arr[left], t) === 0) swap(arr, left, j);
25857           else {
25858               j++;
25859               swap(arr, j, right);
25860           }
25861
25862           if (j <= k) left = j + 1;
25863           if (k <= j) right = j - 1;
25864       }
25865   }
25866
25867   function swap(arr, i, j) {
25868       var tmp = arr[i];
25869       arr[i] = arr[j];
25870       arr[j] = tmp;
25871   }
25872
25873   function defaultCompare(a, b) {
25874       return a < b ? -1 : a > b ? 1 : 0;
25875   }
25876
25877   return quickselect;
25878
25879   })));
25880   });
25881
25882   var rbush_1 = rbush;
25883   var default_1 = rbush;
25884
25885
25886
25887   function rbush(maxEntries, format) {
25888       if (!(this instanceof rbush)) return new rbush(maxEntries, format);
25889
25890       // max entries in a node is 9 by default; min node fill is 40% for best performance
25891       this._maxEntries = Math.max(4, maxEntries || 9);
25892       this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
25893
25894       if (format) {
25895           this._initFormat(format);
25896       }
25897
25898       this.clear();
25899   }
25900
25901   rbush.prototype = {
25902
25903       all: function () {
25904           return this._all(this.data, []);
25905       },
25906
25907       search: function (bbox) {
25908
25909           var node = this.data,
25910               result = [],
25911               toBBox = this.toBBox;
25912
25913           if (!intersects$1(bbox, node)) return result;
25914
25915           var nodesToSearch = [],
25916               i, len, child, childBBox;
25917
25918           while (node) {
25919               for (i = 0, len = node.children.length; i < len; i++) {
25920
25921                   child = node.children[i];
25922                   childBBox = node.leaf ? toBBox(child) : child;
25923
25924                   if (intersects$1(bbox, childBBox)) {
25925                       if (node.leaf) result.push(child);
25926                       else if (contains$2(bbox, childBBox)) this._all(child, result);
25927                       else nodesToSearch.push(child);
25928                   }
25929               }
25930               node = nodesToSearch.pop();
25931           }
25932
25933           return result;
25934       },
25935
25936       collides: function (bbox) {
25937
25938           var node = this.data,
25939               toBBox = this.toBBox;
25940
25941           if (!intersects$1(bbox, node)) return false;
25942
25943           var nodesToSearch = [],
25944               i, len, child, childBBox;
25945
25946           while (node) {
25947               for (i = 0, len = node.children.length; i < len; i++) {
25948
25949                   child = node.children[i];
25950                   childBBox = node.leaf ? toBBox(child) : child;
25951
25952                   if (intersects$1(bbox, childBBox)) {
25953                       if (node.leaf || contains$2(bbox, childBBox)) return true;
25954                       nodesToSearch.push(child);
25955                   }
25956               }
25957               node = nodesToSearch.pop();
25958           }
25959
25960           return false;
25961       },
25962
25963       load: function (data) {
25964           if (!(data && data.length)) return this;
25965
25966           if (data.length < this._minEntries) {
25967               for (var i = 0, len = data.length; i < len; i++) {
25968                   this.insert(data[i]);
25969               }
25970               return this;
25971           }
25972
25973           // recursively build the tree with the given data from scratch using OMT algorithm
25974           var node = this._build(data.slice(), 0, data.length - 1, 0);
25975
25976           if (!this.data.children.length) {
25977               // save as is if tree is empty
25978               this.data = node;
25979
25980           } else if (this.data.height === node.height) {
25981               // split root if trees have the same height
25982               this._splitRoot(this.data, node);
25983
25984           } else {
25985               if (this.data.height < node.height) {
25986                   // swap trees if inserted one is bigger
25987                   var tmpNode = this.data;
25988                   this.data = node;
25989                   node = tmpNode;
25990               }
25991
25992               // insert the small tree into the large tree at appropriate level
25993               this._insert(node, this.data.height - node.height - 1, true);
25994           }
25995
25996           return this;
25997       },
25998
25999       insert: function (item) {
26000           if (item) this._insert(item, this.data.height - 1);
26001           return this;
26002       },
26003
26004       clear: function () {
26005           this.data = createNode([]);
26006           return this;
26007       },
26008
26009       remove: function (item, equalsFn) {
26010           if (!item) return this;
26011
26012           var node = this.data,
26013               bbox = this.toBBox(item),
26014               path = [],
26015               indexes = [],
26016               i, parent, index, goingUp;
26017
26018           // depth-first iterative tree traversal
26019           while (node || path.length) {
26020
26021               if (!node) { // go up
26022                   node = path.pop();
26023                   parent = path[path.length - 1];
26024                   i = indexes.pop();
26025                   goingUp = true;
26026               }
26027
26028               if (node.leaf) { // check current node
26029                   index = findItem(item, node.children, equalsFn);
26030
26031                   if (index !== -1) {
26032                       // item found, remove the item and condense tree upwards
26033                       node.children.splice(index, 1);
26034                       path.push(node);
26035                       this._condense(path);
26036                       return this;
26037                   }
26038               }
26039
26040               if (!goingUp && !node.leaf && contains$2(node, bbox)) { // go down
26041                   path.push(node);
26042                   indexes.push(i);
26043                   i = 0;
26044                   parent = node;
26045                   node = node.children[0];
26046
26047               } else if (parent) { // go right
26048                   i++;
26049                   node = parent.children[i];
26050                   goingUp = false;
26051
26052               } else node = null; // nothing found
26053           }
26054
26055           return this;
26056       },
26057
26058       toBBox: function (item) { return item; },
26059
26060       compareMinX: compareNodeMinX,
26061       compareMinY: compareNodeMinY,
26062
26063       toJSON: function () { return this.data; },
26064
26065       fromJSON: function (data) {
26066           this.data = data;
26067           return this;
26068       },
26069
26070       _all: function (node, result) {
26071           var nodesToSearch = [];
26072           while (node) {
26073               if (node.leaf) result.push.apply(result, node.children);
26074               else nodesToSearch.push.apply(nodesToSearch, node.children);
26075
26076               node = nodesToSearch.pop();
26077           }
26078           return result;
26079       },
26080
26081       _build: function (items, left, right, height) {
26082
26083           var N = right - left + 1,
26084               M = this._maxEntries,
26085               node;
26086
26087           if (N <= M) {
26088               // reached leaf level; return leaf
26089               node = createNode(items.slice(left, right + 1));
26090               calcBBox(node, this.toBBox);
26091               return node;
26092           }
26093
26094           if (!height) {
26095               // target height of the bulk-loaded tree
26096               height = Math.ceil(Math.log(N) / Math.log(M));
26097
26098               // target number of root entries to maximize storage utilization
26099               M = Math.ceil(N / Math.pow(M, height - 1));
26100           }
26101
26102           node = createNode([]);
26103           node.leaf = false;
26104           node.height = height;
26105
26106           // split the items into M mostly square tiles
26107
26108           var N2 = Math.ceil(N / M),
26109               N1 = N2 * Math.ceil(Math.sqrt(M)),
26110               i, j, right2, right3;
26111
26112           multiSelect(items, left, right, N1, this.compareMinX);
26113
26114           for (i = left; i <= right; i += N1) {
26115
26116               right2 = Math.min(i + N1 - 1, right);
26117
26118               multiSelect(items, i, right2, N2, this.compareMinY);
26119
26120               for (j = i; j <= right2; j += N2) {
26121
26122                   right3 = Math.min(j + N2 - 1, right2);
26123
26124                   // pack each entry recursively
26125                   node.children.push(this._build(items, j, right3, height - 1));
26126               }
26127           }
26128
26129           calcBBox(node, this.toBBox);
26130
26131           return node;
26132       },
26133
26134       _chooseSubtree: function (bbox, node, level, path) {
26135
26136           var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
26137
26138           while (true) {
26139               path.push(node);
26140
26141               if (node.leaf || path.length - 1 === level) break;
26142
26143               minArea = minEnlargement = Infinity;
26144
26145               for (i = 0, len = node.children.length; i < len; i++) {
26146                   child = node.children[i];
26147                   area = bboxArea(child);
26148                   enlargement = enlargedArea(bbox, child) - area;
26149
26150                   // choose entry with the least area enlargement
26151                   if (enlargement < minEnlargement) {
26152                       minEnlargement = enlargement;
26153                       minArea = area < minArea ? area : minArea;
26154                       targetNode = child;
26155
26156                   } else if (enlargement === minEnlargement) {
26157                       // otherwise choose one with the smallest area
26158                       if (area < minArea) {
26159                           minArea = area;
26160                           targetNode = child;
26161                       }
26162                   }
26163               }
26164
26165               node = targetNode || node.children[0];
26166           }
26167
26168           return node;
26169       },
26170
26171       _insert: function (item, level, isNode) {
26172
26173           var toBBox = this.toBBox,
26174               bbox = isNode ? item : toBBox(item),
26175               insertPath = [];
26176
26177           // find the best node for accommodating the item, saving all nodes along the path too
26178           var node = this._chooseSubtree(bbox, this.data, level, insertPath);
26179
26180           // put the item into the node
26181           node.children.push(item);
26182           extend$1(node, bbox);
26183
26184           // split on node overflow; propagate upwards if necessary
26185           while (level >= 0) {
26186               if (insertPath[level].children.length > this._maxEntries) {
26187                   this._split(insertPath, level);
26188                   level--;
26189               } else break;
26190           }
26191
26192           // adjust bboxes along the insertion path
26193           this._adjustParentBBoxes(bbox, insertPath, level);
26194       },
26195
26196       // split overflowed node into two
26197       _split: function (insertPath, level) {
26198
26199           var node = insertPath[level],
26200               M = node.children.length,
26201               m = this._minEntries;
26202
26203           this._chooseSplitAxis(node, m, M);
26204
26205           var splitIndex = this._chooseSplitIndex(node, m, M);
26206
26207           var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
26208           newNode.height = node.height;
26209           newNode.leaf = node.leaf;
26210
26211           calcBBox(node, this.toBBox);
26212           calcBBox(newNode, this.toBBox);
26213
26214           if (level) insertPath[level - 1].children.push(newNode);
26215           else this._splitRoot(node, newNode);
26216       },
26217
26218       _splitRoot: function (node, newNode) {
26219           // split root node
26220           this.data = createNode([node, newNode]);
26221           this.data.height = node.height + 1;
26222           this.data.leaf = false;
26223           calcBBox(this.data, this.toBBox);
26224       },
26225
26226       _chooseSplitIndex: function (node, m, M) {
26227
26228           var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
26229
26230           minOverlap = minArea = Infinity;
26231
26232           for (i = m; i <= M - m; i++) {
26233               bbox1 = distBBox(node, 0, i, this.toBBox);
26234               bbox2 = distBBox(node, i, M, this.toBBox);
26235
26236               overlap = intersectionArea(bbox1, bbox2);
26237               area = bboxArea(bbox1) + bboxArea(bbox2);
26238
26239               // choose distribution with minimum overlap
26240               if (overlap < minOverlap) {
26241                   minOverlap = overlap;
26242                   index = i;
26243
26244                   minArea = area < minArea ? area : minArea;
26245
26246               } else if (overlap === minOverlap) {
26247                   // otherwise choose distribution with minimum area
26248                   if (area < minArea) {
26249                       minArea = area;
26250                       index = i;
26251                   }
26252               }
26253           }
26254
26255           return index;
26256       },
26257
26258       // sorts node children by the best axis for split
26259       _chooseSplitAxis: function (node, m, M) {
26260
26261           var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
26262               compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
26263               xMargin = this._allDistMargin(node, m, M, compareMinX),
26264               yMargin = this._allDistMargin(node, m, M, compareMinY);
26265
26266           // if total distributions margin value is minimal for x, sort by minX,
26267           // otherwise it's already sorted by minY
26268           if (xMargin < yMargin) node.children.sort(compareMinX);
26269       },
26270
26271       // total margin of all possible split distributions where each node is at least m full
26272       _allDistMargin: function (node, m, M, compare) {
26273
26274           node.children.sort(compare);
26275
26276           var toBBox = this.toBBox,
26277               leftBBox = distBBox(node, 0, m, toBBox),
26278               rightBBox = distBBox(node, M - m, M, toBBox),
26279               margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
26280               i, child;
26281
26282           for (i = m; i < M - m; i++) {
26283               child = node.children[i];
26284               extend$1(leftBBox, node.leaf ? toBBox(child) : child);
26285               margin += bboxMargin(leftBBox);
26286           }
26287
26288           for (i = M - m - 1; i >= m; i--) {
26289               child = node.children[i];
26290               extend$1(rightBBox, node.leaf ? toBBox(child) : child);
26291               margin += bboxMargin(rightBBox);
26292           }
26293
26294           return margin;
26295       },
26296
26297       _adjustParentBBoxes: function (bbox, path, level) {
26298           // adjust bboxes along the given tree path
26299           for (var i = level; i >= 0; i--) {
26300               extend$1(path[i], bbox);
26301           }
26302       },
26303
26304       _condense: function (path) {
26305           // go through the path, removing empty nodes and updating bboxes
26306           for (var i = path.length - 1, siblings; i >= 0; i--) {
26307               if (path[i].children.length === 0) {
26308                   if (i > 0) {
26309                       siblings = path[i - 1].children;
26310                       siblings.splice(siblings.indexOf(path[i]), 1);
26311
26312                   } else this.clear();
26313
26314               } else calcBBox(path[i], this.toBBox);
26315           }
26316       },
26317
26318       _initFormat: function (format) {
26319           // data format (minX, minY, maxX, maxY accessors)
26320
26321           // uses eval-type function compilation instead of just accepting a toBBox function
26322           // because the algorithms are very sensitive to sorting functions performance,
26323           // so they should be dead simple and without inner calls
26324
26325           var compareArr = ['return a', ' - b', ';'];
26326
26327           this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
26328           this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
26329
26330           this.toBBox = new Function('a',
26331               'return {minX: a' + format[0] +
26332               ', minY: a' + format[1] +
26333               ', maxX: a' + format[2] +
26334               ', maxY: a' + format[3] + '};');
26335       }
26336   };
26337
26338   function findItem(item, items, equalsFn) {
26339       if (!equalsFn) return items.indexOf(item);
26340
26341       for (var i = 0; i < items.length; i++) {
26342           if (equalsFn(item, items[i])) return i;
26343       }
26344       return -1;
26345   }
26346
26347   // calculate node's bbox from bboxes of its children
26348   function calcBBox(node, toBBox) {
26349       distBBox(node, 0, node.children.length, toBBox, node);
26350   }
26351
26352   // min bounding rectangle of node children from k to p-1
26353   function distBBox(node, k, p, toBBox, destNode) {
26354       if (!destNode) destNode = createNode(null);
26355       destNode.minX = Infinity;
26356       destNode.minY = Infinity;
26357       destNode.maxX = -Infinity;
26358       destNode.maxY = -Infinity;
26359
26360       for (var i = k, child; i < p; i++) {
26361           child = node.children[i];
26362           extend$1(destNode, node.leaf ? toBBox(child) : child);
26363       }
26364
26365       return destNode;
26366   }
26367
26368   function extend$1(a, b) {
26369       a.minX = Math.min(a.minX, b.minX);
26370       a.minY = Math.min(a.minY, b.minY);
26371       a.maxX = Math.max(a.maxX, b.maxX);
26372       a.maxY = Math.max(a.maxY, b.maxY);
26373       return a;
26374   }
26375
26376   function compareNodeMinX(a, b) { return a.minX - b.minX; }
26377   function compareNodeMinY(a, b) { return a.minY - b.minY; }
26378
26379   function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
26380   function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
26381
26382   function enlargedArea(a, b) {
26383       return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
26384              (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
26385   }
26386
26387   function intersectionArea(a, b) {
26388       var minX = Math.max(a.minX, b.minX),
26389           minY = Math.max(a.minY, b.minY),
26390           maxX = Math.min(a.maxX, b.maxX),
26391           maxY = Math.min(a.maxY, b.maxY);
26392
26393       return Math.max(0, maxX - minX) *
26394              Math.max(0, maxY - minY);
26395   }
26396
26397   function contains$2(a, b) {
26398       return a.minX <= b.minX &&
26399              a.minY <= b.minY &&
26400              b.maxX <= a.maxX &&
26401              b.maxY <= a.maxY;
26402   }
26403
26404   function intersects$1(a, b) {
26405       return b.minX <= a.maxX &&
26406              b.minY <= a.maxY &&
26407              b.maxX >= a.minX &&
26408              b.maxY >= a.minY;
26409   }
26410
26411   function createNode(children) {
26412       return {
26413           children: children,
26414           height: 1,
26415           leaf: true,
26416           minX: Infinity,
26417           minY: Infinity,
26418           maxX: -Infinity,
26419           maxY: -Infinity
26420       };
26421   }
26422
26423   // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
26424   // combines selection algorithm with binary divide & conquer approach
26425
26426   function multiSelect(arr, left, right, n, compare) {
26427       var stack = [left, right],
26428           mid;
26429
26430       while (stack.length) {
26431           right = stack.pop();
26432           left = stack.pop();
26433
26434           if (right - left <= n) continue;
26435
26436           mid = left + Math.ceil((right - left) / n / 2) * n;
26437           quickselect(arr, mid, left, right, compare);
26438
26439           stack.push(left, mid, mid, right);
26440       }
26441   }
26442   rbush_1.default = default_1;
26443
26444   var lineclip_1 = lineclip;
26445
26446   lineclip.polyline = lineclip;
26447   lineclip.polygon = polygonclip;
26448
26449
26450   // Cohen-Sutherland line clippign algorithm, adapted to efficiently
26451   // handle polylines rather than just segments
26452
26453   function lineclip(points, bbox, result) {
26454
26455       var len = points.length,
26456           codeA = bitCode(points[0], bbox),
26457           part = [],
26458           i, a, b, codeB, lastCode;
26459
26460       if (!result) result = [];
26461
26462       for (i = 1; i < len; i++) {
26463           a = points[i - 1];
26464           b = points[i];
26465           codeB = lastCode = bitCode(b, bbox);
26466
26467           while (true) {
26468
26469               if (!(codeA | codeB)) { // accept
26470                   part.push(a);
26471
26472                   if (codeB !== lastCode) { // segment went outside
26473                       part.push(b);
26474
26475                       if (i < len - 1) { // start a new line
26476                           result.push(part);
26477                           part = [];
26478                       }
26479                   } else if (i === len - 1) {
26480                       part.push(b);
26481                   }
26482                   break;
26483
26484               } else if (codeA & codeB) { // trivial reject
26485                   break;
26486
26487               } else if (codeA) { // a outside, intersect with clip edge
26488                   a = intersect$1(a, b, codeA, bbox);
26489                   codeA = bitCode(a, bbox);
26490
26491               } else { // b outside
26492                   b = intersect$1(a, b, codeB, bbox);
26493                   codeB = bitCode(b, bbox);
26494               }
26495           }
26496
26497           codeA = lastCode;
26498       }
26499
26500       if (part.length) result.push(part);
26501
26502       return result;
26503   }
26504
26505   // Sutherland-Hodgeman polygon clipping algorithm
26506
26507   function polygonclip(points, bbox) {
26508
26509       var result, edge, prev, prevInside, i, p, inside;
26510
26511       // clip against each side of the clip rectangle
26512       for (edge = 1; edge <= 8; edge *= 2) {
26513           result = [];
26514           prev = points[points.length - 1];
26515           prevInside = !(bitCode(prev, bbox) & edge);
26516
26517           for (i = 0; i < points.length; i++) {
26518               p = points[i];
26519               inside = !(bitCode(p, bbox) & edge);
26520
26521               // if segment goes through the clip window, add an intersection
26522               if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox));
26523
26524               if (inside) result.push(p); // add a point if it's inside
26525
26526               prev = p;
26527               prevInside = inside;
26528           }
26529
26530           points = result;
26531
26532           if (!points.length) break;
26533       }
26534
26535       return result;
26536   }
26537
26538   // intersect a segment against one of the 4 lines that make up the bbox
26539
26540   function intersect$1(a, b, edge, bbox) {
26541       return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
26542              edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
26543              edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
26544              edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
26545              null;
26546   }
26547
26548   // bit code reflects the point position relative to the bbox:
26549
26550   //         left  mid  right
26551   //    top  1001  1000  1010
26552   //    mid  0001  0000  0010
26553   // bottom  0101  0100  0110
26554
26555   function bitCode(p, bbox) {
26556       var code = 0;
26557
26558       if (p[0] < bbox[0]) code |= 1; // left
26559       else if (p[0] > bbox[2]) code |= 2; // right
26560
26561       if (p[1] < bbox[1]) code |= 4; // bottom
26562       else if (p[1] > bbox[3]) code |= 8; // top
26563
26564       return code;
26565   }
26566
26567   var whichPolygon_1 = whichPolygon;
26568
26569   function whichPolygon(data) {
26570       var bboxes = [];
26571       for (var i = 0; i < data.features.length; i++) {
26572           var feature = data.features[i];
26573           var coords = feature.geometry.coordinates;
26574
26575           if (feature.geometry.type === 'Polygon') {
26576               bboxes.push(treeItem(coords, feature.properties));
26577
26578           } else if (feature.geometry.type === 'MultiPolygon') {
26579               for (var j = 0; j < coords.length; j++) {
26580                   bboxes.push(treeItem(coords[j], feature.properties));
26581               }
26582           }
26583       }
26584
26585       var tree = rbush_1().load(bboxes);
26586
26587       function query(p, multi) {
26588           var output = [],
26589               result = tree.search({
26590                   minX: p[0],
26591                   minY: p[1],
26592                   maxX: p[0],
26593                   maxY: p[1]
26594               });
26595           for (var i = 0; i < result.length; i++) {
26596               if (insidePolygon(result[i].coords, p)) {
26597                   if (multi)
26598                       output.push(result[i].props);
26599                   else
26600                       return result[i].props;
26601               }
26602           }
26603           return multi && output.length ? output : null;
26604       }
26605
26606       query.tree = tree;
26607       query.bbox = function queryBBox(bbox) {
26608           var output = [];
26609           var result = tree.search({
26610               minX: bbox[0],
26611               minY: bbox[1],
26612               maxX: bbox[2],
26613               maxY: bbox[3]
26614           });
26615           for (var i = 0; i < result.length; i++) {
26616               if (polygonIntersectsBBox(result[i].coords, bbox)) {
26617                   output.push(result[i].props);
26618               }
26619           }
26620           return output;
26621       };
26622
26623       return query;
26624   }
26625
26626   function polygonIntersectsBBox(polygon, bbox) {
26627       var bboxCenter = [
26628           (bbox[0] + bbox[2]) / 2,
26629           (bbox[1] + bbox[3]) / 2
26630       ];
26631       if (insidePolygon(polygon, bboxCenter)) return true;
26632       for (var i = 0; i < polygon.length; i++) {
26633           if (lineclip_1(polygon[i], bbox).length > 0) return true;
26634       }
26635       return false;
26636   }
26637
26638   // ray casting algorithm for detecting if point is in polygon
26639   function insidePolygon(rings, p) {
26640       var inside = false;
26641       for (var i = 0, len = rings.length; i < len; i++) {
26642           var ring = rings[i];
26643           for (var j = 0, len2 = ring.length, k = len2 - 1; j < len2; k = j++) {
26644               if (rayIntersect(p, ring[j], ring[k])) inside = !inside;
26645           }
26646       }
26647       return inside;
26648   }
26649
26650   function rayIntersect(p, p1, p2) {
26651       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]);
26652   }
26653
26654   function treeItem(coords, props) {
26655       var item = {
26656           minX: Infinity,
26657           minY: Infinity,
26658           maxX: -Infinity,
26659           maxY: -Infinity,
26660           coords: coords,
26661           props: props
26662       };
26663
26664       for (var i = 0; i < coords[0].length; i++) {
26665           var p = coords[0][i];
26666           item.minX = Math.min(item.minX, p[0]);
26667           item.minY = Math.min(item.minY, p[1]);
26668           item.maxX = Math.max(item.maxX, p[0]);
26669           item.maxY = Math.max(item.maxY, p[1]);
26670       }
26671       return item;
26672   }
26673
26674   // index the osm-community-index
26675   var ociFeatureCollection = values$1(features$2).map(function(feature) {
26676       // workaround for which-polygon: only supports `properties`, not `id`
26677       // https://github.com/mapbox/which-polygon/pull/6
26678       feature.properties = {
26679           id: feature.id,
26680           area: d3_geoArea(feature)   // also precompute areas
26681       };
26682       return feature;
26683   });
26684
26685
26686   var data = {
26687       community: {
26688           features: features$2,
26689           resources: resources,
26690           query: whichPolygon_1({
26691               type: 'FeatureCollection',
26692               features: ociFeatureCollection
26693           })
26694       },
26695       imagery: dataImagery,  //legacy
26696       presets: {
26697           presets: presets,
26698           defaults: defaults,
26699           categories: categories,
26700           fields: fields
26701       }
26702   };
26703
26704   function osmEntity(attrs) {
26705       // For prototypal inheritance.
26706       if (this instanceof osmEntity) return;
26707
26708       // Create the appropriate subtype.
26709       if (attrs && attrs.type) {
26710           return osmEntity[attrs.type].apply(this, arguments);
26711       } else if (attrs && attrs.id) {
26712           return osmEntity[osmEntity.id.type(attrs.id)].apply(this, arguments);
26713       }
26714
26715       // Initialize a generic Entity (used only in tests).
26716       return (new osmEntity()).initialize(arguments);
26717   }
26718
26719
26720   osmEntity.id = function(type) {
26721       return osmEntity.id.fromOSM(type, osmEntity.id.next[type]--);
26722   };
26723
26724
26725   osmEntity.id.next = {
26726       changeset: -1, node: -1, way: -1, relation: -1
26727   };
26728
26729
26730   osmEntity.id.fromOSM = function(type, id) {
26731       return type[0] + id;
26732   };
26733
26734
26735   osmEntity.id.toOSM = function(id) {
26736       return id.slice(1);
26737   };
26738
26739
26740   osmEntity.id.type = function(id) {
26741       return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
26742   };
26743
26744
26745   // A function suitable for use as the second argument to d3.selection#data().
26746   osmEntity.key = function(entity) {
26747       return entity.id + 'v' + (entity.v || 0);
26748   };
26749
26750
26751   osmEntity.prototype = {
26752
26753       tags: {},
26754
26755
26756       initialize: function(sources) {
26757           for (var i = 0; i < sources.length; ++i) {
26758               var source = sources[i];
26759               for (var prop in source) {
26760                   if (Object.prototype.hasOwnProperty.call(source, prop)) {
26761                       if (source[prop] === undefined) {
26762                           delete this[prop];
26763                       } else {
26764                           this[prop] = source[prop];
26765                       }
26766                   }
26767               }
26768           }
26769
26770           if (!this.id && this.type) {
26771               this.id = osmEntity.id(this.type);
26772           }
26773           if (!this.hasOwnProperty('visible')) {
26774               this.visible = true;
26775           }
26776
26777           return this;
26778       },
26779
26780
26781       copy: function(resolver, copies) {
26782           if (copies[this.id])
26783               return copies[this.id];
26784
26785           var copy = osmEntity(this, {id: undefined, user: undefined, version: undefined});
26786           copies[this.id] = copy;
26787
26788           return copy;
26789       },
26790
26791
26792       osmId: function() {
26793           return osmEntity.id.toOSM(this.id);
26794       },
26795
26796
26797       isNew: function() {
26798           return this.osmId() < 0;
26799       },
26800
26801
26802       update: function(attrs) {
26803           return osmEntity(this, attrs, {v: 1 + (this.v || 0)});
26804       },
26805
26806
26807       mergeTags: function(tags) {
26808           var merged = clone(this.tags), changed = false;
26809           for (var k in tags) {
26810               var t1 = merged[k],
26811                   t2 = tags[k];
26812               if (!t1) {
26813                   changed = true;
26814                   merged[k] = t2;
26815               } else if (t1 !== t2) {
26816                   changed = true;
26817                   merged[k] = union(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
26818               }
26819           }
26820           return changed ? this.update({tags: merged}) : this;
26821       },
26822
26823
26824       intersects: function(extent, resolver) {
26825           return this.extent(resolver).intersects(extent);
26826       },
26827
26828
26829       hasNonGeometryTags: function() {
26830           return without(Object.keys(this.tags), 'area').length > 0;
26831       },
26832
26833       hasParentRelations: function(resolver) {
26834           return resolver.parentRelations(this).length > 0;
26835       },
26836
26837       hasInterestingTags: function() {
26838           return keys$1(this.tags).some(osmIsInterestingTag);
26839       },
26840
26841
26842       isHighwayIntersection: function() {
26843           return false;
26844       },
26845
26846       isDegenerate: function() {
26847           return true;
26848       },
26849
26850       deprecatedTags: function() {
26851           var tags = this.tags;
26852
26853           // if there are no tags, none can be deprecated
26854           if (Object.keys(tags).length === 0) return [];
26855
26856           var deprecated = [];
26857           dataDeprecated.forEach(function(d) {
26858               var matchesDeprecatedTags = every(Object.keys(d.old), function(key) {
26859                   return tags[key] && (d.old[key] === tags[key] || d.old[key] === '*');
26860               });
26861               if (matchesDeprecatedTags) {
26862                   deprecated.push(d);
26863               }
26864           });
26865
26866           return deprecated;
26867       }
26868   };
26869
26870   function geoExtent(min, max) {
26871       if (!(this instanceof geoExtent)) {
26872           return new geoExtent(min, max);
26873       } else if (min instanceof geoExtent) {
26874           return min;
26875       } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
26876           this[0] = min[0];
26877           this[1] = min[1];
26878       } else {
26879           this[0] = min        || [ Infinity,  Infinity];
26880           this[1] = max || min || [-Infinity, -Infinity];
26881       }
26882   }
26883
26884   geoExtent.prototype = new Array(2);
26885
26886   assignIn(geoExtent.prototype, {
26887
26888       equals: function (obj) {
26889           return this[0][0] === obj[0][0] &&
26890               this[0][1] === obj[0][1] &&
26891               this[1][0] === obj[1][0] &&
26892               this[1][1] === obj[1][1];
26893       },
26894
26895
26896       extend: function(obj) {
26897           if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
26898           return geoExtent(
26899               [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
26900               [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
26901           );
26902       },
26903
26904
26905       _extend: function(extent) {
26906           this[0][0] = Math.min(extent[0][0], this[0][0]);
26907           this[0][1] = Math.min(extent[0][1], this[0][1]);
26908           this[1][0] = Math.max(extent[1][0], this[1][0]);
26909           this[1][1] = Math.max(extent[1][1], this[1][1]);
26910       },
26911
26912
26913       area: function() {
26914           return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
26915       },
26916
26917
26918       center: function() {
26919           return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
26920       },
26921
26922
26923       rectangle: function() {
26924           return [this[0][0], this[0][1], this[1][0], this[1][1]];
26925       },
26926
26927
26928       bbox: function() {
26929           return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
26930       },
26931
26932
26933       polygon: function() {
26934           return [
26935               [this[0][0], this[0][1]],
26936               [this[0][0], this[1][1]],
26937               [this[1][0], this[1][1]],
26938               [this[1][0], this[0][1]],
26939               [this[0][0], this[0][1]]
26940           ];
26941       },
26942
26943
26944       contains: function(obj) {
26945           if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
26946           return obj[0][0] >= this[0][0] &&
26947                  obj[0][1] >= this[0][1] &&
26948                  obj[1][0] <= this[1][0] &&
26949                  obj[1][1] <= this[1][1];
26950       },
26951
26952
26953       intersects: function(obj) {
26954           if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
26955           return obj[0][0] <= this[1][0] &&
26956                  obj[0][1] <= this[1][1] &&
26957                  obj[1][0] >= this[0][0] &&
26958                  obj[1][1] >= this[0][1];
26959       },
26960
26961
26962       intersection: function(obj) {
26963           if (!this.intersects(obj)) return new geoExtent();
26964           return new geoExtent(
26965               [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
26966               [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
26967           );
26968       },
26969
26970
26971       percentContainedIn: function(obj) {
26972           if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
26973           var a1 = this.intersection(obj).area();
26974           var a2 = this.area();
26975
26976           if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
26977               return 0;
26978           } else {
26979               return a1 / a2;
26980           }
26981       },
26982
26983
26984       padByMeters: function(meters) {
26985           var dLat = geoMetersToLat(meters);
26986           var dLon = geoMetersToLon(meters, this.center()[1]);
26987           return geoExtent(
26988               [this[0][0] - dLon, this[0][1] - dLat],
26989               [this[1][0] + dLon, this[1][1] + dLat]
26990           );
26991       },
26992
26993
26994       toParam: function() {
26995           return this.rectangle().join(',');
26996       }
26997
26998   });
26999
27000   // constants
27001   var TAU = 2 * Math.PI;
27002   var EQUATORIAL_RADIUS = 6356752.314245179;
27003   var POLAR_RADIUS = 6378137.0;
27004
27005
27006   function geoLatToMeters(dLat) {
27007       return dLat * (TAU * POLAR_RADIUS / 360);
27008   }
27009
27010
27011   function geoLonToMeters(dLon, atLat) {
27012       return Math.abs(atLat) >= 90 ? 0 :
27013           dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
27014   }
27015
27016
27017   function geoMetersToLat(m) {
27018       return m / (TAU * POLAR_RADIUS / 360);
27019   }
27020
27021
27022   function geoMetersToLon(m, atLat) {
27023       return Math.abs(atLat) >= 90 ? 0 :
27024           m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
27025   }
27026
27027
27028   function geoMetersToOffset(meters, tileSize) {
27029       tileSize = tileSize || 256;
27030       return [
27031           meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
27032           -meters[1] * tileSize / (TAU * POLAR_RADIUS)
27033       ];
27034   }
27035
27036
27037   function geoOffsetToMeters(offset, tileSize) {
27038       tileSize = tileSize || 256;
27039       return [
27040           offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
27041           -offset[1] * TAU * POLAR_RADIUS / tileSize
27042       ];
27043   }
27044
27045
27046   // Equirectangular approximation of spherical distances on Earth
27047   function geoSphericalDistance(a, b) {
27048       var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
27049       var y = geoLatToMeters(a[1] - b[1]);
27050       return Math.sqrt((x * x) + (y * y));
27051   }
27052
27053
27054   // scale to zoom
27055   function geoScaleToZoom(k, tileSize) {
27056       tileSize = tileSize || 256;
27057       var log2ts = Math.log(tileSize) * Math.LOG2E;
27058       return Math.log(k * TAU) / Math.LN2 - log2ts;
27059   }
27060
27061
27062   // zoom to scale
27063   function geoZoomToScale(z, tileSize) {
27064       tileSize = tileSize || 256;
27065       return tileSize * Math.pow(2, z) / TAU;
27066   }
27067
27068
27069   // returns info about the node from `nodes` closest to the given `point`
27070   function geoSphericalClosestNode(nodes, point) {
27071       var minDistance = Infinity, distance;
27072       var indexOfMin;
27073
27074       for (var i in nodes) {
27075           distance = geoSphericalDistance(nodes[i].loc, point);
27076           if (distance < minDistance) {
27077               minDistance = distance;
27078               indexOfMin = i;
27079           }
27080       }
27081
27082       if (indexOfMin !== undefined) {
27083           return { index: indexOfMin, distance: minDistance, node: nodes[indexOfMin] };
27084       } else {
27085           return null;
27086       }
27087   }
27088
27089   /**
27090    * The base implementation of `_.some` without support for iteratee shorthands.
27091    *
27092    * @private
27093    * @param {Array|Object} collection The collection to iterate over.
27094    * @param {Function} predicate The function invoked per iteration.
27095    * @returns {boolean} Returns `true` if any element passes the predicate check,
27096    *  else `false`.
27097    */
27098   function baseSome(collection, predicate) {
27099     var result;
27100
27101     baseEach(collection, function(value, index, collection) {
27102       result = predicate(value, index, collection);
27103       return !result;
27104     });
27105     return !!result;
27106   }
27107
27108   /**
27109    * Checks if `predicate` returns truthy for **any** element of `collection`.
27110    * Iteration is stopped once `predicate` returns truthy. The predicate is
27111    * invoked with three arguments: (value, index|key, collection).
27112    *
27113    * @static
27114    * @memberOf _
27115    * @since 0.1.0
27116    * @category Collection
27117    * @param {Array|Object} collection The collection to iterate over.
27118    * @param {Function} [predicate=_.identity] The function invoked per iteration.
27119    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
27120    * @returns {boolean} Returns `true` if any element passes the predicate check,
27121    *  else `false`.
27122    * @example
27123    *
27124    * _.some([null, 0, 'yes', false], Boolean);
27125    * // => true
27126    *
27127    * var users = [
27128    *   { 'user': 'barney', 'active': true },
27129    *   { 'user': 'fred',   'active': false }
27130    * ];
27131    *
27132    * // The `_.matches` iteratee shorthand.
27133    * _.some(users, { 'user': 'barney', 'active': false });
27134    * // => false
27135    *
27136    * // The `_.matchesProperty` iteratee shorthand.
27137    * _.some(users, ['active', false]);
27138    * // => true
27139    *
27140    * // The `_.property` iteratee shorthand.
27141    * _.some(users, 'active');
27142    * // => true
27143    */
27144   function some(collection, predicate, guard) {
27145     var func = isArray(collection) ? arraySome : baseSome;
27146     if (guard && isIterateeCall(collection, predicate, guard)) {
27147       predicate = undefined;
27148     }
27149     return func(collection, baseIteratee(predicate, 3));
27150   }
27151
27152   // vector equals
27153   function geoVecEqual(a, b, epsilon) {
27154       if (epsilon) {
27155           return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
27156       } else {
27157           return (a[0] === b[0]) && (a[1] === b[1]);
27158       }
27159   }
27160
27161   // vector addition
27162   function geoVecAdd(a, b) {
27163       return [ a[0] + b[0], a[1] + b[1] ];
27164   }
27165
27166   // vector subtraction
27167   function geoVecSubtract(a, b) {
27168       return [ a[0] - b[0], a[1] - b[1] ];
27169   }
27170
27171   // vector scaling
27172   function geoVecScale(a, mag) {
27173       return [ a[0] * mag, a[1] * mag ];
27174   }
27175
27176   // vector rounding (was: geoRoundCoordinates)
27177   function geoVecFloor(a) {
27178       return [ Math.floor(a[0]), Math.floor(a[1]) ];
27179   }
27180
27181   // linear interpolation
27182   function geoVecInterp(a, b, t) {
27183       return [
27184           a[0] + (b[0] - a[0]) * t,
27185           a[1] + (b[1] - a[1]) * t
27186       ];
27187   }
27188
27189   // http://jsperf.com/id-dist-optimization
27190   function geoVecLength(a, b) {
27191       var x = a[0] - b[0];
27192       var y = a[1] - b[1];
27193       return Math.sqrt((x * x) + (y * y));
27194   }
27195
27196   // Return the counterclockwise angle in the range (-pi, pi)
27197   // between the positive X axis and the line intersecting a and b.
27198   function geoVecAngle(a, b) {
27199       return Math.atan2(b[1] - a[1], b[0] - a[0]);
27200   }
27201
27202   // dot product
27203   function geoVecDot(a, b, origin) {
27204       origin = origin || [0, 0];
27205       return (a[0] - origin[0]) * (b[0] - origin[0]) +
27206           (a[1] - origin[1]) * (b[1] - origin[1]);
27207   }
27208
27209   // 2D cross product of OA and OB vectors, returns magnitude of Z vector
27210   // Returns a positive value, if OAB makes a counter-clockwise turn,
27211   // negative for clockwise turn, and zero if the points are collinear.
27212   function geoVecCross(a, b, origin) {
27213       origin = origin || [0, 0];
27214       return (a[0] - origin[0]) * (b[1] - origin[1]) -
27215           (a[1] - origin[1]) * (b[0] - origin[0]);
27216   }
27217
27218   // Return the counterclockwise angle in the range (-pi, pi)
27219   // between the positive X axis and the line intersecting a and b.
27220   function geoAngle(a, b, projection) {
27221       return geoVecAngle(projection(a.loc), projection(b.loc));
27222   }
27223
27224   function geoEdgeEqual(a, b) {
27225       return (a[0] === b[0] && a[1] === b[1]) ||
27226           (a[0] === b[1] && a[1] === b[0]);
27227   }
27228
27229   // Rotate all points counterclockwise around a pivot point by given angle
27230   function geoRotate(points, angle, around) {
27231       return points.map(function(point) {
27232           var radial = geoVecSubtract(point, around);
27233           return [
27234               radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
27235               radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
27236           ];
27237       });
27238   }
27239
27240
27241   // Choose the edge with the minimal distance from `point` to its orthogonal
27242   // projection onto that edge, if such a projection exists, or the distance to
27243   // the closest vertex on that edge. Returns an object with the `index` of the
27244   // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
27245   function geoChooseEdge(nodes, point, projection, activeID) {
27246       var dist = geoVecLength;
27247       var points = nodes.map(function(n) { return projection(n.loc); });
27248       var ids = nodes.map(function(n) { return n.id; });
27249       var min = Infinity;
27250       var idx;
27251       var loc;
27252
27253       for (var i = 0; i < points.length - 1; i++) {
27254           if (ids[i] === activeID || ids[i + 1] === activeID) continue;
27255
27256           var o = points[i];
27257           var s = geoVecSubtract(points[i + 1], o);
27258           var v = geoVecSubtract(point, o);
27259           var proj = geoVecDot(v, s) / geoVecDot(s, s);
27260           var p;
27261
27262           if (proj < 0) {
27263               p = o;
27264           } else if (proj > 1) {
27265               p = points[i + 1];
27266           } else {
27267               p = [o[0] + proj * s[0], o[1] + proj * s[1]];
27268           }
27269
27270           var d = dist(p, point);
27271           if (d < min) {
27272               min = d;
27273               idx = i + 1;
27274               loc = projection.invert(p);
27275           }
27276       }
27277
27278       if (idx !== undefined) {
27279           return { index: idx, distance: min, loc: loc };
27280       } else {
27281           return null;
27282       }
27283   }
27284
27285
27286   // Test active (dragged or drawing) segments against inactive segments
27287   // This is used to test e.g. multipolygon rings that cross
27288   // `activeNodes` is the ring containing the activeID being dragged.
27289   // `inactiveNodes` is the other ring to test against
27290   function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
27291       var actives = [];
27292       var inactives = [];
27293       var j, k, n1, n2, segment;
27294
27295       // gather active segments (only segments in activeNodes that contain the activeID)
27296       for (j = 0; j < activeNodes.length - 1; j++) {
27297           n1 = activeNodes[j];
27298           n2 = activeNodes[j+1];
27299           segment = [n1.loc, n2.loc];
27300           if (n1.id === activeID || n2.id === activeID) {
27301               actives.push(segment);
27302           }
27303       }
27304
27305       // gather inactive segments
27306       for (j = 0; j < inactiveNodes.length - 1; j++) {
27307           n1 = inactiveNodes[j];
27308           n2 = inactiveNodes[j+1];
27309           segment = [n1.loc, n2.loc];
27310           inactives.push(segment);
27311       }
27312
27313       // test
27314       for (j = 0; j < actives.length; j++) {
27315           for (k = 0; k < inactives.length; k++) {
27316               var p = actives[j];
27317               var q = inactives[k];
27318               var hit = geoLineIntersection(p, q);
27319               if (hit) {
27320                   return true;
27321               }
27322           }
27323       }
27324
27325       return false;
27326   }
27327
27328
27329   // Test active (dragged or drawing) segments against inactive segments
27330   // This is used to test whether a way intersects with itself.
27331   function geoHasSelfIntersections(nodes, activeID) {
27332       var actives = [];
27333       var inactives = [];
27334       var j, k;
27335
27336       // group active and passive segments along the nodes
27337       for (j = 0; j < nodes.length - 1; j++) {
27338           var n1 = nodes[j];
27339           var n2 = nodes[j+1];
27340           var segment = [n1.loc, n2.loc];
27341           if (n1.id === activeID || n2.id === activeID) {
27342               actives.push(segment);
27343           } else {
27344               inactives.push(segment);
27345           }
27346       }
27347
27348       // test
27349       for (j = 0; j < actives.length; j++) {
27350           for (k = 0; k < inactives.length; k++) {
27351               var p = actives[j];
27352               var q = inactives[k];
27353               // skip if segments share an endpoint
27354               if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) ||
27355                   geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) {
27356                   continue;
27357               }
27358
27359               var hit = geoLineIntersection(p, q);
27360               if (hit) {
27361                   var epsilon = 1e-8;
27362                   // skip if the hit is at the segment's endpoint
27363                   if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) ||
27364                       geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) {
27365                       continue;
27366                   } else {
27367                       return true;
27368                   }
27369               }
27370           }
27371       }
27372
27373       return false;
27374   }
27375
27376
27377   // Return the intersection point of 2 line segments.
27378   // From https://github.com/pgkelley4/line-segments-intersect
27379   // This uses the vector cross product approach described below:
27380   //  http://stackoverflow.com/a/565282/786339
27381   function geoLineIntersection(a, b) {
27382       var p = [a[0][0], a[0][1]];
27383       var p2 = [a[1][0], a[1][1]];
27384       var q = [b[0][0], b[0][1]];
27385       var q2 = [b[1][0], b[1][1]];
27386       var r = geoVecSubtract(p2, p);
27387       var s = geoVecSubtract(q2, q);
27388       var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
27389       var denominator = geoVecCross(r, s);
27390
27391       if (uNumerator && denominator) {
27392           var u = uNumerator / denominator;
27393           var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
27394
27395           if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
27396               return geoVecInterp(p, p2, t);
27397           }
27398       }
27399
27400       return null;
27401   }
27402
27403
27404   function geoPathIntersections(path1, path2) {
27405       var intersections = [];
27406       for (var i = 0; i < path1.length - 1; i++) {
27407           for (var j = 0; j < path2.length - 1; j++) {
27408               var a = [ path1[i], path1[i+1] ];
27409               var b = [ path2[j], path2[j+1] ];
27410               var hit = geoLineIntersection(a, b);
27411               if (hit) {
27412                   intersections.push(hit);
27413               }
27414           }
27415       }
27416       return intersections;
27417   }
27418
27419   function geoPathHasIntersections(path1, path2) {
27420       for (var i = 0; i < path1.length - 1; i++) {
27421           for (var j = 0; j < path2.length - 1; j++) {
27422               var a = [ path1[i], path1[i+1] ];
27423               var b = [ path2[j], path2[j+1] ];
27424               var hit = geoLineIntersection(a, b);
27425               if (hit) {
27426                   return true;
27427               }
27428           }
27429       }
27430       return false;
27431   }
27432
27433
27434   // Return whether point is contained in polygon.
27435   //
27436   // `point` should be a 2-item array of coordinates.
27437   // `polygon` should be an array of 2-item arrays of coordinates.
27438   //
27439   // From https://github.com/substack/point-in-polygon.
27440   // ray-casting algorithm based on
27441   // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
27442   //
27443   function geoPointInPolygon(point, polygon) {
27444       var x = point[0];
27445       var y = point[1];
27446       var inside = false;
27447
27448       for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
27449           var xi = polygon[i][0];
27450           var yi = polygon[i][1];
27451           var xj = polygon[j][0];
27452           var yj = polygon[j][1];
27453
27454           var intersect = ((yi > y) !== (yj > y)) &&
27455               (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
27456           if (intersect) inside = !inside;
27457       }
27458
27459       return inside;
27460   }
27461
27462
27463   function geoPolygonContainsPolygon(outer, inner) {
27464       return every(inner, function(point) {
27465           return geoPointInPolygon(point, outer);
27466       });
27467   }
27468
27469
27470   function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
27471       function testPoints(outer, inner) {
27472           return some(inner, function(point) {
27473               return geoPointInPolygon(point, outer);
27474           });
27475       }
27476
27477      return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
27478   }
27479
27480
27481   function geoPathLength(path) {
27482       var length = 0;
27483       for (var i = 0; i < path.length - 1; i++) {
27484           length += geoVecLength(path[i], path[i + 1]);
27485       }
27486       return length;
27487   }
27488
27489
27490   // If the given point is at the edge of the padded viewport,
27491   // return a vector that will nudge the viewport in that direction
27492   function geoViewportEdge(point, dimensions) {
27493       var pad = [80, 20, 50, 20];   // top, right, bottom, left
27494       var x = 0;
27495       var y = 0;
27496
27497       if (point[0] > dimensions[0] - pad[1])
27498           x = -10;
27499       if (point[0] < pad[3])
27500           x = 10;
27501       if (point[1] > dimensions[1] - pad[2])
27502           y = -10;
27503       if (point[1] < pad[0])
27504           y = 10;
27505
27506       if (x || y) {
27507           return [x, y];
27508       } else {
27509           return null;
27510       }
27511   }
27512
27513   /*
27514       Bypasses features of D3's default projection stream pipeline that are unnecessary:
27515       * Antimeridian clipping
27516       * Spherical rotation
27517       * Resampling
27518   */
27519   function geoRawMercator() {
27520       var project = mercatorRaw;
27521       var k = 512 / Math.PI; // scale
27522       var x = 0;
27523       var y = 0; // translate
27524       var clipExtent = [[0, 0], [0, 0]];
27525
27526
27527       function projection(point) {
27528           point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
27529           return [point[0] * k + x, y - point[1] * k];
27530       }
27531
27532
27533       projection.invert = function(point) {
27534           point = project.invert((point[0] - x) / k, (y - point[1]) / k);
27535           return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
27536       };
27537
27538
27539       projection.scale = function(_) {
27540           if (!arguments.length) return k;
27541           k = +_;
27542           return projection;
27543       };
27544
27545
27546       projection.translate = function(_) {
27547           if (!arguments.length) return [x, y];
27548           x = +_[0];
27549           y = +_[1];
27550           return projection;
27551       };
27552
27553
27554       projection.clipExtent = function(_) {
27555           if (!arguments.length) return clipExtent;
27556           clipExtent = _;
27557           return projection;
27558       };
27559
27560
27561       projection.transform = function(obj) {
27562           if (!arguments.length) return identity$7.translate(x, y).scale(k);
27563           x = +obj.x;
27564           y = +obj.y;
27565           k = +obj.k;
27566           return projection;
27567       };
27568
27569
27570       projection.stream = d3_geoTransform({
27571           point: function(x, y) {
27572               var vec = projection([x, y]);
27573               this.stream.point(vec[0], vec[1]);
27574           }
27575       }).stream;
27576
27577
27578       return projection;
27579   }
27580
27581   function osmChangeset() {
27582       if (!(this instanceof osmChangeset)) {
27583           return (new osmChangeset()).initialize(arguments);
27584       } else if (arguments.length) {
27585           this.initialize(arguments);
27586       }
27587   }
27588
27589
27590   osmEntity.changeset = osmChangeset;
27591
27592   osmChangeset.prototype = Object.create(osmEntity.prototype);
27593
27594   assignIn(osmChangeset.prototype, {
27595
27596       type: 'changeset',
27597
27598
27599       extent: function() {
27600           return new geoExtent();
27601       },
27602
27603
27604       geometry: function() {
27605           return 'changeset';
27606       },
27607
27608
27609       asJXON: function() {
27610           return {
27611               osm: {
27612                   changeset: {
27613                       tag: map$3(this.tags, function(value, key) {
27614                           return { '@k': key, '@v': value };
27615                       }),
27616                       '@version': 0.6,
27617                       '@generator': 'iD'
27618                   }
27619               }
27620           };
27621       },
27622
27623
27624       // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
27625       // XML. Returns a string.
27626       osmChangeJXON: function(changes) {
27627           var changeset_id = this.id;
27628
27629           function nest(x, order) {
27630               var groups = {};
27631               for (var i = 0; i < x.length; i++) {
27632                   var tagName = Object.keys(x[i])[0];
27633                   if (!groups[tagName]) groups[tagName] = [];
27634                   groups[tagName].push(x[i][tagName]);
27635               }
27636               var ordered = {};
27637               order.forEach(function(o) {
27638                   if (groups[o]) ordered[o] = groups[o];
27639               });
27640               return ordered;
27641           }
27642
27643
27644           // sort relations in a changeset by dependencies
27645           function sort(changes) {
27646
27647               // find a referenced relation in the current changeset
27648               function resolve(item) {
27649                   return find$1(relations, function(relation) {
27650                       return item.keyAttributes.type === 'relation'
27651                           && item.keyAttributes.ref === relation['@id'];
27652                   });
27653               }
27654
27655               // a new item is an item that has not been already processed
27656               function isNew(item) {
27657                   return !sorted[ item['@id'] ] && !find$1(processing, function(proc) {
27658                       return proc['@id'] === item['@id'];
27659                   });
27660               }
27661
27662               var processing = [],
27663                   sorted = {},
27664                   relations = changes.relation;
27665
27666               if (!relations) return changes;
27667
27668               for (var i = 0; i < relations.length; i++) {
27669                   var relation = relations[i];
27670
27671                   // skip relation if already sorted
27672                   if (!sorted[relation['@id']]) {
27673                       processing.push(relation);
27674                   }
27675
27676                   while (processing.length > 0) {
27677                       var next = processing[0],
27678                       deps = filter(compact(next.member.map(resolve)), isNew);
27679                       if (deps.length === 0) {
27680                           sorted[next['@id']] = next;
27681                           processing.shift();
27682                       } else {
27683                           processing = deps.concat(processing);
27684                       }
27685                   }
27686               }
27687
27688               changes.relation = values$1(sorted);
27689               return changes;
27690           }
27691
27692           function rep(entity) {
27693               return entity.asJXON(changeset_id);
27694           }
27695
27696           return {
27697               osmChange: {
27698                   '@version': 0.6,
27699                   '@generator': 'iD',
27700                   'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
27701                   'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
27702                   'delete': assignIn(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
27703               }
27704           };
27705       },
27706
27707
27708       asGeoJSON: function() {
27709           return {};
27710       }
27711
27712   });
27713
27714   /**
27715    * Creates a duplicate-free version of an array, using
27716    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
27717    * for equality comparisons, in which only the first occurrence of each element
27718    * is kept. The order of result values is determined by the order they occur
27719    * in the array.
27720    *
27721    * @static
27722    * @memberOf _
27723    * @since 0.1.0
27724    * @category Array
27725    * @param {Array} array The array to inspect.
27726    * @returns {Array} Returns the new duplicate free array.
27727    * @example
27728    *
27729    * _.uniq([2, 1, 2]);
27730    * // => [2, 1]
27731    */
27732   function uniq(array) {
27733     return (array && array.length) ? baseUniq(array) : [];
27734   }
27735
27736   function osmNode() {
27737       if (!(this instanceof osmNode)) {
27738           return (new osmNode()).initialize(arguments);
27739       } else if (arguments.length) {
27740           this.initialize(arguments);
27741       }
27742   }
27743
27744   osmEntity.node = osmNode;
27745
27746   osmNode.prototype = Object.create(osmEntity.prototype);
27747
27748   assignIn(osmNode.prototype, {
27749
27750       type: 'node',
27751
27752
27753       extent: function() {
27754           return new geoExtent(this.loc);
27755       },
27756
27757
27758       geometry: function(graph) {
27759           return graph.transient(this, 'geometry', function() {
27760               return graph.isPoi(this) ? 'point' : 'vertex';
27761           });
27762       },
27763
27764
27765       move: function(loc) {
27766           return this.update({loc: loc});
27767       },
27768
27769
27770       isDegenerate: function() {
27771           return !(
27772               Array.isArray(this.loc) && this.loc.length === 2 &&
27773               this.loc[0] >= -180 && this.loc[0] <= 180 &&
27774               this.loc[1] >= -90 && this.loc[1] <= 90
27775           );
27776       },
27777
27778
27779       // Inspect tags and geometry to determine which direction(s) this node/vertex points
27780       directions: function(resolver, projection) {
27781           var val;
27782           var i;
27783
27784           // which tag to use?
27785           if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
27786               // all-way stop tag on a highway intersection
27787               val = 'all';
27788           } else {
27789               // generic direction tag
27790               val = (this.tags.direction || '').toLowerCase();
27791
27792               // better suffix-style direction tag
27793               var re = /:direction$/i;
27794               var keys = Object.keys(this.tags);
27795               for (i = 0; i < keys.length; i++) {
27796                   if (re.test(keys[i])) {
27797                       val = this.tags[keys[i]].toLowerCase();
27798                       break;
27799                   }
27800               }
27801           }
27802
27803           if (val === '') return [];
27804
27805           var cardinal = {
27806               north: 0,               n: 0,
27807               northnortheast: 22,     nne: 22,
27808               northeast: 45,          ne: 45,
27809               eastnortheast: 67,      ene: 67,
27810               east: 90,               e: 90,
27811               eastsoutheast: 112,     ese: 112,
27812               southeast: 135,         se: 135,
27813               southsoutheast: 157,    sse: 157,
27814               south: 180,             s: 180,
27815               southsouthwest: 202,    ssw: 202,
27816               southwest: 225,         sw: 225,
27817               westsouthwest: 247,     wsw: 247,
27818               west: 270,              w: 270,
27819               westnorthwest: 292,     wnw: 292,
27820               northwest: 315,         nw: 315,
27821               northnorthwest: 337,    nnw: 337
27822           };
27823
27824
27825           var values = val.split(';');
27826           var results = [];
27827
27828           values.forEach(function(v) {
27829               // swap cardinal for numeric directions
27830               if (cardinal[v] !== undefined) {
27831                   v = cardinal[v];
27832               }
27833
27834               // numeric direction - just add to results
27835               if (v !== '' && !isNaN(+v)) {
27836                   results.push(+v);
27837                   return;
27838               }
27839
27840               // string direction - inspect parent ways
27841               var lookBackward =
27842                   (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
27843               var lookForward =
27844                   (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
27845
27846               if (!lookForward && !lookBackward) return;
27847
27848               var nodeIds = {};
27849               resolver.parentWays(this).forEach(function(parent) {
27850                   var nodes = parent.nodes;
27851                   for (i = 0; i < nodes.length; i++) {
27852                       if (nodes[i] === this.id) {  // match current entity
27853                           if (lookForward && i > 0) {
27854                               nodeIds[nodes[i - 1]] = true;  // look back to prev node
27855                           }
27856                           if (lookBackward && i < nodes.length - 1) {
27857                               nodeIds[nodes[i + 1]] = true;  // look ahead to next node
27858                           }
27859                       }
27860                   }
27861               }, this);
27862
27863               Object.keys(nodeIds).forEach(function(nodeId) {
27864                   // +90 because geoAngle returns angle from X axis, not Y (north)
27865                   results.push(
27866                       (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
27867                   );
27868               }, this);
27869
27870           }, this);
27871
27872           return uniq(results);
27873       },
27874
27875
27876       isEndpoint: function(resolver) {
27877           return resolver.transient(this, 'isEndpoint', function() {
27878               var id = this.id;
27879               return resolver.parentWays(this).filter(function(parent) {
27880                   return !parent.isClosed() && !!parent.affix(id);
27881               }).length > 0;
27882           });
27883       },
27884
27885
27886       isConnected: function(resolver) {
27887           return resolver.transient(this, 'isConnected', function() {
27888               var parents = resolver.parentWays(this);
27889
27890               function isLine(entity) {
27891                   return entity.geometry(resolver) === 'line' &&
27892                       entity.hasInterestingTags();
27893               }
27894
27895               // vertex is connected to multiple parent lines
27896               if (parents.length > 1 && some(parents, isLine)) {
27897                   return true;
27898
27899               } else if (parents.length === 1) {
27900                   var way = parents[0],
27901                       nodes = way.nodes.slice();
27902                   if (way.isClosed()) { nodes.pop(); }  // ignore connecting node if closed
27903
27904                   // return true if vertex appears multiple times (way is self intersecting)
27905                   return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
27906               }
27907
27908               return false;
27909           });
27910       },
27911
27912
27913       isIntersection: function(resolver) {
27914           return resolver.transient(this, 'isIntersection', function() {
27915               return resolver.parentWays(this).filter(function(parent) {
27916                   return (parent.tags.highway ||
27917                       parent.tags.waterway ||
27918                       parent.tags.railway ||
27919                       parent.tags.aeroway) &&
27920                       parent.geometry(resolver) === 'line';
27921               }).length > 1;
27922           });
27923       },
27924
27925
27926       isHighwayIntersection: function(resolver) {
27927           return resolver.transient(this, 'isHighwayIntersection', function() {
27928               return resolver.parentWays(this).filter(function(parent) {
27929                   return parent.tags.highway && parent.geometry(resolver) === 'line';
27930               }).length > 1;
27931           });
27932       },
27933
27934
27935       isOnAddressLine: function(resolver) {
27936           return resolver.transient(this, 'isOnAddressLine', function() {
27937               return resolver.parentWays(this).filter(function(parent) {
27938                   return parent.tags.hasOwnProperty('addr:interpolation') &&
27939                       parent.geometry(resolver) === 'line';
27940               }).length > 0;
27941           });
27942       },
27943
27944
27945       asJXON: function(changeset_id) {
27946           var r = {
27947               node: {
27948                   '@id': this.osmId(),
27949                   '@lon': this.loc[0],
27950                   '@lat': this.loc[1],
27951                   '@version': (this.version || 0),
27952                   tag: map$3(this.tags, function(v, k) {
27953                       return { keyAttributes: { k: k, v: v } };
27954                   })
27955               }
27956           };
27957           if (changeset_id) r.node['@changeset'] = changeset_id;
27958           return r;
27959       },
27960
27961
27962       asGeoJSON: function() {
27963           return {
27964               type: 'Point',
27965               coordinates: this.loc
27966           };
27967       }
27968   });
27969
27970   function osmNote() {
27971       if (!(this instanceof osmNote)) {
27972           return (new osmNote()).initialize(arguments);
27973       } else if (arguments.length) {
27974           this.initialize(arguments);
27975       }
27976   }
27977
27978
27979   osmNote.id = function() {
27980       return osmNote.id.next--;
27981   };
27982
27983
27984   osmNote.id.next = -1;
27985
27986
27987   assignIn(osmNote.prototype, {
27988
27989       type: 'note',
27990
27991       initialize: function(sources) {
27992           for (var i = 0; i < sources.length; ++i) {
27993               var source = sources[i];
27994               for (var prop in source) {
27995                   if (Object.prototype.hasOwnProperty.call(source, prop)) {
27996                       if (source[prop] === undefined) {
27997                           delete this[prop];
27998                       } else {
27999                           this[prop] = source[prop];
28000                       }
28001                   }
28002               }
28003           }
28004
28005           if (!this.id) {
28006               this.id = osmNote.id() + '';  // as string
28007           }
28008
28009           return this;
28010       },
28011
28012       extent: function() {
28013           return new geoExtent(this.loc);
28014       },
28015
28016       update: function(attrs) {
28017           return osmNote(this, attrs); // {v: 1 + (this.v || 0)}
28018       },
28019
28020       isNew: function() {
28021           return this.id < 0;
28022       },
28023
28024       move: function(loc) {
28025           return this.update({ loc: loc });
28026       }
28027
28028   });
28029
28030   /** Error message constants. */
28031   var FUNC_ERROR_TEXT$1 = 'Expected a function';
28032
28033   /**
28034    * Creates a function that negates the result of the predicate `func`. The
28035    * `func` predicate is invoked with the `this` binding and arguments of the
28036    * created function.
28037    *
28038    * @static
28039    * @memberOf _
28040    * @since 3.0.0
28041    * @category Function
28042    * @param {Function} predicate The predicate to negate.
28043    * @returns {Function} Returns the new negated function.
28044    * @example
28045    *
28046    * function isEven(n) {
28047    *   return n % 2 == 0;
28048    * }
28049    *
28050    * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
28051    * // => [1, 3, 5]
28052    */
28053   function negate(predicate) {
28054     if (typeof predicate != 'function') {
28055       throw new TypeError(FUNC_ERROR_TEXT$1);
28056     }
28057     return function() {
28058       var args = arguments;
28059       switch (args.length) {
28060         case 0: return !predicate.call(this);
28061         case 1: return !predicate.call(this, args[0]);
28062         case 2: return !predicate.call(this, args[0], args[1]);
28063         case 3: return !predicate.call(this, args[0], args[1], args[2]);
28064       }
28065       return !predicate.apply(this, args);
28066     };
28067   }
28068
28069   /**
28070    * The opposite of `_.filter`; this method returns the elements of `collection`
28071    * that `predicate` does **not** return truthy for.
28072    *
28073    * @static
28074    * @memberOf _
28075    * @since 0.1.0
28076    * @category Collection
28077    * @param {Array|Object} collection The collection to iterate over.
28078    * @param {Function} [predicate=_.identity] The function invoked per iteration.
28079    * @returns {Array} Returns the new filtered array.
28080    * @see _.filter
28081    * @example
28082    *
28083    * var users = [
28084    *   { 'user': 'barney', 'age': 36, 'active': false },
28085    *   { 'user': 'fred',   'age': 40, 'active': true }
28086    * ];
28087    *
28088    * _.reject(users, function(o) { return !o.active; });
28089    * // => objects for ['fred']
28090    *
28091    * // The `_.matches` iteratee shorthand.
28092    * _.reject(users, { 'age': 40, 'active': true });
28093    * // => objects for ['barney']
28094    *
28095    * // The `_.matchesProperty` iteratee shorthand.
28096    * _.reject(users, ['active', false]);
28097    * // => objects for ['fred']
28098    *
28099    * // The `_.property` iteratee shorthand.
28100    * _.reject(users, 'active');
28101    * // => objects for ['barney']
28102    */
28103   function reject(collection, predicate) {
28104     var func = isArray(collection) ? arrayFilter : baseFilter;
28105     return func(collection, negate(baseIteratee(predicate, 3)));
28106   }
28107
28108   /*
28109   Order the nodes of a way in reverse order and reverse any direction dependent tags
28110   other than `oneway`. (We assume that correcting a backwards oneway is the primary
28111   reason for reversing a way.)
28112
28113   In addition, numeric-valued `incline` tags are negated.
28114
28115   The JOSM implementation was used as a guide, but transformations that were of unclear benefit
28116   or adjusted tags that don't seem to be used in practice were omitted.
28117
28118   References:
28119       http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
28120       http://wiki.openstreetmap.org/wiki/Key:direction#Steps
28121       http://wiki.openstreetmap.org/wiki/Key:incline
28122       http://wiki.openstreetmap.org/wiki/Route#Members
28123       http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
28124       http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
28125       http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
28126   */
28127   function actionReverse(wayID, options) {
28128       var ignoreKey = /^.*(_|:)?(description|name|note|website|ref|source|comment|watch|attribution)(_|:)?/;
28129       var numeric = /^([+\-]?)(?=[\d.])/;
28130       var turn_lanes = /^turn:lanes:?/;
28131       var keyReplacements = [
28132           [/:right$/, ':left'],
28133           [/:left$/, ':right'],
28134           [/:forward$/, ':backward'],
28135           [/:backward$/, ':forward']
28136       ];
28137       var valueReplacements = {
28138           left: 'right',
28139           right: 'left',
28140           up: 'down',
28141           down: 'up',
28142           forward: 'backward',
28143           backward: 'forward',
28144           forwards: 'backward',
28145           backwards: 'forward',
28146       };
28147       var roleReplacements = {
28148           forward: 'backward',
28149           backward: 'forward',
28150           forwards: 'backward',
28151           backwards: 'forward'
28152       };
28153       var onewayReplacements = {
28154           yes: '-1',
28155           '1': '-1',
28156           '-1': 'yes'
28157       };
28158
28159
28160       function reverseKey(key) {
28161           for (var i = 0; i < keyReplacements.length; ++i) {
28162               var replacement = keyReplacements[i];
28163               if (replacement[0].test(key)) {
28164                   return key.replace(replacement[0], replacement[1]);
28165               }
28166           }
28167           return key;
28168       }
28169
28170
28171       function reverseValue(key, value) {
28172           if (ignoreKey.test(key)) return value;
28173
28174           // Turn lanes are left/right to key (not way) direction - #5674
28175           if (turn_lanes.test(key)) {
28176               return value;
28177           } else if (key === 'incline' && numeric.test(value)) {
28178               return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
28179           } else if (options && options.reverseOneway && key === 'oneway') {
28180               return onewayReplacements[value] || value;
28181           } else {
28182               return valueReplacements[value] || value;
28183           }
28184       }
28185
28186
28187       // Reverse the direction of tags attached to the nodes - #3076
28188       function reverseNodeTags(graph, nodeIDs) {
28189           for (var i = 0; i < nodeIDs.length; i++) {
28190               var node = graph.hasEntity(nodeIDs[i]);
28191               if (!node || !Object.keys(node.tags).length) continue;
28192
28193               var tags = {};
28194               for (var key in node.tags) {
28195                   tags[reverseKey(key)] = reverseValue(key, node.tags[key]);
28196               }
28197               graph = graph.replace(node.update({tags: tags}));
28198           }
28199           return graph;
28200       }
28201
28202
28203       return function(graph) {
28204           var way = graph.entity(wayID);
28205           var nodes = way.nodes.slice().reverse();
28206           var tags = {};
28207           var role;
28208
28209           for (var key in way.tags) {
28210               tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
28211           }
28212
28213           graph.parentRelations(way).forEach(function(relation) {
28214               relation.members.forEach(function(member, index) {
28215                   if (member.id === way.id && (role = roleReplacements[member.role])) {
28216                       relation = relation.updateMember({role: role}, index);
28217                       graph = graph.replace(relation);
28218                   }
28219               });
28220           });
28221
28222           // Reverse any associated directions on nodes on the way and then replace
28223           // the way itself with the reversed node ids and updated way tags
28224           return reverseNodeTags(graph, nodes)
28225               .replace(way.update({nodes: nodes, tags: tags}));
28226       };
28227   }
28228
28229   /** `Object#toString` result references. */
28230   var numberTag$4 = '[object Number]';
28231
28232   /**
28233    * Checks if `value` is classified as a `Number` primitive or object.
28234    *
28235    * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
28236    * classified as numbers, use the `_.isFinite` method.
28237    *
28238    * @static
28239    * @memberOf _
28240    * @since 0.1.0
28241    * @category Lang
28242    * @param {*} value The value to check.
28243    * @returns {boolean} Returns `true` if `value` is a number, else `false`.
28244    * @example
28245    *
28246    * _.isNumber(3);
28247    * // => true
28248    *
28249    * _.isNumber(Number.MIN_VALUE);
28250    * // => true
28251    *
28252    * _.isNumber(Infinity);
28253    * // => true
28254    *
28255    * _.isNumber('3');
28256    * // => false
28257    */
28258   function isNumber(value) {
28259     return typeof value == 'number' ||
28260       (isObjectLike(value) && baseGetTag(value) == numberTag$4);
28261   }
28262
28263   /** `Object#toString` result references. */
28264   var stringTag$4 = '[object String]';
28265
28266   /**
28267    * Checks if `value` is classified as a `String` primitive or object.
28268    *
28269    * @static
28270    * @since 0.1.0
28271    * @memberOf _
28272    * @category Lang
28273    * @param {*} value The value to check.
28274    * @returns {boolean} Returns `true` if `value` is a string, else `false`.
28275    * @example
28276    *
28277    * _.isString('abc');
28278    * // => true
28279    *
28280    * _.isString(1);
28281    * // => false
28282    */
28283   function isString(value) {
28284     return typeof value == 'string' ||
28285       (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag$4);
28286   }
28287
28288   /**
28289    * Checks if `value` is `NaN`.
28290    *
28291    * **Note:** This method is based on
28292    * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
28293    * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
28294    * `undefined` and other non-number values.
28295    *
28296    * @static
28297    * @memberOf _
28298    * @since 0.1.0
28299    * @category Lang
28300    * @param {*} value The value to check.
28301    * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
28302    * @example
28303    *
28304    * _.isNaN(NaN);
28305    * // => true
28306    *
28307    * _.isNaN(new Number(NaN));
28308    * // => true
28309    *
28310    * isNaN(undefined);
28311    * // => true
28312    *
28313    * _.isNaN(undefined);
28314    * // => false
28315    */
28316   function isNaN$1(value) {
28317     // An `NaN` primitive is the only value that is not equal to itself.
28318     // Perform the `toStringTag` check first to avoid errors with some
28319     // ActiveX objects in IE.
28320     return isNumber(value) && value != +value;
28321   }
28322
28323   function osmLanes(entity) {
28324       if (entity.type !== 'way') return null;
28325       if (!entity.tags.highway) return null;
28326
28327       var tags = entity.tags;
28328       var isOneWay = entity.isOneWay();
28329       var laneCount = getLaneCount(tags, isOneWay);
28330       var maxspeed = parseMaxspeed(tags);
28331
28332       var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
28333       var forward = laneDirections.forward;
28334       var backward = laneDirections.backward;
28335       var bothways = laneDirections.bothways;
28336
28337       // parse the piped string 'x|y|z' format
28338       var turnLanes = {};
28339       turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
28340       turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
28341       turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
28342
28343       var maxspeedLanes = {};
28344       maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
28345       maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
28346       maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
28347
28348       var psvLanes = {};
28349       psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
28350       psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
28351       psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
28352
28353       var busLanes = {};
28354       busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
28355       busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
28356       busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
28357
28358       var taxiLanes = {};
28359       taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
28360       taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
28361       taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
28362
28363       var hovLanes = {};
28364       hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
28365       hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
28366       hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
28367
28368       var hgvLanes = {};
28369       hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
28370       hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
28371       hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
28372
28373       var bicyclewayLanes = {};
28374       bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
28375       bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
28376       bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
28377
28378       var lanesObj = {
28379           forward: [],
28380           backward: [],
28381           unspecified: []
28382       };
28383
28384       // map forward/backward/unspecified of each lane type to lanesObj
28385       mapToLanesObj(lanesObj, turnLanes, 'turnLane');
28386       mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
28387       mapToLanesObj(lanesObj, psvLanes, 'psv');
28388       mapToLanesObj(lanesObj, busLanes, 'bus');
28389       mapToLanesObj(lanesObj, taxiLanes, 'taxi');
28390       mapToLanesObj(lanesObj, hovLanes, 'hov');
28391       mapToLanesObj(lanesObj, hgvLanes, 'hgv');
28392       mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
28393
28394       return {
28395           metadata: {
28396               count: laneCount,
28397               oneway: isOneWay,
28398               forward: forward,
28399               backward: backward,
28400               bothways: bothways,
28401               turnLanes: turnLanes,
28402               maxspeed: maxspeed,
28403               maxspeedLanes: maxspeedLanes,
28404               psvLanes: psvLanes,
28405               busLanes: busLanes,
28406               taxiLanes: taxiLanes,
28407               hovLanes: hovLanes,
28408               hgvLanes: hgvLanes,
28409               bicyclewayLanes: bicyclewayLanes
28410           },
28411           lanes: lanesObj
28412       };
28413   }
28414
28415
28416   function getLaneCount(tags, isOneWay) {
28417       var count;
28418       if (tags.lanes) {
28419           count = parseInt(tags.lanes, 10);
28420           if (count > 0) {
28421               return count;
28422           }
28423       }
28424
28425
28426       switch (tags.highway) {
28427           case 'trunk':
28428           case 'motorway':
28429               count = isOneWay ? 2 : 4;
28430               break;
28431           default:
28432               count = isOneWay ? 1 : 2;
28433               break;
28434       }
28435
28436       return count;
28437   }
28438
28439
28440   function parseMaxspeed(tags) {
28441       var maxspeed = tags.maxspeed;
28442       if (isNumber(maxspeed)) return maxspeed;
28443       if (isString(maxspeed)) {
28444           maxspeed = maxspeed.match(/^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/g);
28445           if (!maxspeed) return;
28446           return parseInt(maxspeed, 10);
28447       }
28448   }
28449
28450
28451   function parseLaneDirections(tags, isOneWay, laneCount) {
28452       var forward = parseInt(tags['lanes:forward'], 10);
28453       var backward = parseInt(tags['lanes:backward'], 10);
28454       var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
28455
28456       if (parseInt(tags.oneway, 10) === -1) {
28457           forward = 0;
28458           bothways = 0;
28459           backward = laneCount;
28460       }
28461       else if (isOneWay) {
28462           forward = laneCount;
28463           bothways = 0;
28464           backward = 0;
28465       }
28466       else if (isNaN$1(forward) && isNaN$1(backward)) {
28467           backward = Math.floor((laneCount - bothways) / 2);
28468           forward = laneCount - bothways - backward;
28469       }
28470       else if (isNaN$1(forward)) {
28471           if (backward > laneCount - bothways) {
28472               backward = laneCount - bothways;
28473           }
28474           forward = laneCount - bothways - backward;
28475       }
28476       else if (isNaN$1(backward)) {
28477           if (forward > laneCount - bothways) {
28478               forward = laneCount - bothways;
28479           }
28480           backward = laneCount - bothways - forward;
28481       }
28482       return {
28483           forward: forward,
28484           backward: backward,
28485           bothways: bothways
28486       };
28487   }
28488
28489
28490   function parseTurnLanes(tag){
28491       if (!tag) return;
28492
28493       var validValues = [
28494           'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
28495           'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
28496       ];
28497
28498       return tag.split('|')
28499           .map(function (s) {
28500               if (s === '') s = 'none';
28501               return s.split(';')
28502                   .map(function (d) {
28503                       return validValues.indexOf(d) === -1 ? 'unknown': d;
28504                   });
28505           });
28506   }
28507
28508
28509   function parseMaxspeedLanes(tag, maxspeed) {
28510       if (!tag) return;
28511
28512       return tag.split('|')
28513           .map(function (s) {
28514               if (s === 'none') return s;
28515               var m = parseInt(s, 10);
28516               if (s === '' || m === maxspeed) return null;
28517               return isNaN$1(m) ? 'unknown': m;
28518           });
28519   }
28520
28521
28522   function parseMiscLanes(tag) {
28523       if (!tag) return;
28524
28525       var validValues = [
28526           'yes', 'no', 'designated'
28527       ];
28528
28529       return tag.split('|')
28530           .map(function (s) {
28531               if (s === '') s = 'no';
28532               return validValues.indexOf(s) === -1 ? 'unknown': s;
28533           });
28534   }
28535
28536
28537   function parseBicycleWay(tag) {
28538       if (!tag) return;
28539
28540       var validValues = [
28541           'yes', 'no', 'designated', 'lane'
28542       ];
28543
28544       return tag.split('|')
28545           .map(function (s) {
28546               if (s === '') s = 'no';
28547               return validValues.indexOf(s) === -1 ? 'unknown': s;
28548           });
28549   }
28550
28551
28552   function mapToLanesObj(lanesObj, data, key) {
28553       if (data.forward) data.forward.forEach(function(l, i) {
28554           if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
28555           lanesObj.forward[i][key] = l;
28556       });
28557       if (data.backward) data.backward.forEach(function(l, i) {
28558           if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
28559           lanesObj.backward[i][key] = l;
28560       });
28561       if (data.unspecified) data.unspecified.forEach(function(l, i) {
28562           if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
28563           lanesObj.unspecified[i][key] = l;
28564       });
28565   }
28566
28567   /** Used to compose bitmasks for cloning. */
28568   var CLONE_DEEP_FLAG$2 = 1,
28569       CLONE_SYMBOLS_FLAG$3 = 4;
28570
28571   /**
28572    * This method is like `_.clone` except that it recursively clones `value`.
28573    *
28574    * @static
28575    * @memberOf _
28576    * @since 1.0.0
28577    * @category Lang
28578    * @param {*} value The value to recursively clone.
28579    * @returns {*} Returns the deep cloned value.
28580    * @see _.clone
28581    * @example
28582    *
28583    * var objects = [{ 'a': 1 }, { 'b': 2 }];
28584    *
28585    * var deep = _.cloneDeep(objects);
28586    * console.log(deep[0] === objects[0]);
28587    * // => false
28588    */
28589   function cloneDeep(value) {
28590     return baseClone(value, CLONE_DEEP_FLAG$2 | CLONE_SYMBOLS_FLAG$3);
28591   }
28592
28593   /**
28594    * Gets the timestamp of the number of milliseconds that have elapsed since
28595    * the Unix epoch (1 January 1970 00:00:00 UTC).
28596    *
28597    * @static
28598    * @memberOf _
28599    * @since 2.4.0
28600    * @category Date
28601    * @returns {number} Returns the timestamp.
28602    * @example
28603    *
28604    * _.defer(function(stamp) {
28605    *   console.log(_.now() - stamp);
28606    * }, _.now());
28607    * // => Logs the number of milliseconds it took for the deferred invocation.
28608    */
28609   var now$1 = function() {
28610     return root$2.Date.now();
28611   };
28612
28613   /** Error message constants. */
28614   var FUNC_ERROR_TEXT$2 = 'Expected a function';
28615
28616   /* Built-in method references for those with the same name as other `lodash` methods. */
28617   var nativeMax$2 = Math.max,
28618       nativeMin = Math.min;
28619
28620   /**
28621    * Creates a debounced function that delays invoking `func` until after `wait`
28622    * milliseconds have elapsed since the last time the debounced function was
28623    * invoked. The debounced function comes with a `cancel` method to cancel
28624    * delayed `func` invocations and a `flush` method to immediately invoke them.
28625    * Provide `options` to indicate whether `func` should be invoked on the
28626    * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
28627    * with the last arguments provided to the debounced function. Subsequent
28628    * calls to the debounced function return the result of the last `func`
28629    * invocation.
28630    *
28631    * **Note:** If `leading` and `trailing` options are `true`, `func` is
28632    * invoked on the trailing edge of the timeout only if the debounced function
28633    * is invoked more than once during the `wait` timeout.
28634    *
28635    * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
28636    * until to the next tick, similar to `setTimeout` with a timeout of `0`.
28637    *
28638    * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
28639    * for details over the differences between `_.debounce` and `_.throttle`.
28640    *
28641    * @static
28642    * @memberOf _
28643    * @since 0.1.0
28644    * @category Function
28645    * @param {Function} func The function to debounce.
28646    * @param {number} [wait=0] The number of milliseconds to delay.
28647    * @param {Object} [options={}] The options object.
28648    * @param {boolean} [options.leading=false]
28649    *  Specify invoking on the leading edge of the timeout.
28650    * @param {number} [options.maxWait]
28651    *  The maximum time `func` is allowed to be delayed before it's invoked.
28652    * @param {boolean} [options.trailing=true]
28653    *  Specify invoking on the trailing edge of the timeout.
28654    * @returns {Function} Returns the new debounced function.
28655    * @example
28656    *
28657    * // Avoid costly calculations while the window size is in flux.
28658    * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
28659    *
28660    * // Invoke `sendMail` when clicked, debouncing subsequent calls.
28661    * jQuery(element).on('click', _.debounce(sendMail, 300, {
28662    *   'leading': true,
28663    *   'trailing': false
28664    * }));
28665    *
28666    * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
28667    * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
28668    * var source = new EventSource('/stream');
28669    * jQuery(source).on('message', debounced);
28670    *
28671    * // Cancel the trailing debounced invocation.
28672    * jQuery(window).on('popstate', debounced.cancel);
28673    */
28674   function debounce(func, wait, options) {
28675     var lastArgs,
28676         lastThis,
28677         maxWait,
28678         result,
28679         timerId,
28680         lastCallTime,
28681         lastInvokeTime = 0,
28682         leading = false,
28683         maxing = false,
28684         trailing = true;
28685
28686     if (typeof func != 'function') {
28687       throw new TypeError(FUNC_ERROR_TEXT$2);
28688     }
28689     wait = toNumber(wait) || 0;
28690     if (isObject(options)) {
28691       leading = !!options.leading;
28692       maxing = 'maxWait' in options;
28693       maxWait = maxing ? nativeMax$2(toNumber(options.maxWait) || 0, wait) : maxWait;
28694       trailing = 'trailing' in options ? !!options.trailing : trailing;
28695     }
28696
28697     function invokeFunc(time) {
28698       var args = lastArgs,
28699           thisArg = lastThis;
28700
28701       lastArgs = lastThis = undefined;
28702       lastInvokeTime = time;
28703       result = func.apply(thisArg, args);
28704       return result;
28705     }
28706
28707     function leadingEdge(time) {
28708       // Reset any `maxWait` timer.
28709       lastInvokeTime = time;
28710       // Start the timer for the trailing edge.
28711       timerId = setTimeout(timerExpired, wait);
28712       // Invoke the leading edge.
28713       return leading ? invokeFunc(time) : result;
28714     }
28715
28716     function remainingWait(time) {
28717       var timeSinceLastCall = time - lastCallTime,
28718           timeSinceLastInvoke = time - lastInvokeTime,
28719           timeWaiting = wait - timeSinceLastCall;
28720
28721       return maxing
28722         ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
28723         : timeWaiting;
28724     }
28725
28726     function shouldInvoke(time) {
28727       var timeSinceLastCall = time - lastCallTime,
28728           timeSinceLastInvoke = time - lastInvokeTime;
28729
28730       // Either this is the first call, activity has stopped and we're at the
28731       // trailing edge, the system time has gone backwards and we're treating
28732       // it as the trailing edge, or we've hit the `maxWait` limit.
28733       return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
28734         (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
28735     }
28736
28737     function timerExpired() {
28738       var time = now$1();
28739       if (shouldInvoke(time)) {
28740         return trailingEdge(time);
28741       }
28742       // Restart the timer.
28743       timerId = setTimeout(timerExpired, remainingWait(time));
28744     }
28745
28746     function trailingEdge(time) {
28747       timerId = undefined;
28748
28749       // Only invoke if we have `lastArgs` which means `func` has been
28750       // debounced at least once.
28751       if (trailing && lastArgs) {
28752         return invokeFunc(time);
28753       }
28754       lastArgs = lastThis = undefined;
28755       return result;
28756     }
28757
28758     function cancel() {
28759       if (timerId !== undefined) {
28760         clearTimeout(timerId);
28761       }
28762       lastInvokeTime = 0;
28763       lastArgs = lastCallTime = lastThis = timerId = undefined;
28764     }
28765
28766     function flush() {
28767       return timerId === undefined ? result : trailingEdge(now$1());
28768     }
28769
28770     function debounced() {
28771       var time = now$1(),
28772           isInvoking = shouldInvoke(time);
28773
28774       lastArgs = arguments;
28775       lastThis = this;
28776       lastCallTime = time;
28777
28778       if (isInvoking) {
28779         if (timerId === undefined) {
28780           return leadingEdge(lastCallTime);
28781         }
28782         if (maxing) {
28783           // Handle invocations in a tight loop.
28784           timerId = setTimeout(timerExpired, wait);
28785           return invokeFunc(lastCallTime);
28786         }
28787       }
28788       if (timerId === undefined) {
28789         timerId = setTimeout(timerExpired, wait);
28790       }
28791       return result;
28792     }
28793     debounced.cancel = cancel;
28794     debounced.flush = flush;
28795     return debounced;
28796   }
28797
28798   /**
28799    * Casts `value` to `identity` if it's not a function.
28800    *
28801    * @private
28802    * @param {*} value The value to inspect.
28803    * @returns {Function} Returns cast function.
28804    */
28805   function castFunction(value) {
28806     return typeof value == 'function' ? value : identity$8;
28807   }
28808
28809   /**
28810    * Iterates over elements of `collection` and invokes `iteratee` for each element.
28811    * The iteratee is invoked with three arguments: (value, index|key, collection).
28812    * Iteratee functions may exit iteration early by explicitly returning `false`.
28813    *
28814    * **Note:** As with other "Collections" methods, objects with a "length"
28815    * property are iterated like arrays. To avoid this behavior use `_.forIn`
28816    * or `_.forOwn` for object iteration.
28817    *
28818    * @static
28819    * @memberOf _
28820    * @since 0.1.0
28821    * @alias each
28822    * @category Collection
28823    * @param {Array|Object} collection The collection to iterate over.
28824    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
28825    * @returns {Array|Object} Returns `collection`.
28826    * @see _.forEachRight
28827    * @example
28828    *
28829    * _.forEach([1, 2], function(value) {
28830    *   console.log(value);
28831    * });
28832    * // => Logs `1` then `2`.
28833    *
28834    * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
28835    *   console.log(key);
28836    * });
28837    * // => Logs 'a' then 'b' (iteration order is not guaranteed).
28838    */
28839   function forEach(collection, iteratee) {
28840     var func = isArray(collection) ? arrayEach : baseEach;
28841     return func(collection, castFunction(iteratee));
28842   }
28843
28844   /**
28845    * Iterates over own enumerable string keyed properties of an object and
28846    * invokes `iteratee` for each property. The iteratee is invoked with three
28847    * arguments: (value, key, object). Iteratee functions may exit iteration
28848    * early by explicitly returning `false`.
28849    *
28850    * @static
28851    * @memberOf _
28852    * @since 0.3.0
28853    * @category Object
28854    * @param {Object} object The object to iterate over.
28855    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
28856    * @returns {Object} Returns `object`.
28857    * @see _.forOwnRight
28858    * @example
28859    *
28860    * function Foo() {
28861    *   this.a = 1;
28862    *   this.b = 2;
28863    * }
28864    *
28865    * Foo.prototype.c = 3;
28866    *
28867    * _.forOwn(new Foo, function(value, key) {
28868    *   console.log(key);
28869    * });
28870    * // => Logs 'a' then 'b' (iteration order is not guaranteed).
28871    */
28872   function forOwn(object, iteratee) {
28873     return object && baseForOwn(object, castFunction(iteratee));
28874   }
28875
28876   var translations = Object.create(null);
28877
28878   var currentLocale = 'en';
28879   var textDirection = 'ltr';
28880
28881   function setLocale(val) {
28882       if (translations[val] !== undefined) {
28883           currentLocale = val;
28884       } else if (translations[val.split('-')[0]]) {
28885           currentLocale = val.split('-')[0];
28886       }
28887   }
28888
28889   function addTranslation(id, value) {
28890       translations[id] = value;
28891   }
28892
28893   /**
28894    * Given a string identifier, try to find that string in the current
28895    * language, and return it.  This function will be called recursively
28896    * with locale `en` if a string can not be found in the requested language.
28897    *
28898    * @param {string}   s   string identifier
28899    * @param {object?}  o   object of token replacements and default string
28900    * @param {string?}  loc locale to use
28901    * @returns {string?} locale string
28902    */
28903   function t(s, o, loc) {
28904       loc = loc || currentLocale;
28905
28906       var path = s
28907           .split('.')
28908           .map(function (s) { return s.replace(/<TX_DOT>/g, '.'); })
28909           .reverse();
28910
28911       var rep = translations[loc];
28912
28913       while (rep !== undefined && path.length) {
28914           rep = rep[path.pop()];
28915       }
28916
28917       if (rep !== undefined) {
28918           if (o) {
28919               for (var k in o) {
28920                   var variable = '{' + k + '}';
28921                   var re = new RegExp(variable, 'g'); // check globally for variables
28922                   rep = rep.replace(re, o[k]);
28923               }
28924           }
28925           return rep;
28926       }
28927
28928       if (loc !== 'en') {
28929           return t(s, o, 'en');
28930       }
28931
28932       if (o && 'default' in o) {
28933           return o.default;
28934       }
28935
28936       var missing = 'Missing ' + loc + ' translation: ' + s;
28937       if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
28938
28939       return missing;
28940   }
28941
28942   /**
28943    * Given string 'ltr' or 'rtl', save that setting
28944    *
28945    * @param {string} dir ltr or rtl
28946    */
28947
28948   function setTextDirection(dir) {
28949       textDirection = dir;
28950   }
28951
28952   /** Used to compose bitmasks for cloning. */
28953   var CLONE_DEEP_FLAG$3 = 1,
28954       CLONE_SYMBOLS_FLAG$4 = 4;
28955
28956   /**
28957    * This method is like `_.cloneWith` except that it recursively clones `value`.
28958    *
28959    * @static
28960    * @memberOf _
28961    * @since 4.0.0
28962    * @category Lang
28963    * @param {*} value The value to recursively clone.
28964    * @param {Function} [customizer] The function to customize cloning.
28965    * @returns {*} Returns the deep cloned value.
28966    * @see _.cloneWith
28967    * @example
28968    *
28969    * function customizer(value) {
28970    *   if (_.isElement(value)) {
28971    *     return value.cloneNode(true);
28972    *   }
28973    * }
28974    *
28975    * var el = _.cloneDeepWith(document.body, customizer);
28976    *
28977    * console.log(el === document.body);
28978    * // => false
28979    * console.log(el.nodeName);
28980    * // => 'BODY'
28981    * console.log(el.childNodes.length);
28982    * // => 20
28983    */
28984   function cloneDeepWith(value, customizer) {
28985     customizer = typeof customizer == 'function' ? customizer : undefined;
28986     return baseClone(value, CLONE_DEEP_FLAG$3 | CLONE_SYMBOLS_FLAG$4, customizer);
28987   }
28988
28989   /**
28990    * Creates an array of `array` values not included in the other given arrays
28991    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
28992    * for equality comparisons. The order and references of result values are
28993    * determined by the first array.
28994    *
28995    * **Note:** Unlike `_.pullAll`, this method returns a new array.
28996    *
28997    * @static
28998    * @memberOf _
28999    * @since 0.1.0
29000    * @category Array
29001    * @param {Array} array The array to inspect.
29002    * @param {...Array} [values] The values to exclude.
29003    * @returns {Array} Returns the new array of filtered values.
29004    * @see _.without, _.xor
29005    * @example
29006    *
29007    * _.difference([2, 1], [2, 3]);
29008    * // => [1]
29009    */
29010   var difference = baseRest(function(array, values) {
29011     return isArrayLikeObject(array)
29012       ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
29013       : [];
29014   });
29015
29016   /** `Object#toString` result references. */
29017   var mapTag$6 = '[object Map]',
29018       setTag$6 = '[object Set]';
29019
29020   /** Used for built-in method references. */
29021   var objectProto$h = Object.prototype;
29022
29023   /** Used to check objects for own properties. */
29024   var hasOwnProperty$e = objectProto$h.hasOwnProperty;
29025
29026   /**
29027    * Checks if `value` is an empty object, collection, map, or set.
29028    *
29029    * Objects are considered empty if they have no own enumerable string keyed
29030    * properties.
29031    *
29032    * Array-like values such as `arguments` objects, arrays, buffers, strings, or
29033    * jQuery-like collections are considered empty if they have a `length` of `0`.
29034    * Similarly, maps and sets are considered empty if they have a `size` of `0`.
29035    *
29036    * @static
29037    * @memberOf _
29038    * @since 0.1.0
29039    * @category Lang
29040    * @param {*} value The value to check.
29041    * @returns {boolean} Returns `true` if `value` is empty, else `false`.
29042    * @example
29043    *
29044    * _.isEmpty(null);
29045    * // => true
29046    *
29047    * _.isEmpty(true);
29048    * // => true
29049    *
29050    * _.isEmpty(1);
29051    * // => true
29052    *
29053    * _.isEmpty([1, 2, 3]);
29054    * // => false
29055    *
29056    * _.isEmpty({ 'a': 1 });
29057    * // => false
29058    */
29059   function isEmpty(value) {
29060     if (value == null) {
29061       return true;
29062     }
29063     if (isArrayLike(value) &&
29064         (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
29065           isBuffer(value) || isTypedArray(value) || isArguments(value))) {
29066       return !value.length;
29067     }
29068     var tag = getTag$1(value);
29069     if (tag == mapTag$6 || tag == setTag$6) {
29070       return !value.size;
29071     }
29072     if (isPrototype(value)) {
29073       return !baseKeys(value).length;
29074     }
29075     for (var key in value) {
29076       if (hasOwnProperty$e.call(value, key)) {
29077         return false;
29078       }
29079     }
29080     return true;
29081   }
29082
29083   /**
29084    * Performs a deep comparison between two values to determine if they are
29085    * equivalent.
29086    *
29087    * **Note:** This method supports comparing arrays, array buffers, booleans,
29088    * date objects, error objects, maps, numbers, `Object` objects, regexes,
29089    * sets, strings, symbols, and typed arrays. `Object` objects are compared
29090    * by their own, not inherited, enumerable properties. Functions and DOM
29091    * nodes are compared by strict equality, i.e. `===`.
29092    *
29093    * @static
29094    * @memberOf _
29095    * @since 0.1.0
29096    * @category Lang
29097    * @param {*} value The value to compare.
29098    * @param {*} other The other value to compare.
29099    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
29100    * @example
29101    *
29102    * var object = { 'a': 1 };
29103    * var other = { 'a': 1 };
29104    *
29105    * _.isEqual(object, other);
29106    * // => true
29107    *
29108    * object === other;
29109    * // => false
29110    */
29111   function isEqual(value, other) {
29112     return baseIsEqual(value, other);
29113   }
29114
29115   /*
29116       iD.Difference represents the difference between two graphs.
29117       It knows how to calculate the set of entities that were
29118       created, modified, or deleted, and also contains the logic
29119       for recursively extending a difference to the complete set
29120       of entities that will require a redraw, taking into account
29121       child and parent relationships.
29122    */
29123   function coreDifference(base, head) {
29124       var _changes = {};
29125       var _diff = {};
29126       var _length = 0;
29127       var i, k, h, b, keys;
29128
29129       function changed(h, b) {
29130           if (h === b) return false;
29131           if (!h || !b) return true;
29132
29133           if (h.loc || b.loc) {
29134               if (!h.loc && b.loc || h.loc && !b.loc ||
29135                   h.loc[0] !== b.loc[0] || h.loc[1] !== b.loc[1]) return true;
29136           }
29137           if (h.nodes || b.nodes) {
29138               if (!isEqual(h.nodes, b.nodes)) return true;
29139           }
29140           if (h.members || b.members) {
29141               if (!isEqual(h.members, b.members)) return true;
29142           }
29143           return !isEqual(h.tags, b.tags);
29144       }
29145
29146
29147       keys = Object.keys(head.entities);
29148       for (i = 0; i < keys.length; i++) {
29149           k = keys[i];
29150           h = head.entities[k];
29151           b = base.entities[k];
29152           if (changed(h, b)) {
29153               _changes[k] = {base: b, head: h};
29154               _length++;
29155           }
29156       }
29157
29158       keys = Object.keys(base.entities);
29159       for (i = 0; i < keys.length; i++) {
29160           k = keys[i];
29161           h = head.entities[k];
29162           b = base.entities[k];
29163           if (!_changes[k] && changed(h, b)) {
29164               _changes[k] = {base: b, head: h};
29165               _length++;
29166           }
29167       }
29168
29169
29170       function addParents(parents, result) {
29171           for (var i = 0; i < parents.length; i++) {
29172               var parent = parents[i];
29173
29174               if (parent.id in result)
29175                   continue;
29176
29177               result[parent.id] = parent;
29178               addParents(head.parentRelations(parent), result);
29179           }
29180       }
29181
29182
29183       _diff.length = function length() {
29184           return _length;
29185       };
29186
29187
29188       _diff.changes = function changes() {
29189           return _changes;
29190       };
29191
29192
29193       _diff.extantIDs = function extantIDs() {
29194           var result = [];
29195           forEach(_changes, function(change, id) {
29196               if (change.head) result.push(id);
29197           });
29198           return result;
29199       };
29200
29201
29202       _diff.modified = function modified() {
29203           var result = [];
29204           forEach(_changes, function(change) {
29205               if (change.base && change.head) result.push(change.head);
29206           });
29207           return result;
29208       };
29209
29210
29211       _diff.created = function created() {
29212           var result = [];
29213           forEach(_changes, function(change) {
29214               if (!change.base && change.head) result.push(change.head);
29215           });
29216           return result;
29217       };
29218
29219
29220       _diff.deleted = function deleted() {
29221           var result = [];
29222           forEach(_changes, function(change) {
29223               if (change.base && !change.head) result.push(change.base);
29224           });
29225           return result;
29226       };
29227
29228
29229       _diff.summary = function summary() {
29230           var relevant = {};
29231
29232           function addEntity(entity, graph, changeType) {
29233               relevant[entity.id] = {
29234                   entity: entity,
29235                   graph: graph,
29236                   changeType: changeType
29237               };
29238           }
29239
29240           function addParents(entity) {
29241               var parents = head.parentWays(entity);
29242               for (var j = parents.length - 1; j >= 0; j--) {
29243                   var parent = parents[j];
29244                   if (!(parent.id in relevant)) addEntity(parent, head, 'modified');
29245               }
29246           }
29247
29248           var keys = Object.keys(_changes);
29249           for (var i = 0; i < keys.length; i++) {
29250               var change = _changes[keys[i]];
29251
29252               if (change.head && change.head.geometry(head) !== 'vertex') {
29253                   addEntity(change.head, head, change.base ? 'modified' : 'created');
29254
29255               } else if (change.base && change.base.geometry(base) !== 'vertex') {
29256                   addEntity(change.base, base, 'deleted');
29257
29258               } else if (change.base && change.head) { // modified vertex
29259                   var moved    = !isEqual(change.base.loc,  change.head.loc);
29260                   var retagged = !isEqual(change.base.tags, change.head.tags);
29261
29262                   if (moved) {
29263                       addParents(change.head);
29264                   }
29265
29266                   if (retagged || (moved && change.head.hasInterestingTags())) {
29267                       addEntity(change.head, head, 'modified');
29268                   }
29269
29270               } else if (change.head && change.head.hasInterestingTags()) { // created vertex
29271                   addEntity(change.head, head, 'created');
29272
29273               } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
29274                   addEntity(change.base, base, 'deleted');
29275               }
29276           }
29277
29278           return values$1(relevant);
29279       };
29280
29281
29282       _diff.complete = function complete(extent) {
29283           var result = {};
29284           var id, change;
29285
29286           for (id in _changes) {
29287               change = _changes[id];
29288
29289               var h = change.head;
29290               var b = change.base;
29291               var entity = h || b;
29292
29293               if (extent &&
29294                   (!h || !h.intersects(extent, head)) &&
29295                   (!b || !b.intersects(extent, base)))
29296                   continue;
29297
29298               result[id] = h;
29299
29300               if (entity.type === 'way') {
29301                   var nh = h ? h.nodes : [];
29302                   var nb = b ? b.nodes : [];
29303                   var diff, i;
29304
29305                   diff = difference(nh, nb);
29306                   for (i = 0; i < diff.length; i++) {
29307                       result[diff[i]] = head.hasEntity(diff[i]);
29308                   }
29309
29310                   diff = difference(nb, nh);
29311                   for (i = 0; i < diff.length; i++) {
29312                       result[diff[i]] = head.hasEntity(diff[i]);
29313                   }
29314               }
29315
29316               addParents(head.parentWays(entity), result);
29317               addParents(head.parentRelations(entity), result);
29318           }
29319
29320           return result;
29321       };
29322
29323
29324       return _diff;
29325   }
29326
29327   /** Used for built-in method references. */
29328   var objectProto$i = Object.prototype;
29329
29330   /** Used to check objects for own properties. */
29331   var hasOwnProperty$f = objectProto$i.hasOwnProperty;
29332
29333   /**
29334    * Assigns own enumerable string keyed properties of source objects to the
29335    * destination object. Source objects are applied from left to right.
29336    * Subsequent sources overwrite property assignments of previous sources.
29337    *
29338    * **Note:** This method mutates `object` and is loosely based on
29339    * [`Object.assign`](https://mdn.io/Object/assign).
29340    *
29341    * @static
29342    * @memberOf _
29343    * @since 0.10.0
29344    * @category Object
29345    * @param {Object} object The destination object.
29346    * @param {...Object} [sources] The source objects.
29347    * @returns {Object} Returns `object`.
29348    * @see _.assignIn
29349    * @example
29350    *
29351    * function Foo() {
29352    *   this.a = 1;
29353    * }
29354    *
29355    * function Bar() {
29356    *   this.c = 3;
29357    * }
29358    *
29359    * Foo.prototype.b = 2;
29360    * Bar.prototype.d = 4;
29361    *
29362    * _.assign({ 'a': 0 }, new Foo, new Bar);
29363    * // => { 'a': 1, 'c': 3 }
29364    */
29365   var assign = createAssigner(function(object, source) {
29366     if (isPrototype(source) || isArrayLike(source)) {
29367       copyObject(source, keys$1(source), object);
29368       return;
29369     }
29370     for (var key in source) {
29371       if (hasOwnProperty$f.call(source, key)) {
29372         assignValue(object, key, source[key]);
29373       }
29374     }
29375   });
29376
29377   /* Built-in method references for those with the same name as other `lodash` methods. */
29378   var nativeMax$3 = Math.max;
29379
29380   /**
29381    * Checks if `value` is in `collection`. If `collection` is a string, it's
29382    * checked for a substring of `value`, otherwise
29383    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
29384    * is used for equality comparisons. If `fromIndex` is negative, it's used as
29385    * the offset from the end of `collection`.
29386    *
29387    * @static
29388    * @memberOf _
29389    * @since 0.1.0
29390    * @category Collection
29391    * @param {Array|Object|string} collection The collection to inspect.
29392    * @param {*} value The value to search for.
29393    * @param {number} [fromIndex=0] The index to search from.
29394    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
29395    * @returns {boolean} Returns `true` if `value` is found, else `false`.
29396    * @example
29397    *
29398    * _.includes([1, 2, 3], 1);
29399    * // => true
29400    *
29401    * _.includes([1, 2, 3], 1, 2);
29402    * // => false
29403    *
29404    * _.includes({ 'a': 1, 'b': 2 }, 1);
29405    * // => true
29406    *
29407    * _.includes('abcd', 'bc');
29408    * // => true
29409    */
29410   function includes(collection, value, fromIndex, guard) {
29411     collection = isArrayLike(collection) ? collection : values$1(collection);
29412     fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
29413
29414     var length = collection.length;
29415     if (fromIndex < 0) {
29416       fromIndex = nativeMax$3(length + fromIndex, 0);
29417     }
29418     return isString(collection)
29419       ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
29420       : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
29421   }
29422
29423   var detected;
29424
29425   function utilDetect(force) {
29426       if (detected && !force) return detected;
29427       detected = {};
29428
29429       var ua = navigator.userAgent,
29430           m = null,
29431           q = utilStringQs(window.location.hash.substring(1));
29432
29433       m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
29434       if (m !== null) {
29435           detected.browser = m[1];
29436           detected.version = m[2];
29437       }
29438       if (!detected.browser) {
29439           m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11
29440           if (m !== null) {
29441               detected.browser = 'msie';
29442               detected.version = m[1];
29443           }
29444       }
29445       if (!detected.browser) {
29446           m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
29447           if (m !== null) {
29448               detected.browser = 'Opera';
29449               detected.version = m[2];
29450           }
29451       }
29452       if (!detected.browser) {
29453           m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
29454           if (m !== null) {
29455               detected.browser = m[1];
29456               detected.version = m[2];
29457               m = ua.match(/version\/([\.\d]+)/i);
29458               if (m !== null) detected.version = m[1];
29459           }
29460       }
29461       if (!detected.browser) {
29462           detected.browser = navigator.appName;
29463           detected.version = navigator.appVersion;
29464       }
29465
29466       // keep major.minor version only..
29467       detected.version = detected.version.split(/\W/).slice(0,2).join('.');
29468
29469       if (detected.browser.toLowerCase() === 'msie') {
29470           detected.ie = true;
29471           detected.browser = 'Internet Explorer';
29472           detected.support = parseFloat(detected.version) >= 11;
29473       } else {
29474           detected.ie = false;
29475           detected.support = true;
29476       }
29477
29478       // Added due to incomplete svg style support. See #715
29479       detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
29480
29481       // Set locale based on url param (format 'en-US') or browser lang (default)
29482       if (q.hasOwnProperty('locale')) {
29483           detected.locale = q.locale;
29484           detected.language = q.locale.split('-')[0];
29485       } else {
29486           detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
29487           detected.language = detected.locale.split('-')[0];
29488
29489           // Search `navigator.languages` for a better locale. Prefer the first language,
29490           // unless the second language is a culture-specific version of the first one, see #3842
29491           if (navigator.languages && navigator.languages.length > 0) {
29492               var code0 = navigator.languages[0],
29493                   parts0 = code0.split('-');
29494
29495               detected.locale = code0;
29496               detected.language = parts0[0];
29497
29498               if (navigator.languages.length > 1 && parts0.length === 1) {
29499                   var code1 = navigator.languages[1],
29500                       parts1 = code1.split('-');
29501
29502                   if (parts1[0] === parts0[0]) {
29503                       detected.locale = code1;
29504                   }
29505               }
29506           }
29507       }
29508
29509       // Loaded locale is stored in currentLocale
29510       // return that instead (except in the situation where 'en' might override 'en-US')
29511       var loadedLocale = currentLocale || 'en';
29512       if (loadedLocale !== 'en') {
29513           detected.locale = loadedLocale;
29514           detected.language = detected.locale.split('-')[0];
29515       }
29516
29517       // detect text direction
29518       var lang = dataLocales[detected.locale];
29519       if ((lang && lang.rtl) || (q.rtl === 'true')) {
29520           detected.textDirection = 'rtl';
29521       } else {
29522           detected.textDirection = 'ltr';
29523       }
29524       setTextDirection(detected.textDirection);
29525
29526       // detect host
29527       var loc = window.top.location;
29528       var origin = loc.origin;
29529       if (!origin) {  // for unpatched IE11
29530           origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
29531       }
29532
29533       detected.host = origin + loc.pathname;
29534
29535       detected.filedrop = (window.FileReader && 'ondrop' in window);
29536
29537       detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
29538
29539       detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
29540
29541       function nav(x) {
29542           return navigator.userAgent.indexOf(x) !== -1;
29543       }
29544
29545       if (nav('Win')) {
29546           detected.os = 'win';
29547           detected.platform = 'Windows';
29548       }
29549       else if (nav('Mac')) {
29550           detected.os = 'mac';
29551           detected.platform = 'Macintosh';
29552       }
29553       else if (nav('X11') || nav('Linux')) {
29554           detected.os = 'linux';
29555           detected.platform = 'Linux';
29556       }
29557       else {
29558           detected.os = 'win';
29559           detected.platform = 'Unknown';
29560       }
29561
29562       return detected;
29563   }
29564
29565   var remove$1 = removeDiacritics;
29566
29567   var replacementList = [
29568     {
29569       base: ' ',
29570       chars: "\u00A0",
29571     }, {
29572       base: '0',
29573       chars: "\u07C0",
29574     }, {
29575       base: 'A',
29576       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",
29577     }, {
29578       base: 'AA',
29579       chars: "\uA732",
29580     }, {
29581       base: 'AE',
29582       chars: "\u00C6\u01FC\u01E2",
29583     }, {
29584       base: 'AO',
29585       chars: "\uA734",
29586     }, {
29587       base: 'AU',
29588       chars: "\uA736",
29589     }, {
29590       base: 'AV',
29591       chars: "\uA738\uA73A",
29592     }, {
29593       base: 'AY',
29594       chars: "\uA73C",
29595     }, {
29596       base: 'B',
29597       chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
29598     }, {
29599       base: 'C',
29600       chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
29601     }, {
29602       base: 'D',
29603       chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
29604     }, {
29605       base: 'Dh',
29606       chars: "\u00D0",
29607     }, {
29608       base: 'DZ',
29609       chars: "\u01F1\u01C4",
29610     }, {
29611       base: 'Dz',
29612       chars: "\u01F2\u01C5",
29613     }, {
29614       base: 'E',
29615       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",
29616     }, {
29617       base: 'F',
29618       chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
29619     }, {
29620       base: 'G',
29621       chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
29622     }, {
29623       base: 'H',
29624       chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
29625     }, {
29626       base: 'I',
29627       chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
29628     }, {
29629       base: 'J',
29630       chars: "\u24BF\uFF2A\u0134\u0248\u0237",
29631     }, {
29632       base: 'K',
29633       chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
29634     }, {
29635       base: 'L',
29636       chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
29637     }, {
29638       base: 'LJ',
29639       chars: "\u01C7",
29640     }, {
29641       base: 'Lj',
29642       chars: "\u01C8",
29643     }, {
29644       base: 'M',
29645       chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
29646     }, {
29647       base: 'N',
29648       chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
29649     }, {
29650       base: 'NJ',
29651       chars: "\u01CA",
29652     }, {
29653       base: 'Nj',
29654       chars: "\u01CB",
29655     }, {
29656       base: 'O',
29657       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",
29658     }, {
29659       base: 'OE',
29660       chars: "\u0152",
29661     }, {
29662       base: 'OI',
29663       chars: "\u01A2",
29664     }, {
29665       base: 'OO',
29666       chars: "\uA74E",
29667     }, {
29668       base: 'OU',
29669       chars: "\u0222",
29670     }, {
29671       base: 'P',
29672       chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
29673     }, {
29674       base: 'Q',
29675       chars: "\u24C6\uFF31\uA756\uA758\u024A",
29676     }, {
29677       base: 'R',
29678       chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
29679     }, {
29680       base: 'S',
29681       chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
29682     }, {
29683       base: 'T',
29684       chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
29685     }, {
29686       base: 'Th',
29687       chars: "\u00DE",
29688     }, {
29689       base: 'TZ',
29690       chars: "\uA728",
29691     }, {
29692       base: 'U',
29693       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",
29694     }, {
29695       base: 'V',
29696       chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
29697     }, {
29698       base: 'VY',
29699       chars: "\uA760",
29700     }, {
29701       base: 'W',
29702       chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
29703     }, {
29704       base: 'X',
29705       chars: "\u24CD\uFF38\u1E8A\u1E8C",
29706     }, {
29707       base: 'Y',
29708       chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
29709     }, {
29710       base: 'Z',
29711       chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
29712     }, {
29713       base: 'a',
29714       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",
29715     }, {
29716       base: 'aa',
29717       chars: "\uA733",
29718     }, {
29719       base: 'ae',
29720       chars: "\u00E6\u01FD\u01E3",
29721     }, {
29722       base: 'ao',
29723       chars: "\uA735",
29724     }, {
29725       base: 'au',
29726       chars: "\uA737",
29727     }, {
29728       base: 'av',
29729       chars: "\uA739\uA73B",
29730     }, {
29731       base: 'ay',
29732       chars: "\uA73D",
29733     }, {
29734       base: 'b',
29735       chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
29736     }, {
29737       base: 'c',
29738       chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
29739     }, {
29740       base: 'd',
29741       chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
29742     }, {
29743       base: 'dh',
29744       chars: "\u00F0",
29745     }, {
29746       base: 'dz',
29747       chars: "\u01F3\u01C6",
29748     }, {
29749       base: 'e',
29750       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",
29751     }, {
29752       base: 'f',
29753       chars: "\u24D5\uFF46\u1E1F\u0192",
29754     }, {
29755       base: 'ff',
29756       chars: "\uFB00",
29757     }, {
29758       base: 'fi',
29759       chars: "\uFB01",
29760     }, {
29761       base: 'fl',
29762       chars: "\uFB02",
29763     }, {
29764       base: 'ffi',
29765       chars: "\uFB03",
29766     }, {
29767       base: 'ffl',
29768       chars: "\uFB04",
29769     }, {
29770       base: 'g',
29771       chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
29772     }, {
29773       base: 'h',
29774       chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
29775     }, {
29776       base: 'hv',
29777       chars: "\u0195",
29778     }, {
29779       base: 'i',
29780       chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
29781     }, {
29782       base: 'j',
29783       chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
29784     }, {
29785       base: 'k',
29786       chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
29787     }, {
29788       base: 'l',
29789       chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
29790     }, {
29791       base: 'lj',
29792       chars: "\u01C9",
29793     }, {
29794       base: 'm',
29795       chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
29796     }, {
29797       base: 'n',
29798       chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
29799     }, {
29800       base: 'nj',
29801       chars: "\u01CC",
29802     }, {
29803       base: 'o',
29804       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",
29805     }, {
29806       base: 'oe',
29807       chars: "\u0153",
29808     }, {
29809       base: 'oi',
29810       chars: "\u01A3",
29811     }, {
29812       base: 'oo',
29813       chars: "\uA74F",
29814     }, {
29815       base: 'ou',
29816       chars: "\u0223",
29817     }, {
29818       base: 'p',
29819       chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
29820     }, {
29821       base: 'q',
29822       chars: "\u24E0\uFF51\u024B\uA757\uA759",
29823     }, {
29824       base: 'r',
29825       chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
29826     }, {
29827       base: 's',
29828       chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
29829     }, {
29830       base: 'ss',
29831       chars: "\xDF",
29832     }, {
29833       base: 't',
29834       chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
29835     }, {
29836       base: 'th',
29837       chars: "\u00FE",
29838     }, {
29839       base: 'tz',
29840       chars: "\uA729",
29841     }, {
29842       base: 'u',
29843       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",
29844     }, {
29845       base: 'v',
29846       chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
29847     }, {
29848       base: 'vy',
29849       chars: "\uA761",
29850     }, {
29851       base: 'w',
29852       chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
29853     }, {
29854       base: 'x',
29855       chars: "\u24E7\uFF58\u1E8B\u1E8D",
29856     }, {
29857       base: 'y',
29858       chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
29859     }, {
29860       base: 'z',
29861       chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
29862     }
29863   ];
29864
29865   var diacriticsMap = {};
29866   for (var i = 0; i < replacementList.length; i += 1) {
29867     var chars = replacementList[i].chars;
29868     for (var j = 0; j < chars.length; j += 1) {
29869       diacriticsMap[chars[j]] = replacementList[i].base;
29870     }
29871   }
29872
29873   function removeDiacritics(str) {
29874     return str.replace(/[^\u0000-\u007e]/g, function(c) {
29875       return diacriticsMap[c] || c;
29876     });
29877   }
29878
29879   // see https://github.com/openstreetmap/iD/pull/3707
29880   // https://gist.github.com/mapmeld/556b09ddec07a2044c76e1ef45f01c60
29881
29882   var chars$1 = {
29883       // madda above alef
29884       1570: { initial: 'آ‎', isolated: 'ﺁ', medial: 'ﺁ', final: 'ﺂ' },
29885
29886       // hamza above and below alef
29887       1571: { initial: 'أ', isolated: 'ﺃ', medial: '', final: 'ﺄ' },
29888       // 1572 is ؤ
29889       1573: { initial: 'إ', isolated: 'ﺇ', medial: '', final: 'ﺈ' },
29890       // 1574 is ئ
29891       1575: { initial: 'ا', isolated: 'ا', medial: '', final: 'ﺎ' },
29892       1576: { initial: 'ﺑ', isolated: 'ﺏ', medial: 'ﺒ', final: 'ﺐ' },
29893
29894       // 1577 ة
29895       1577: { initial: '', isolated: 'ة', medial: '', final: 'ﺔ' },
29896
29897       1578: { initial: 'ﺗ', isolated: 'ﺕ', medial: 'ﺘ', final: 'ﺖ' },
29898       1579: { initial: 'ﺛ', isolated: 'ﺙ', medial: 'ﺜ', final: 'ﺚ' },
29899       1580: { initial: 'ﺟ', isolated: 'ﺝ', medial: 'ﺠ', final: 'ﺞ' },
29900       1581: { initial: 'ﺣ', isolated: 'ﺡ', medial: 'ﺤ', final: 'ﺢ' },
29901       1582: { initial: 'ﺧ', isolated: 'ﺥ', medial: 'ﺨ', final: 'ﺦ' },
29902       1583: { initial: 'ﺩ', isolated: 'ﺩ', medial: '', final: 'ﺪ' },
29903       1584: { initial: 'ﺫ', isolated: 'ﺫ', medial: '', final: 'ﺬ' },
29904       1585: { initial: 'ﺭ', isolated: 'ﺭ', medial: '', final: 'ﺮ' },
29905       1586: { initial: 'ﺯ', isolated: 'ﺯ', medial: '', final: 'ﺰ' },
29906       1688: { initial: 'ﮊ', isolated: 'ﮊ', medial: '', final: 'ﮋ' },
29907       1587: { initial: 'ﺳ', isolated: 'ﺱ', medial: 'ﺴ', final: 'ﺲ' },
29908       1588: { initial: 'ﺷ', isolated: 'ﺵ', medial: 'ﺸ', final: 'ﺶ' },
29909       1589: { initial: 'ﺻ', isolated: 'ﺹ', medial: 'ﺼ', final: 'ﺺ' },
29910       1590: { initial: 'ﺿ', isolated: 'ﺽ', medial: 'ﻀ', final: 'ﺾ' },
29911       1591: { initial: 'ﻃ', isolated: 'ﻁ', medial: 'ﻄ', final: 'ﻂ' },
29912       1592: { initial: 'ﻇ', isolated: 'ﻅ', medial: 'ﻈ', final: 'ﻆ' },
29913       1593: { initial: 'ﻋ', isolated: 'ﻉ', medial: 'ﻌ', final: 'ﻊ' },
29914       1594: { initial: 'ﻏ', isolated: 'ﻍ', medial: 'ﻐ', final: 'ﻎ' },
29915
29916       // 1595 ػ - may be very rare
29917
29918       1601: { initial: 'ﻓ', isolated: 'ﻑ', medial: 'ﻔ', final: 'ﻒ' },
29919       1602: { initial: 'ﻗ', isolated: 'ﻕ', medial: 'ﻘ', final: 'ﻖ' },
29920       1604: { initial: 'ﻟ', isolated: 'ﻝ', medial: 'ﻠ', final: 'ﻞ' },
29921       1605: { initial: 'ﻣ', isolated: 'ﻡ', medial: 'ﻤ', final: 'ﻢ' },
29922       1606: { initial: 'ﻧ', isolated: 'ﻥ', medial: 'ﻨ', final: 'ﻦ' },
29923       1607: { initial: 'ﻫ', isolated: 'ﻩ', medial: 'ﻬ', final: 'ﻪ' },
29924       1608: { initial: 'ﻭ', isolated: 'ﻭ', medial: '', final: 'ﻮ' },
29925
29926       // 1609 ى
29927       1609: { initial: 'ﯨ', isolated: 'ﻯ', medial: 'ﯩ', final: 'ﻰ' },
29928       // 1610 ي
29929       1610: { initial: 'ﻳ', isolated: 'ﻱ', medial: 'ﻴ', final: 'ﻲ' },
29930
29931       // short vowel sounds / tashkil markings
29932
29933       1662: { initial: 'ﭘ', isolated: 'ﭖ', medial: 'ﭙ', final: 'ﭗ' },
29934
29935       1670: { initial: 'ﭼ', isolated: 'ﭺ', medial: 'ﭽ', final: 'ﭻ' },
29936       1603: { initial: 'ﻛ', isolated: 'ﻙ', medial: 'ﻜ', final: 'ﻚ' },
29937       1705: { initial: 'ﻛ', isolated: 'ﮎ', medial: 'ﻜ', final: 'ﮏ' },
29938       1711: { initial: 'ﮔ', isolated: 'ﮒ', medial: 'ﮕ', final: 'ﮓ' },
29939       1740: { initial: 'ﻳ', isolated: 'ﻯ', medial: 'ﻴ', final: 'ﻰ' },
29940       5000: { initial: 'ﻻ', isolated: 'ﻻ', medial: '', final: 'ﻼ' }
29941   };
29942
29943   var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
29944
29945   function fixRTLTextForSvg(inputText) {
29946       var context = true;
29947       var ret = '';
29948       var rtlBuffer = [];
29949       var arabicRegex = /[\u0600-\u06FF]/g;
29950       var arabicTashkil = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED]/;
29951       var thaanaVowel = /[\u07A6-\u07B0]/;
29952       var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
29953
29954       if (!arabicRegex.test(inputText)) {
29955           // Hebrew or Thaana RTL script
29956           for (var n = 0; n < inputText.length; n++) {
29957               var c = inputText[n];
29958               if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
29959                   rtlBuffer[rtlBuffer.length - 1] += c;
29960               } else if (rtlRegex.test(c)) {
29961                   rtlBuffer.push(c);
29962               } else if (c === ' ' && rtlBuffer.length) {
29963                   // whitespace within RTL text
29964                   rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
29965               } else {
29966                   // non-RTL character
29967                   ret += rtlBuffer.reverse().join('') + c;
29968                   rtlBuffer = [];
29969               }
29970           }
29971       } else {
29972           for (var i = 0, l = inputText.length; i < l; i++) {
29973               var code = inputText[i].charCodeAt(0);
29974               var nextCode = inputText[i + 1] ? inputText[i + 1].charCodeAt(0) : 0;
29975
29976               if (!chars$1[code]) {
29977                   if (code === 32 && rtlBuffer.length) {
29978                       // whitespace
29979                       rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
29980                   } else if (arabicTashkil.test(inputText[i]) && rtlBuffer.length) {
29981                       // tashkil mark
29982                       rtlBuffer[rtlBuffer.length - 1] += inputText[i];
29983                   } else {
29984                       // non-RTL character
29985                       ret += rtlBuffer.reverse().join('') + inputText[i];
29986                       rtlBuffer = [];
29987                   }
29988                   continue;
29989               }
29990               if (context) {
29991                   if (i === l - 1 || nextCode === 32) {
29992                       rtlBuffer.push(chars$1[code].isolated);
29993                   } else {
29994                       // special case for لا
29995                       if (code === 1604 && nextCode === 1575) {
29996                           rtlBuffer.push(chars$1[5000].initial);
29997                           i++;
29998                           context = true;
29999                           continue;
30000                       }
30001                       rtlBuffer.push(chars$1[code].initial);
30002                   }
30003               } else {
30004                   if (i === l - 1 || nextCode === 32){
30005                       rtlBuffer.push(chars$1[code].final);
30006                   } else {
30007                       // special case for ﻼ
30008                       if (code === 1604 && nextCode === 1575){
30009                           rtlBuffer.push(chars$1[5000].final);
30010                           i++;
30011                           context = true;
30012                           continue;
30013                       }
30014                       if (chars$1[code].medial === ''){
30015                           rtlBuffer.push(chars$1[code].final);
30016                       } else {
30017                           rtlBuffer.push(chars$1[code].medial);
30018                       }
30019                   }
30020               }
30021               context = (chars$1[code].medial === '') || nextCode === 32;
30022           }
30023       }
30024       ret += rtlBuffer.reverse().join('');
30025       return ret;
30026   }
30027
30028   function utilTagText(entity) {
30029       return map$3(entity.tags, function(v, k) {
30030           return k + '=' + v;
30031       }).join(', ');
30032   }
30033
30034
30035   function utilEntitySelector(ids) {
30036       return ids.length ? '.' + ids.join(',.') : 'nothing';
30037   }
30038
30039
30040   function utilEntityOrMemberSelector(ids, graph) {
30041       var s = utilEntitySelector(ids);
30042
30043       ids.forEach(function(id) {
30044           var entity = graph.hasEntity(id);
30045           if (entity && entity.type === 'relation') {
30046               entity.members.forEach(function(member) {
30047                   s += ',.' + member.id;
30048               });
30049           }
30050       });
30051
30052       return s;
30053   }
30054
30055
30056   function utilEntityOrDeepMemberSelector(ids, graph) {
30057       var seen = {};
30058       var allIDs = [];
30059
30060       function addEntityAndMembersIfNotYetSeen(id) {
30061           // avoid infinite recursion for circular relations by skipping seen entities
30062           if (seen[id]) return;
30063           // mark the entity as seen
30064           seen[id] = true;
30065           // add the id;
30066           allIDs.push(id);
30067           if (graph.hasEntity(id)) {
30068               var entity = graph.entity(id);
30069               if (entity.type === 'relation' && entity.members) {
30070                   entity.members.forEach(function(member){
30071                       addEntityAndMembersIfNotYetSeen(member.id);
30072                   });
30073               }
30074           }
30075       }
30076
30077       ids.forEach(function(id) {
30078           addEntityAndMembersIfNotYetSeen(id);
30079       });
30080       return utilEntitySelector(allIDs);
30081   }
30082
30083
30084   // Adds or removes highlight styling for the specified entities
30085   function utilHighlightEntities(ids, highlighted, context) {
30086       context.surface()
30087           .selectAll(utilEntityOrDeepMemberSelector(ids, context.graph()))
30088           .classed('highlighted', highlighted);
30089   }
30090
30091
30092   function utilGetAllNodes(ids, graph) {
30093       var seen = {};
30094       var nodes = [];
30095       ids.forEach(getNodes);
30096       return nodes;
30097
30098       function getNodes(id) {
30099           if (seen[id]) return;
30100           seen[id] = true;
30101
30102           var entity = graph.hasEntity(id);
30103           if (!entity) return;
30104
30105           if (entity.type === 'node') {
30106               nodes.push(entity);
30107           } else if (entity.type === 'way') {
30108               entity.nodes.forEach(getNodes);
30109           } else {
30110               entity.members.map(function(member) { return member.id; }).forEach(getNodes);
30111           }
30112       }
30113   }
30114
30115
30116   function utilDisplayName(entity) {
30117       var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0];
30118       var name = entity.tags[localizedNameKey] || entity.tags.name || '';
30119       var network = entity.tags.cycle_network || entity.tags.network;
30120
30121       if (!name && entity.tags.ref) {
30122           name = entity.tags.ref;
30123           if (network) {
30124               name = network + ' ' + name;
30125           }
30126       }
30127
30128       return name;
30129   }
30130
30131
30132   function utilDisplayNameForPath(entity) {
30133       var name = utilDisplayName(entity);
30134       var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
30135
30136       if (!isFirefox && name && rtlRegex.test(name)) {
30137           name = fixRTLTextForSvg(name);
30138       }
30139
30140       return name;
30141   }
30142
30143
30144   function utilDisplayType(id) {
30145       return {
30146           n: t('inspector.node'),
30147           w: t('inspector.way'),
30148           r: t('inspector.relation')
30149       }[id.charAt(0)];
30150   }
30151
30152
30153   function utilDisplayLabel(entity, context) {
30154       var displayName = utilDisplayName(entity);
30155       if (displayName) {
30156           // use the display name if there is one
30157           return displayName;
30158       }
30159       var preset = utilPreset(entity, context);
30160       if (preset && preset.name()) {
30161           // use the preset name if there is a match
30162           return preset.name();
30163       }
30164       // fallback to the display type (node/way/relation)
30165       return utilDisplayType(entity.id);
30166   }
30167
30168
30169   function utilPreset(entity, context) {
30170       return context.presets().match(entity, context.graph());
30171   }
30172
30173
30174   function utilEntityRoot(entityType) {
30175       return {
30176           node: 'n',
30177           way: 'w',
30178           relation: 'r'
30179       }[entityType];
30180   }
30181
30182
30183   function utilStringQs(str) {
30184       return str.split('&').reduce(function(obj, pair){
30185           var parts = pair.split('=');
30186           if (parts.length === 2) {
30187               obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
30188           }
30189           return obj;
30190       }, {});
30191   }
30192
30193
30194   function utilQsString(obj, noencode) {
30195       // encode everything except special characters used in certain hash parameters:
30196       // "/" in map states, ":", ",", {" and "}" in background
30197       function softEncode(s) {
30198           return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
30199       }
30200
30201       return Object.keys(obj).sort().map(function(key) {
30202           return encodeURIComponent(key) + '=' + (
30203               noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
30204       }).join('&');
30205   }
30206
30207
30208   function utilPrefixDOMProperty(property) {
30209       var prefixes = ['webkit', 'ms', 'moz', 'o'];
30210       var i = -1;
30211       var n = prefixes.length;
30212       var s = document.body;
30213
30214       if (property in s)
30215           return property;
30216
30217       property = property.substr(0, 1).toUpperCase() + property.substr(1);
30218
30219       while (++i < n) {
30220           if (prefixes[i] + property in s) {
30221               return prefixes[i] + property;
30222           }
30223       }
30224
30225       return false;
30226   }
30227
30228
30229   function utilPrefixCSSProperty(property) {
30230       var prefixes = ['webkit', 'ms', 'Moz', 'O'];
30231       var i = -1;
30232       var n = prefixes.length;
30233       var s = document.body.style;
30234
30235       if (property.toLowerCase() in s) {
30236           return property.toLowerCase();
30237       }
30238
30239       while (++i < n) {
30240           if (prefixes[i] + property in s) {
30241               return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
30242           }
30243       }
30244
30245       return false;
30246   }
30247
30248
30249   var transformProperty;
30250   function utilSetTransform(el, x, y, scale) {
30251       var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform');
30252       var translate = utilDetect().opera ? 'translate('   + x + 'px,' + y + 'px)'
30253           : 'translate3d(' + x + 'px,' + y + 'px,0)';
30254       return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
30255   }
30256
30257
30258   // Calculates Levenshtein distance between two strings
30259   // see:  https://en.wikipedia.org/wiki/Levenshtein_distance
30260   // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
30261   function utilEditDistance(a, b) {
30262       a = remove$1(a.toLowerCase());
30263       b = remove$1(b.toLowerCase());
30264       if (a.length === 0) return b.length;
30265       if (b.length === 0) return a.length;
30266       var matrix = [];
30267       for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
30268       for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
30269       for (i = 1; i <= b.length; i++) {
30270           for (j = 1; j <= a.length; j++) {
30271               if (b.charAt(i-1) === a.charAt(j-1)) {
30272                   matrix[i][j] = matrix[i-1][j-1];
30273               } else {
30274                   matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
30275                       Math.min(matrix[i][j-1] + 1, // insertion
30276                       matrix[i-1][j] + 1)); // deletion
30277               }
30278           }
30279       }
30280       return matrix[b.length][a.length];
30281   }
30282
30283
30284   // a d3.mouse-alike which
30285   // 1. Only works on HTML elements, not SVG
30286   // 2. Does not cause style recalculation
30287   function utilFastMouse(container) {
30288       var rect = container.getBoundingClientRect();
30289       var rectLeft = rect.left;
30290       var rectTop = rect.top;
30291       var clientLeft = +container.clientLeft;
30292       var clientTop = +container.clientTop;
30293
30294       if (textDirection === 'rtl') {
30295           rectLeft = 0;
30296       }
30297       return function(e) {
30298           return [
30299               e.clientX - rectLeft - clientLeft,
30300               e.clientY - rectTop - clientTop];
30301       };
30302   }
30303
30304
30305   /* eslint-disable no-proto */
30306   var utilGetPrototypeOf = Object.getPrototypeOf || function(obj) { return obj.__proto__; };
30307   /* eslint-enable no-proto */
30308
30309
30310   function utilAsyncMap(inputs, func, callback) {
30311       var remaining = inputs.length;
30312       var results = [];
30313       var errors = [];
30314
30315       inputs.forEach(function(d, i) {
30316           func(d, function done(err, data) {
30317               errors[i] = err;
30318               results[i] = data;
30319               remaining--;
30320               if (!remaining) callback(errors, results);
30321           });
30322       });
30323   }
30324
30325
30326   // wraps an index to an interval [0..length-1]
30327   function utilWrap(index, length) {
30328       if (index < 0) {
30329           index += Math.ceil(-index/length)*length;
30330       }
30331       return index % length;
30332   }
30333
30334
30335   /**
30336    * a replacement for functor
30337    *
30338    * @param {*} value any value
30339    * @returns {Function} a function that returns that value or the value if it's a function
30340    */
30341   function utilFunctor(value) {
30342       if (typeof value === 'function') return value;
30343       return function() {
30344           return value;
30345       };
30346   }
30347
30348
30349   function utilNoAuto(selection) {
30350       var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
30351
30352       return selection
30353           // assign 'new-password' even for non-password fields to prevent browsers (Chrome) ignoring 'off'
30354           .attr('autocomplete', 'new-password')
30355           .attr('autocorrect', 'off')
30356           .attr('autocapitalize', 'off')
30357           .attr('spellcheck', isText ? 'true' : 'false');
30358   }
30359
30360
30361   // https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript
30362   // https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
30363   function utilHashcode(str) {
30364       var hash = 0;
30365       if (str.length === 0) {
30366           return hash;
30367       }
30368       for (var i = 0; i < str.length; i++) {
30369           var char = str.charCodeAt(i);
30370           hash = ((hash << 5) - hash) + char;
30371           hash = hash & hash; // Convert to 32bit integer
30372       }
30373       return hash;
30374   }
30375
30376   // note the function should be of low priority
30377   // and should not be returning a value.
30378   function utilCallWhenIdle(func, timeout) {
30379       return function() {
30380           var args = arguments;
30381           var that = this;
30382           window.requestIdleCallback(function() {
30383               func.apply(that, args);
30384           }, {timeout: timeout});
30385       };
30386   }
30387
30388   function utilCleanTags(tags) {
30389       var out = {};
30390       for (var k in tags) {
30391           if (!k) continue;
30392           var v = tags[k];
30393           if (v !== undefined) {
30394               out[k] = cleanValue(k, v);
30395           }
30396       }
30397
30398       return out;
30399
30400
30401       function cleanValue(k, v) {
30402           function keepSpaces(k) {
30403               return /_hours|_times|:conditional$/.test(k);
30404           }
30405
30406           function skip(k) {
30407               return /^(description|note|fixme)$/.test(k);
30408           }
30409
30410           if (skip(k)) return v;
30411
30412           var cleaned = v
30413               .split(';')
30414               .map(function(s) { return s.trim(); })
30415               .join(keepSpaces(k) ? '; ' : ';');
30416
30417           // The code below is not intended to validate websites and emails.
30418           // It is only intended to prevent obvious copy-paste errors. (#2323)
30419           // clean website- and email-like tags
30420           if (k.indexOf('website') !== -1 ||
30421               k.indexOf('email') !== -1 ||
30422               cleaned.indexOf('http') === 0) {
30423               cleaned = cleaned
30424                   .replace(/[\u200B-\u200F\uFEFF]/g, '');  // strip LRM and other zero width chars
30425
30426           }
30427
30428           return cleaned;
30429       }
30430   }
30431
30432   // Like selection.property('value', ...), but avoids no-op value sets,
30433   // which can result in layout/repaint thrashing in some situations.
30434   function utilGetSetValue(selection, value) {
30435       function d3_selection_value(value) {
30436           function valueNull() {
30437               delete this.value;
30438           }
30439
30440           function valueConstant() {
30441               if (this.value !== value) {
30442                   this.value = value;
30443               }
30444           }
30445
30446           function valueFunction() {
30447               var x = value.apply(this, arguments);
30448               if (x == null) {
30449                   delete this.value;
30450               } else if (this.value !== x) {
30451                   this.value = x;
30452               }
30453           }
30454
30455           return value == null
30456               ? valueNull : (typeof value === 'function'
30457               ? valueFunction : valueConstant);
30458       }
30459
30460       if (arguments.length === 1) {
30461           return selection.property('value');
30462       }
30463
30464       return selection.each(d3_selection_value(value));
30465   }
30466
30467   function utilIdleWorker(tasks, processor, callback) {
30468       var results = [], result;
30469       for (var i = 0; i < tasks.length; i++) {
30470           result = processor(tasks[i]);
30471           if (result) results.push(result);
30472       }
30473       callback(results);
30474
30475       // var processed = [];
30476       // var currentPos = 0;
30477       // var totalTasks = tasks.length;
30478
30479       // function worker(deadline) {
30480       //     while (deadline.timeRemaining() > 0 && currentPos < totalTasks) {
30481       //         var result = processor(tasks[currentPos]);
30482
30483       //         // if falsy dont add to the processed list
30484       //         if (result) processed.push(result);
30485       //         currentPos++;
30486       //     }
30487
30488       //     // more tasks are left, we might need more idleCallbacks
30489       //     if (currentPos < totalTasks) {
30490       //         return window.requestIdleCallback(function(deadline) {worker(deadline);});
30491       //     }
30492
30493       //     // tasks are completed
30494       //     return callback(processed);
30495       // }
30496
30497       // window.requestIdleCallback(function(deadline) {worker(deadline);});
30498   }
30499
30500   // shim
30501   window.requestIdleCallback =
30502       window.requestIdleCallback ||
30503       function(cb) {
30504           var start = Date.now();
30505           return setTimeout(function() {
30506               cb({
30507                   didTimeout: false,
30508                   timeRemaining: function() {
30509                       return Math.max(0, 50 - (Date.now() - start));
30510                   }
30511               });
30512           }, 1);
30513       };
30514
30515   window.cancelIdleCallback =
30516       window.cancelIdleCallback ||
30517       function(id) {
30518           clearTimeout(id);
30519       };
30520
30521   function utilKeybinding(namespace) {
30522       var _keybindings = {};
30523
30524
30525       function testBindings(isCapturing) {
30526           var didMatch = false;
30527           var bindings = Object.keys(_keybindings).map(function(id) { return _keybindings[id]; });
30528           var i, binding;
30529
30530           // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
30531           // so we don't strictly match on the shift key, but we prioritize
30532           // shifted keybindings first, and fallback to unshifted only if no match.
30533           // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
30534
30535           // priority match shifted keybindings first
30536           for (i = 0; i < bindings.length; i++) {
30537               binding = bindings[i];
30538               if (!binding.event.modifiers.shiftKey) continue;  // no shift
30539               if (!!binding.capture !== isCapturing) continue;
30540               if (matches(binding, true)) {
30541                   binding.callback();
30542                   didMatch = true;
30543               }
30544           }
30545
30546           // then unshifted keybindings
30547           if (didMatch) return;
30548           for (i = 0; i < bindings.length; i++) {
30549               binding = bindings[i];
30550               if (binding.event.modifiers.shiftKey) continue;   // shift
30551               if (!!binding.capture !== isCapturing) continue;
30552               if (matches(binding, false)) {
30553                   binding.callback();
30554               }
30555           }
30556
30557
30558           function matches(binding, testShift) {
30559               var event$1 = event;
30560               var isMatch = false;
30561               var tryKeyCode = true;
30562
30563               // Prefer a match on `KeyboardEvent.key`
30564               if (event$1.key !== undefined) {
30565                   tryKeyCode = (event$1.key.charCodeAt(0) > 255);  // outside ISO-Latin-1
30566                   isMatch = true;
30567
30568                   if (binding.event.key === undefined) {
30569                       isMatch = false;
30570                   } else if (Array.isArray(binding.event.key)) {
30571                       if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$1.key.toLowerCase()) === -1)
30572                           isMatch = false;
30573                   } else {
30574                       if (event$1.key.toLowerCase() !== binding.event.key.toLowerCase())
30575                           isMatch = false;
30576                   }
30577               }
30578
30579               // Fallback match on `KeyboardEvent.keyCode`, can happen if:
30580               // - browser doesn't support `KeyboardEvent.key`
30581               // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
30582               if (!isMatch && tryKeyCode) {
30583                   isMatch = (event$1.keyCode === binding.event.keyCode);
30584               }
30585
30586               if (!isMatch) return false;
30587
30588               // test modifier keys
30589               if (!(event$1.ctrlKey && event$1.altKey)) {  // if both are set, assume AltGr and skip it - #4096
30590                   if (event$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
30591                   if (event$1.altKey !== binding.event.modifiers.altKey) return false;
30592               }
30593               if (event$1.metaKey !== binding.event.modifiers.metaKey) return false;
30594               if (testShift && event$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
30595
30596               return true;
30597           }
30598       }
30599
30600
30601       function capture() {
30602           testBindings(true);
30603       }
30604
30605
30606       function bubble() {
30607           var tagName = select(event.target).node().tagName;
30608           if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
30609               return;
30610           }
30611           testBindings(false);
30612       }
30613
30614
30615       function keybinding(selection) {
30616           selection = selection || select(document);
30617           selection.on('keydown.capture.' + namespace, capture, true);
30618           selection.on('keydown.bubble.' + namespace, bubble, false);
30619           return keybinding;
30620       }
30621
30622       // was: keybinding.off()
30623       keybinding.unbind = function(selection) {
30624           _keybindings = [];
30625           selection = selection || select(document);
30626           selection.on('keydown.capture.' + namespace, null);
30627           selection.on('keydown.bubble.' + namespace, null);
30628           return keybinding;
30629       };
30630
30631
30632       keybinding.clear = function() {
30633           _keybindings = {};
30634           return keybinding;
30635       };
30636
30637
30638       // Remove one or more keycode bindings.
30639       keybinding.off = function(codes, capture) {
30640           var arr = uniq([].concat(codes));
30641
30642           for (var i = 0; i < arr.length; i++) {
30643               var id = arr[i] + (capture ? '-capture' : '-bubble');
30644               delete _keybindings[id];
30645           }
30646           return keybinding;
30647       };
30648
30649
30650       // Add one or more keycode bindings.
30651       keybinding.on = function(codes, callback, capture) {
30652           if (!isFunction(callback)) {
30653               return keybinding.off(codes, capture);
30654           }
30655
30656           var arr = uniq([].concat(codes));
30657
30658           for (var i = 0; i < arr.length; i++) {
30659               var id = arr[i] + (capture ? '-capture' : '-bubble');
30660               var binding = {
30661                   id: id,
30662                   capture: capture,
30663                   callback: callback,
30664                   event: {
30665                       key: undefined,  // preferred
30666                       keyCode: 0,      // fallback
30667                       modifiers: {
30668                           shiftKey: false,
30669                           ctrlKey: false,
30670                           altKey: false,
30671                           metaKey: false
30672                       }
30673                   }
30674               };
30675
30676               if (_keybindings[id]) {
30677                   console.warn('warning: duplicate keybinding for "' + id + '"'); // eslint-disable-line no-console
30678               }
30679
30680               _keybindings[id] = binding;
30681
30682               var matches = arr[i].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
30683               for (var j = 0; j < matches.length; j++) {
30684                   // Normalise matching errors
30685                   if (matches[j] === '++') matches[j] = '+';
30686
30687                   if (matches[j] in utilKeybinding.modifierCodes) {
30688                       var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j]]];
30689                       binding.event.modifiers[prop] = true;
30690                   } else {
30691                       binding.event.key = utilKeybinding.keys[matches[j]] || matches[j];
30692                       if (matches[j] in utilKeybinding.keyCodes) {
30693                           binding.event.keyCode = utilKeybinding.keyCodes[matches[j]];
30694                       }
30695                   }
30696               }
30697           }
30698
30699           return keybinding;
30700       };
30701
30702
30703       return keybinding;
30704   }
30705
30706
30707   /*
30708    * See https://github.com/keithamus/jwerty
30709    */
30710
30711   utilKeybinding.modifierCodes = {
30712       // Shift key, ⇧
30713       '⇧': 16, shift: 16,
30714       // CTRL key, on Mac: ⌃
30715       '⌃': 17, ctrl: 17,
30716       // ALT key, on Mac: ⌥ (Alt)
30717       '⌥': 18, alt: 18, option: 18,
30718       // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
30719       '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
30720   };
30721
30722   utilKeybinding.modifierProperties = {
30723       16: 'shiftKey',
30724       17: 'ctrlKey',
30725       18: 'altKey',
30726       91: 'metaKey'
30727   };
30728
30729   utilKeybinding.keys = {
30730       // Backspace key, on Mac: ⌫ (Backspace)
30731       '⌫': 'Backspace', backspace: 'Backspace',
30732       // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
30733       '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
30734       // Return key, ↩
30735       '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
30736       // Pause/Break key
30737       'pause': 'Pause', 'pause-break': 'Pause',
30738       // Caps Lock key, ⇪
30739       '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
30740       // Escape key, on Mac: ⎋, on Windows: Esc
30741       '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
30742       // Space key
30743       space: [' ', 'Spacebar'],
30744       // Page-Up key, or pgup, on Mac: ↖
30745       '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
30746       // Page-Down key, or pgdown, on Mac: ↘
30747       '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
30748       // END key, on Mac: ⇟
30749       '⇟': 'End', end: 'End',
30750       // HOME key, on Mac: ⇞
30751       '⇞': 'Home', home: 'Home',
30752       // Insert key, or ins
30753       ins: 'Insert', insert: 'Insert',
30754       // Delete key, on Mac: ⌦ (Delete)
30755       '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
30756       // Left Arrow Key, or ←
30757       '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
30758       // Up Arrow Key, or ↑
30759       '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
30760       // Right Arrow Key, or →
30761       '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
30762       // Up Arrow Key, or ↓
30763       '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
30764       // odities, stuff for backward compatibility (browsers and code):
30765       // Num-Multiply, or *
30766       '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
30767       // Num-Plus or +
30768       '+': ['+', 'Add'], 'plus': ['+', 'Add'],
30769       // Num-Subtract, or -
30770       '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
30771       // Semicolon
30772       semicolon: ';',
30773       // = or equals
30774       equals: '=',
30775       // Comma, or ,
30776       comma: ',',
30777       // Period, or ., or full-stop
30778       period: '.', 'full-stop': '.',
30779       // Slash, or /, or forward-slash
30780       slash: '/', 'forward-slash': '/',
30781       // Tick, or `, or back-quote
30782       tick: '`', 'back-quote': '`',
30783       // Open bracket, or [
30784       'open-bracket': '[',
30785       // Back slash, or \
30786       'back-slash': '\\',
30787       // Close backet, or ]
30788       'close-bracket': ']',
30789       // Apostrophe, or Quote, or '
30790       quote: '\'', apostrophe: '\'',
30791       // NUMPAD 0-9
30792       'num-0': '0',
30793       'num-1': '1',
30794       'num-2': '2',
30795       'num-3': '3',
30796       'num-4': '4',
30797       'num-5': '5',
30798       'num-6': '6',
30799       'num-7': '7',
30800       'num-8': '8',
30801       'num-9': '9',
30802       // F1-F25
30803       f1: 'F1',
30804       f2: 'F2',
30805       f3: 'F3',
30806       f4: 'F4',
30807       f5: 'F5',
30808       f6: 'F6',
30809       f7: 'F7',
30810       f8: 'F8',
30811       f9: 'F9',
30812       f10: 'F10',
30813       f11: 'F11',
30814       f12: 'F12',
30815       f13: 'F13',
30816       f14: 'F14',
30817       f15: 'F15',
30818       f16: 'F16',
30819       f17: 'F17',
30820       f18: 'F18',
30821       f19: 'F19',
30822       f20: 'F20',
30823       f21: 'F21',
30824       f22: 'F22',
30825       f23: 'F23',
30826       f24: 'F24',
30827       f25: 'F25'
30828   };
30829
30830   utilKeybinding.keyCodes = {
30831       // Backspace key, on Mac: ⌫ (Backspace)
30832       '⌫': 8, backspace: 8,
30833       // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
30834       '⇥': 9, '⇆': 9, tab: 9,
30835       // Return key, ↩
30836       '↩': 13, 'return': 13, enter: 13, '⌅': 13,
30837       // Pause/Break key
30838       'pause': 19, 'pause-break': 19,
30839       // Caps Lock key, ⇪
30840       '⇪': 20, caps: 20, 'caps-lock': 20,
30841       // Escape key, on Mac: ⎋, on Windows: Esc
30842       '⎋': 27, escape: 27, esc: 27,
30843       // Space key
30844       space: 32,
30845       // Page-Up key, or pgup, on Mac: ↖
30846       '↖': 33, pgup: 33, 'page-up': 33,
30847       // Page-Down key, or pgdown, on Mac: ↘
30848       '↘': 34, pgdown: 34, 'page-down': 34,
30849       // END key, on Mac: ⇟
30850       '⇟': 35, end: 35,
30851       // HOME key, on Mac: ⇞
30852       '⇞': 36, home: 36,
30853       // Insert key, or ins
30854       ins: 45, insert: 45,
30855       // Delete key, on Mac: ⌦ (Delete)
30856       '⌦': 46, del: 46, 'delete': 46,
30857       // Left Arrow Key, or ←
30858       '←': 37, left: 37, 'arrow-left': 37,
30859       // Up Arrow Key, or ↑
30860       '↑': 38, up: 38, 'arrow-up': 38,
30861       // Right Arrow Key, or →
30862       '→': 39, right: 39, 'arrow-right': 39,
30863       // Up Arrow Key, or ↓
30864       '↓': 40, down: 40, 'arrow-down': 40,
30865       // odities, printing characters that come out wrong:
30866       // Firefox Equals
30867       'ffequals': 61,
30868       // Num-Multiply, or *
30869       '*': 106, star: 106, asterisk: 106, multiply: 106,
30870       // Num-Plus or +
30871       '+': 107, 'plus': 107,
30872       // Num-Subtract, or -
30873       '-': 109, subtract: 109,
30874       // Firefox Plus
30875       'ffplus': 171,
30876       // Firefox Minus
30877       'ffminus': 173,
30878       // Semicolon
30879       ';': 186, semicolon: 186,
30880       // = or equals
30881       '=': 187, 'equals': 187,
30882       // Comma, or ,
30883       ',': 188, comma: 188,
30884       // Dash / Underscore key
30885       'dash': 189,
30886       // Period, or ., or full-stop
30887       '.': 190, period: 190, 'full-stop': 190,
30888       // Slash, or /, or forward-slash
30889       '/': 191, slash: 191, 'forward-slash': 191,
30890       // Tick, or `, or back-quote
30891       '`': 192, tick: 192, 'back-quote': 192,
30892       // Open bracket, or [
30893       '[': 219, 'open-bracket': 219,
30894       // Back slash, or \
30895       '\\': 220, 'back-slash': 220,
30896       // Close backet, or ]
30897       ']': 221, 'close-bracket': 221,
30898       // Apostrophe, or Quote, or '
30899       '\'': 222, quote: 222, apostrophe: 222
30900   };
30901
30902   // NUMPAD 0-9
30903   var i$1 = 95, n = 0;
30904   while (++i$1 < 106) {
30905       utilKeybinding.keyCodes['num-' + n] = i$1;
30906       ++n;
30907   }
30908
30909   // 0-9
30910   i$1 = 47; n = 0;
30911   while (++i$1 < 58) {
30912       utilKeybinding.keyCodes[n] = i$1;
30913       ++n;
30914   }
30915
30916   // F1-F25
30917   i$1 = 111; n = 1;
30918   while (++i$1 < 136) {
30919       utilKeybinding.keyCodes['f' + n] = i$1;
30920       ++n;
30921   }
30922
30923   // a-z
30924   i$1 = 64;
30925   while (++i$1 < 91) {
30926       utilKeybinding.keyCodes[String.fromCharCode(i$1).toLowerCase()] = i$1;
30927   }
30928
30929   // Copies a variable number of methods from source to target.
30930   function utilRebind(target, source) {
30931       var i = 1, n = arguments.length, method;
30932       while (++i < n) {
30933           target[method = arguments[i]] = d3_rebind(target, source, source[method]);
30934       }
30935       return target;
30936   }
30937
30938   // Method is assumed to be a standard D3 getter-setter:
30939   // If passed with no arguments, gets the value.
30940   // If passed with arguments, sets the value and returns the target.
30941   function d3_rebind(target, source, method) {
30942       return function() {
30943           var value = method.apply(source, arguments);
30944           return value === source ? target : value;
30945       };
30946   }
30947
30948   // A per-domain session mutex backed by a cookie and dead man's
30949   // switch. If the session crashes, the mutex will auto-release
30950   // after 5 seconds.
30951
30952   // This accepts a string and returns an object that complies with utilSessionMutexType
30953   function utilSessionMutex(name) {
30954       var mutex = {};
30955       var intervalID;
30956
30957       function renew() {
30958           var expires = new Date();
30959           expires.setSeconds(expires.getSeconds() + 5);
30960           document.cookie = name + '=1; expires=' + expires.toUTCString();
30961       }
30962
30963       mutex.lock = function () {
30964           if (intervalID) return true;
30965           var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
30966           if (cookie) return false;
30967           renew();
30968           intervalID = window.setInterval(renew, 4000);
30969           return true;
30970       };
30971
30972       mutex.unlock = function () {
30973           if (!intervalID) return;
30974           document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
30975           clearInterval(intervalID);
30976           intervalID = null;
30977       };
30978
30979       mutex.locked = function () {
30980           return !!intervalID;
30981       };
30982
30983       return mutex;
30984   }
30985
30986   function utilTiler() {
30987       var _size = [256, 256];
30988       var _scale = 256;
30989       var _tileSize = 256;
30990       var _zoomExtent = [0, 20];
30991       var _translate = [_size[0] / 2, _size[1] / 2];
30992       var _margin = 0;
30993       var _skipNullIsland = false;
30994
30995
30996       function clamp(num, min, max) {
30997           return Math.max(min, Math.min(num, max));
30998       }
30999
31000
31001       function nearNullIsland(tile) {
31002           var x = tile[0];
31003           var y = tile[1];
31004           var z = tile[2];
31005           if (z >= 7) {
31006               var center = Math.pow(2, z - 1);
31007               var width = Math.pow(2, z - 6);
31008               var min = center - (width / 2);
31009               var max = center + (width / 2) - 1;
31010               return x >= min && x <= max && y >= min && y <= max;
31011           }
31012           return false;
31013       }
31014
31015
31016       function tiler() {
31017           var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
31018           var z0 = clamp(Math.round(z), _zoomExtent[0], _zoomExtent[1]);
31019           var tileMin = 0;
31020           var tileMax = Math.pow(2, z0) - 1;
31021           var log2ts = Math.log(_tileSize) * Math.LOG2E;
31022           var k = Math.pow(2, z - z0 + log2ts);
31023           var origin = [
31024               (_translate[0] - _scale / 2) / k,
31025               (_translate[1] - _scale / 2) / k
31026           ];
31027
31028           var cols = range(
31029               clamp(Math.floor(-origin[0]) - _margin,               tileMin, tileMax + 1),
31030               clamp(Math.ceil(_size[0] / k - origin[0]) + _margin,  tileMin, tileMax + 1)
31031           );
31032           var rows = range(
31033               clamp(Math.floor(-origin[1]) - _margin,               tileMin, tileMax + 1),
31034               clamp(Math.ceil(_size[1] / k - origin[1]) + _margin,  tileMin, tileMax + 1)
31035           );
31036
31037           var tiles = [];
31038           for (var i = 0; i < rows.length; i++) {
31039               var y = rows[i];
31040               for (var j = 0; j < cols.length; j++) {
31041                   var x = cols[j];
31042
31043                   if (i >= _margin && i <= rows.length - _margin &&
31044                       j >= _margin && j <= cols.length - _margin) {
31045                       tiles.unshift([x, y, z0]);  // tiles in view at beginning
31046                   } else {
31047                       tiles.push([x, y, z0]);     // tiles in margin at the end
31048                   }
31049               }
31050           }
31051
31052           tiles.translate = origin;
31053           tiles.scale = k;
31054
31055           return tiles;
31056       }
31057
31058
31059       /**
31060        * getTiles() returns an array of tiles that cover the map view
31061        */
31062       tiler.getTiles = function(projection) {
31063           var origin = [
31064               projection.scale() * Math.PI - projection.translate()[0],
31065               projection.scale() * Math.PI - projection.translate()[1]
31066           ];
31067
31068           this
31069               .size(projection.clipExtent()[1])
31070               .scale(projection.scale() * 2 * Math.PI)
31071               .translate(projection.translate());
31072
31073           var tiles = tiler();
31074           var ts = tiles.scale;
31075
31076           return tiles
31077               .map(function(tile) {
31078                   if (_skipNullIsland && nearNullIsland(tile)) {
31079                       return false;
31080                   }
31081                   var x = tile[0] * ts - origin[0];
31082                   var y = tile[1] * ts - origin[1];
31083                   return {
31084                       id: tile.toString(),
31085                       xyz: tile,
31086                       extent: geoExtent(
31087                           projection.invert([x, y + ts]),
31088                           projection.invert([x + ts, y])
31089                       )
31090                   };
31091               }).filter(Boolean);
31092       };
31093
31094
31095       /**
31096        * getGeoJSON() returns a FeatureCollection for debugging tiles
31097        */
31098       tiler.getGeoJSON = function(projection) {
31099           var features = tiler.getTiles(projection).map(function(tile) {
31100               return {
31101                   type: 'Feature',
31102                   properties: {
31103                       id: tile.id,
31104                       name: tile.id
31105                   },
31106                   geometry: {
31107                       type: 'Polygon',
31108                       coordinates: [ tile.extent.polygon() ]
31109                   }
31110               };
31111           });
31112
31113           return {
31114               type: 'FeatureCollection',
31115               features: features
31116           };
31117       };
31118
31119
31120       tiler.tileSize = function(val) {
31121           if (!arguments.length) return _tileSize;
31122           _tileSize = val;
31123           return tiler;
31124       };
31125
31126
31127       tiler.zoomExtent = function(val) {
31128           if (!arguments.length) return _zoomExtent;
31129           _zoomExtent = val;
31130           return tiler;
31131       };
31132
31133
31134       tiler.size = function(val) {
31135           if (!arguments.length) return _size;
31136           _size = val;
31137           return tiler;
31138       };
31139
31140
31141       tiler.scale = function(val) {
31142           if (!arguments.length) return _scale;
31143           _scale = val;
31144           return tiler;
31145       };
31146
31147
31148       tiler.translate = function(val) {
31149           if (!arguments.length) return _translate;
31150           _translate = val;
31151           return tiler;
31152       };
31153
31154
31155       // number to extend the rows/columns beyond those covering the viewport
31156       tiler.margin = function(val) {
31157           if (!arguments.length) return _margin;
31158           _margin = +val;
31159           return tiler;
31160       };
31161
31162
31163       tiler.skipNullIsland = function(val) {
31164           if (!arguments.length) return _skipNullIsland;
31165           _skipNullIsland = val;
31166           return tiler;
31167       };
31168
31169
31170       return tiler;
31171   }
31172
31173   function utilTriggerEvent(target, type) {
31174       target.each(function() {
31175           var evt = document.createEvent('HTMLEvents');
31176           evt.initEvent(type, true, true);
31177           this.dispatchEvent(evt);
31178       });
31179   }
31180
31181   function coreGraph(other, mutable) {
31182       if (!(this instanceof coreGraph)) return new coreGraph(other, mutable);
31183
31184       if (other instanceof coreGraph) {
31185           var base = other.base();
31186           this.entities = assign(Object.create(base.entities), other.entities);
31187           this._parentWays = assign(Object.create(base.parentWays), other._parentWays);
31188           this._parentRels = assign(Object.create(base.parentRels), other._parentRels);
31189
31190       } else {
31191           this.entities = Object.create({});
31192           this._parentWays = Object.create({});
31193           this._parentRels = Object.create({});
31194           this.rebase(other || [], [this]);
31195       }
31196
31197       this.transients = {};
31198       this._childNodes = {};
31199       this.frozen = !mutable;
31200   }
31201
31202
31203   coreGraph.prototype = {
31204
31205       hasEntity: function(id) {
31206           return this.entities[id];
31207       },
31208
31209
31210       entity: function(id) {
31211           var entity = this.entities[id];
31212
31213           //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
31214           if (!entity) {
31215               entity = this.entities.__proto__[id];  // eslint-disable-line no-proto
31216           }
31217
31218           if (!entity) {
31219               throw new Error('entity ' + id + ' not found');
31220           }
31221           return entity;
31222       },
31223
31224
31225       transient: function(entity, key, fn) {
31226           var id = entity.id;
31227           var transients = this.transients[id] || (this.transients[id] = {});
31228
31229           if (transients[key] !== undefined) {
31230               return transients[key];
31231           }
31232
31233           transients[key] = fn.call(entity);
31234
31235           return transients[key];
31236       },
31237
31238
31239       parentWays: function(entity) {
31240           var parents = this._parentWays[entity.id];
31241           var result = [];
31242
31243           if (parents) {
31244               for (var i = 0; i < parents.length; i++) {
31245                   result.push(this.entity(parents[i]));
31246               }
31247           }
31248           return result;
31249       },
31250
31251
31252       isPoi: function(entity) {
31253           var parentWays = this._parentWays[entity.id];
31254           return !parentWays || parentWays.length === 0;
31255       },
31256
31257
31258       isShared: function(entity) {
31259           var parentWays = this._parentWays[entity.id];
31260           return parentWays && parentWays.length > 1;
31261       },
31262
31263
31264       parentRelations: function(entity) {
31265           var parents = this._parentRels[entity.id];
31266           var result = [];
31267
31268           if (parents) {
31269               for (var i = 0; i < parents.length; i++) {
31270                   result.push(this.entity(parents[i]));
31271               }
31272           }
31273           return result;
31274       },
31275
31276
31277       childNodes: function(entity) {
31278           if (this._childNodes[entity.id]) return this._childNodes[entity.id];
31279           if (!entity.nodes) return [];
31280
31281           var nodes = [];
31282           for (var i = 0; i < entity.nodes.length; i++) {
31283               nodes[i] = this.entity(entity.nodes[i]);
31284           }
31285
31286           this._childNodes[entity.id] = nodes;
31287           return this._childNodes[entity.id];
31288       },
31289
31290
31291       base: function() {
31292           return {
31293               'entities': utilGetPrototypeOf(this.entities),
31294               'parentWays': utilGetPrototypeOf(this._parentWays),
31295               'parentRels': utilGetPrototypeOf(this._parentRels)
31296           };
31297       },
31298
31299
31300       // Unlike other graph methods, rebase mutates in place. This is because it
31301       // is used only during the history operation that merges newly downloaded
31302       // data into each state. To external consumers, it should appear as if the
31303       // graph always contained the newly downloaded data.
31304       rebase: function(entities, stack, force) {
31305           var base = this.base();
31306           var i, j, k, id;
31307
31308           for (i = 0; i < entities.length; i++) {
31309               var entity = entities[i];
31310
31311               if (!entity.visible || (!force && base.entities[entity.id]))
31312                   continue;
31313
31314               // Merging data into the base graph
31315               base.entities[entity.id] = entity;
31316               this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
31317
31318               // Restore provisionally-deleted nodes that are discovered to have an extant parent
31319               if (entity.type === 'way') {
31320                   for (j = 0; j < entity.nodes.length; j++) {
31321                       id = entity.nodes[j];
31322                       for (k = 1; k < stack.length; k++) {
31323                           var ents = stack[k].entities;
31324                           if (ents.hasOwnProperty(id) && ents[id] === undefined) {
31325                               delete ents[id];
31326                           }
31327                       }
31328                   }
31329               }
31330           }
31331
31332           for (i = 0; i < stack.length; i++) {
31333               stack[i]._updateRebased();
31334           }
31335       },
31336
31337
31338       _updateRebased: function() {
31339           var base = this.base();
31340           var i, k, child, id, keys;
31341
31342           keys = Object.keys(this._parentWays);
31343           for (i = 0; i < keys.length; i++) {
31344               child = keys[i];
31345               if (base.parentWays[child]) {
31346                   for (k = 0; k < base.parentWays[child].length; k++) {
31347                       id = base.parentWays[child][k];
31348                       if (!this.entities.hasOwnProperty(id) && !includes(this._parentWays[child], id)) {
31349                           this._parentWays[child].push(id);
31350                       }
31351                   }
31352               }
31353           }
31354
31355           keys = Object.keys(this._parentRels);
31356           for (i = 0; i < keys.length; i++) {
31357               child = keys[i];
31358               if (base.parentRels[child]) {
31359                   for (k = 0; k < base.parentRels[child].length; k++) {
31360                       id = base.parentRels[child][k];
31361                       if (!this.entities.hasOwnProperty(id) && !includes(this._parentRels[child], id)) {
31362                           this._parentRels[child].push(id);
31363                       }
31364                   }
31365               }
31366           }
31367
31368           this.transients = {};
31369
31370           // this._childNodes is not updated, under the assumption that
31371           // ways are always downloaded with their child nodes.
31372       },
31373
31374
31375       // Updates calculated properties (parentWays, parentRels) for the specified change
31376       _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
31377           parentWays = parentWays || this._parentWays;
31378           parentRels = parentRels || this._parentRels;
31379
31380           var type = entity && entity.type || oldentity && oldentity.type;
31381           var removed, added, ways, rels, i;
31382
31383           if (type === 'way') {   // Update parentWays
31384               if (oldentity && entity) {
31385                   removed = difference(oldentity.nodes, entity.nodes);
31386                   added = difference(entity.nodes, oldentity.nodes);
31387               } else if (oldentity) {
31388                   removed = oldentity.nodes;
31389                   added = [];
31390               } else if (entity) {
31391                   removed = [];
31392                   added = entity.nodes;
31393               }
31394               for (i = 0; i < removed.length; i++) {
31395                   parentWays[removed[i]] = without(parentWays[removed[i]], oldentity.id);
31396               }
31397               for (i = 0; i < added.length; i++) {
31398                   ways = without(parentWays[added[i]], entity.id);
31399                   ways.push(entity.id);
31400                   parentWays[added[i]] = ways;
31401               }
31402
31403           } else if (type === 'relation') {   // Update parentRels
31404               if (oldentity && entity) {
31405                   removed = difference(oldentity.members, entity.members);
31406                   added = difference(entity.members, oldentity);
31407               } else if (oldentity) {
31408                   removed = oldentity.members;
31409                   added = [];
31410               } else if (entity) {
31411                   removed = [];
31412                   added = entity.members;
31413               }
31414               for (i = 0; i < removed.length; i++) {
31415                   parentRels[removed[i].id] = without(parentRels[removed[i].id], oldentity.id);
31416               }
31417               for (i = 0; i < added.length; i++) {
31418                   rels = without(parentRels[added[i].id], entity.id);
31419                   rels.push(entity.id);
31420                   parentRels[added[i].id] = rels;
31421               }
31422           }
31423       },
31424
31425
31426       replace: function(entity) {
31427           if (this.entities[entity.id] === entity) return this;
31428
31429           return this.update(function() {
31430               this._updateCalculated(this.entities[entity.id], entity);
31431               this.entities[entity.id] = entity;
31432           });
31433       },
31434
31435
31436       remove: function(entity) {
31437           return this.update(function() {
31438               this._updateCalculated(entity, undefined);
31439               this.entities[entity.id] = undefined;
31440           });
31441       },
31442
31443
31444       revert: function(id) {
31445           var baseEntity = this.base().entities[id];
31446           var headEntity = this.entities[id];
31447           if (headEntity === baseEntity) return this;
31448
31449           return this.update(function() {
31450               this._updateCalculated(headEntity, baseEntity);
31451               delete this.entities[id];
31452           });
31453       },
31454
31455
31456       update: function() {
31457           var graph = this.frozen ? coreGraph(this, true) : this;
31458           for (var i = 0; i < arguments.length; i++) {
31459               arguments[i].call(graph, graph);
31460           }
31461
31462           if (this.frozen) graph.frozen = true;
31463
31464           return graph;
31465       },
31466
31467
31468       // Obliterates any existing entities
31469       load: function(entities) {
31470           var base = this.base();
31471           this.entities = Object.create(base.entities);
31472
31473           for (var i in entities) {
31474               this.entities[i] = entities[i];
31475               this._updateCalculated(base.entities[i], this.entities[i]);
31476           }
31477
31478           return this;
31479       }
31480   };
31481
31482   function coreTree(head) {
31483       var rtree = rbush_1(),
31484           bboxes = {},
31485           tree = {};
31486
31487
31488       function entityBBox(entity) {
31489           var bbox = entity.extent(head).bbox();
31490           bbox.id = entity.id;
31491           bboxes[entity.id] = bbox;
31492           return bbox;
31493       }
31494
31495
31496       function updateParents(entity, insertions, memo) {
31497           head.parentWays(entity).forEach(function(way) {
31498               if (bboxes[way.id]) {
31499                   rtree.remove(bboxes[way.id]);
31500                   insertions[way.id] = way;
31501               }
31502               updateParents(way, insertions, memo);
31503           });
31504
31505           head.parentRelations(entity).forEach(function(relation) {
31506               if (memo[entity.id]) return;
31507               memo[entity.id] = true;
31508               if (bboxes[relation.id]) {
31509                   rtree.remove(bboxes[relation.id]);
31510                   insertions[relation.id] = relation;
31511               }
31512               updateParents(relation, insertions, memo);
31513           });
31514       }
31515
31516
31517       tree.rebase = function(entities, force) {
31518           var insertions = {};
31519
31520           for (var i = 0; i < entities.length; i++) {
31521               var entity = entities[i];
31522
31523               if (!entity.visible)
31524                   continue;
31525
31526               if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
31527                   if (!force) {
31528                       continue;
31529                   } else if (bboxes[entity.id]) {
31530                       rtree.remove(bboxes[entity.id]);
31531                   }
31532               }
31533
31534               insertions[entity.id] = entity;
31535               updateParents(entity, insertions, {});
31536           }
31537
31538           rtree.load(map$3(insertions, entityBBox));
31539
31540           return tree;
31541       };
31542
31543
31544       tree.intersects = function(extent, graph) {
31545           if (graph !== head) {
31546               var diff = coreDifference(head, graph),
31547                   insertions = {};
31548
31549               head = graph;
31550
31551               diff.deleted().forEach(function(entity) {
31552                   rtree.remove(bboxes[entity.id]);
31553                   delete bboxes[entity.id];
31554               });
31555
31556               diff.modified().forEach(function(entity) {
31557                   rtree.remove(bboxes[entity.id]);
31558                   insertions[entity.id] = entity;
31559                   updateParents(entity, insertions, {});
31560               });
31561
31562               diff.created().forEach(function(entity) {
31563                   insertions[entity.id] = entity;
31564               });
31565
31566               rtree.load(map$3(insertions, entityBBox));
31567           }
31568
31569           return rtree.search(extent.bbox()).map(function(bbox) {
31570               return head.entity(bbox.id);
31571           });
31572       };
31573
31574
31575       return tree;
31576   }
31577
31578   var _tooltipID = 0;
31579
31580   function tooltip() {
31581       var _id = _tooltipID++;
31582       var tooltip = function(selection) {
31583           selection.each(setup);
31584       };
31585       var _animation = utilFunctor(false);
31586       var _title = function() {
31587           var title = this.getAttribute('data-original-title');
31588           if (title) {
31589               return title;
31590           } else {
31591               title = this.getAttribute('title');
31592               this.removeAttribute('title');
31593               this.setAttribute('data-original-title', title);
31594           }
31595           return title;
31596       };
31597       var _html = utilFunctor(false);
31598       var _placement = utilFunctor('top');
31599
31600
31601       tooltip.title = function(val) {
31602           if (arguments.length) {
31603               _title = utilFunctor(val);
31604               return tooltip;
31605           } else {
31606               return _title;
31607           }
31608       };
31609
31610
31611       tooltip.html = function(val) {
31612           if (arguments.length) {
31613               _html = utilFunctor(val);
31614               return tooltip;
31615           } else {
31616               return _html;
31617           }
31618       };
31619
31620
31621       tooltip.placement = function(val) {
31622           if (arguments.length) {
31623               _placement = utilFunctor(val);
31624               return tooltip;
31625           } else {
31626               return _placement;
31627           }
31628       };
31629
31630
31631       tooltip.show = function(selection) {
31632           selection.each(show);
31633       };
31634
31635
31636       tooltip.hide = function(selection) {
31637           selection.each(hide);
31638       };
31639
31640
31641       tooltip.toggle = function(selection) {
31642           selection.each(toggle);
31643       };
31644
31645
31646       tooltip.destroy = function(selection, selector) {
31647           // by default, just destroy the current tooltip
31648           selector = selector || '.tooltip-' + _id;
31649
31650           selection
31651               .on('mouseenter.tooltip', null)
31652               .on('mouseleave.tooltip', null)
31653               .attr('title', function() {
31654                   return this.getAttribute('data-original-title') || this.getAttribute('title');
31655               })
31656               .attr('data-original-title', null)
31657               .selectAll(selector)
31658               .remove();
31659       };
31660
31661
31662       tooltip.destroyAny = function(selection) {
31663           selection.call(tooltip.destroy, '.tooltip');
31664       };
31665
31666
31667       function setup() {
31668           var root = select(this);
31669           var animate = _animation.apply(this, arguments);
31670           var tip = root.selectAll('.tooltip-' + _id)
31671               .data([0]);
31672
31673           var enter = tip.enter()
31674               .append('div')
31675               .attr('class', 'tooltip tooltip-' + _id);
31676
31677           enter
31678               .append('div')
31679               .attr('class', 'tooltip-arrow');
31680
31681           enter
31682               .append('div')
31683               .attr('class', 'tooltip-inner');
31684
31685           tip = enter
31686               .merge(tip);
31687
31688           if (animate) {
31689               tip.classed('fade', true);
31690           }
31691
31692           var place = _placement.apply(this, arguments);
31693           tip.classed(place, true);
31694
31695           root.on('mouseenter.tooltip', show);
31696           root.on('mouseleave.tooltip', hide);
31697       }
31698
31699
31700       function show() {
31701           var root = select(this);
31702           var content = _title.apply(this, arguments);
31703           var tip = root.selectAll('.tooltip-' + _id);
31704
31705           if (tip.empty()) {   // tooltip was removed somehow, put it back
31706               root.call(tooltip.destroy);
31707               root.each(setup);
31708               tip = root.selectAll('.tooltip-' + _id);
31709           }
31710
31711           tip.classed('in', true);
31712           var markup = _html.apply(this, arguments);
31713
31714           tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
31715           var place = _placement.apply(this, arguments);
31716           var outer = getPosition(root.node());
31717           var inner = getPosition(tip.node());
31718           var pos;
31719
31720           switch (place) {
31721               case 'top':
31722               pos = { x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h };
31723               break;
31724               case 'right':
31725               pos = { x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2 };
31726               break;
31727               case 'left':
31728               pos = { x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2 };
31729               break;
31730               case 'bottom':
31731               pos = { x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h };
31732               break;
31733           }
31734
31735           if (pos) {
31736               tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
31737           } else {
31738               tip.style('left', null).style('top', null);
31739           }
31740
31741           this.tooltipVisible = true;
31742
31743
31744           function getPosition(node) {
31745               var mode = select(node).style('position');
31746               if (mode === 'absolute' || mode === 'static') {
31747                   return {
31748                       x: node.offsetLeft,
31749                       y: node.offsetTop,
31750                       w: node.offsetWidth,
31751                       h: node.offsetHeight
31752                   };
31753               } else {
31754                   return {
31755                       x: 0,
31756                       y: 0,
31757                       w: node.offsetWidth,
31758                       h: node.offsetHeight
31759                   };
31760               }
31761           }
31762       }
31763
31764
31765       function hide() {
31766           select(this).selectAll('.tooltip-' + _id).classed('in', false);
31767           this.tooltipVisible = false;
31768       }
31769
31770
31771       function toggle() {
31772           if (this.tooltipVisible) {
31773               hide.apply(this, arguments);
31774           } else {
31775               show.apply(this, arguments);
31776           }
31777       }
31778
31779
31780       return tooltip;
31781   }
31782
31783   function behaviorEdit(context) {
31784
31785       function behavior() {
31786           context.map()
31787               .minzoom(context.minEditableZoom());
31788       }
31789
31790
31791       behavior.off = function() {
31792           context.map()
31793               .minzoom(0);
31794       };
31795
31796       return behavior;
31797   }
31798
31799   /*
31800      The hover behavior adds the `.hover` class on mouseover to all elements to which
31801      the identical datum is bound, and removes it on mouseout.
31802
31803      The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
31804      representation may consist of several elements scattered throughout the DOM hierarchy.
31805      Only one of these elements can have the :hover pseudo-class, but all of them will
31806      have the .hover class.
31807    */
31808   function behaviorHover(context) {
31809       var dispatch$1 = dispatch('hover');
31810       var _selection = select(null);
31811       var _newNodeId = null;
31812       var _initialNodeId = null;
31813       var _buttonDown;
31814       var _altDisables;
31815       var _ignoreVertex;
31816       var _target;
31817
31818
31819       function keydown() {
31820           if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
31821               _selection.selectAll('.hover')
31822                   .classed('hover-suppressed', true)
31823                   .classed('hover', false);
31824
31825               _selection
31826                   .classed('hover-disabled', true);
31827
31828               dispatch$1.call('hover', this, null);
31829           }
31830       }
31831
31832
31833       function keyup() {
31834           if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
31835               _selection.selectAll('.hover-suppressed')
31836                   .classed('hover-suppressed', false)
31837                   .classed('hover', true);
31838
31839               _selection
31840                   .classed('hover-disabled', false);
31841
31842               dispatch$1.call('hover', this, _target ? _target.id : null);
31843           }
31844       }
31845
31846
31847       function behavior(selection) {
31848           _selection = selection;
31849
31850           if (_initialNodeId) {
31851               _newNodeId = _initialNodeId;
31852               _initialNodeId = null;
31853           } else {
31854               _newNodeId = null;
31855           }
31856
31857           _selection
31858               .on('mouseover.hover', mouseover)
31859               .on('mouseout.hover', mouseout)
31860               .on('mousedown.hover', mousedown);
31861
31862           select(window)
31863               .on('keydown.hover', keydown)
31864               .on('keyup.hover', keyup);
31865
31866
31867           function mouseover() {
31868               if (_buttonDown) return;
31869               var target = event.target;
31870               enter(target ? target.__data__ : null);
31871           }
31872
31873
31874           function mouseout() {
31875               if (_buttonDown) return;
31876               var target = event.relatedTarget;
31877               enter(target ? target.__data__ : null);
31878           }
31879
31880
31881           function mousedown() {
31882               _buttonDown = true;
31883               select(window)
31884                   .on('mouseup.hover', mouseup, true);
31885           }
31886
31887
31888           function mouseup() {
31889               _buttonDown = false;
31890               select(window)
31891                   .on('mouseup.hover', null, true);
31892           }
31893
31894           function enter(datum) {
31895               if (datum === _target) return;
31896               _target = datum;
31897
31898               _selection.selectAll('.hover')
31899                   .classed('hover', false);
31900               _selection.selectAll('.hover-suppressed')
31901                   .classed('hover-suppressed', false);
31902
31903               // What are we hovering over?
31904               var entity, selector;
31905               if (datum && datum.__featurehash__) {
31906                   entity = datum;
31907                   selector = '.data' + datum.__featurehash__;
31908
31909               } else if (datum instanceof qaError) {
31910                   entity = datum;
31911                   selector = '.' + datum.service + '.error_id-' + datum.id;
31912
31913               } else if (datum instanceof osmNote) {
31914                   entity = datum;
31915                   selector = '.note-' + datum.id;
31916
31917               } else if (datum instanceof osmEntity) {
31918                   entity = datum;
31919                   selector = '.' + entity.id;
31920                   if (entity.type === 'relation') {
31921                       entity.members.forEach(function(member) { selector += ', .' + member.id; });
31922                   }
31923               } else if (datum && datum.properties && (datum.properties.entity instanceof osmEntity)) {
31924                   entity = datum.properties.entity;
31925                   selector = '.' + entity.id;
31926                   if (entity.type === 'relation') {
31927                       entity.members.forEach(function(member) { selector += ', .' + member.id; });
31928                   }
31929               }
31930
31931               // Update hover state and dispatch event
31932               if (entity && entity.id !== _newNodeId) {
31933                   // If drawing a way, don't hover on a node that was just placed. #3974
31934                   var mode = context.mode() && context.mode().id;
31935                   if ((mode === 'draw-line' || mode === 'draw-area') && !_newNodeId && entity.type === 'node') {
31936                       _newNodeId = entity.id;
31937                       return;
31938                   }
31939
31940                   var suppressed = (_altDisables && event && event.altKey) ||
31941                       (entity.type === 'node' && _ignoreVertex && !context.presets().allowsVertex(entity, context.graph()));
31942                   _selection.selectAll(selector)
31943                       .classed(suppressed ? 'hover-suppressed' : 'hover', true);
31944
31945                   dispatch$1.call('hover', this, !suppressed && entity);
31946
31947               } else {
31948                   dispatch$1.call('hover', this, null);
31949               }
31950           }
31951       }
31952
31953
31954       behavior.off = function(selection) {
31955           selection.selectAll('.hover')
31956               .classed('hover', false);
31957           selection.selectAll('.hover-suppressed')
31958               .classed('hover-suppressed', false);
31959           selection
31960               .classed('hover-disabled', false);
31961
31962           selection
31963               .on('mouseover.hover', null)
31964               .on('mouseout.hover', null)
31965               .on('mousedown.hover', null);
31966
31967           select(window)
31968               .on('keydown.hover', null)
31969               .on('keyup.hover', null);
31970       };
31971
31972
31973       behavior.altDisables = function(val) {
31974           if (!arguments.length) return _altDisables;
31975           _altDisables = val;
31976           return behavior;
31977       };
31978
31979       behavior.ignoreVertex = function(val) {
31980           if (!arguments.length) return _ignoreVertex;
31981           _ignoreVertex = val;
31982           return behavior;
31983       };
31984
31985       behavior.initialNodeId = function(nodeId) {
31986           _initialNodeId = nodeId;
31987           return behavior;
31988       };
31989
31990       return utilRebind(behavior, dispatch$1, 'on');
31991   }
31992
31993   function refresh(selection, node) {
31994       var cr = node.getBoundingClientRect();
31995       var prop = [cr.width, cr.height];
31996       selection.property('__dimensions__', prop);
31997       return prop;
31998   }
31999
32000   function utilGetDimensions(selection, force) {
32001       if (!selection || selection.empty()) {
32002           return [0, 0];
32003       }
32004       var node = selection.node(),
32005           cached = selection.property('__dimensions__');
32006       return (!cached || force) ? refresh(selection, node) : cached;
32007   }
32008
32009
32010   function utilSetDimensions(selection, dimensions) {
32011       if (!selection || selection.empty()) {
32012           return selection;
32013       }
32014       var node = selection.node();
32015       if (dimensions === null) {
32016           refresh(selection, node);
32017           return selection;
32018       }
32019       return selection
32020           .property('__dimensions__', [dimensions[0], dimensions[1]])
32021           .attr('width', dimensions[0])
32022           .attr('height', dimensions[1]);
32023   }
32024
32025   function behaviorTail() {
32026       var container;
32027       var xmargin = 25;
32028       var tooltipSize = [0, 0];
32029       var selectionSize = [0, 0];
32030       var _text;
32031
32032
32033       function behavior(selection) {
32034           if (!_text) return;
32035
32036           select(window)
32037               .on('resize.tail', function() { selectionSize = utilGetDimensions(selection); });
32038
32039           container = select(document.body)
32040               .append('div')
32041               .style('display', 'none')
32042               .attr('class', 'tail tooltip-inner');
32043
32044           container.append('div')
32045               .text(_text);
32046
32047           selection
32048               .on('mousemove.tail', mousemove)
32049               .on('mouseenter.tail', mouseenter)
32050               .on('mouseleave.tail', mouseleave);
32051
32052           container
32053               .on('mousemove.tail', mousemove);
32054
32055           tooltipSize = utilGetDimensions(container);
32056           selectionSize = utilGetDimensions(selection);
32057
32058
32059           function show() {
32060               container.style('display', 'block');
32061               tooltipSize = utilGetDimensions(container);
32062           }
32063
32064
32065           function mousemove() {
32066               if (container.style('display') === 'none') show();
32067               var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
32068                   -tooltipSize[0] - xmargin : xmargin;
32069               container.classed('left', xoffset > 0);
32070               utilSetTransform(container, event.clientX + xoffset, event.clientY);
32071           }
32072
32073
32074           function mouseleave() {
32075               if (event.relatedTarget !== container.node()) {
32076                   container.style('display', 'none');
32077               }
32078           }
32079
32080
32081           function mouseenter() {
32082               if (event.relatedTarget !== container.node()) {
32083                   show();
32084               }
32085           }
32086       }
32087
32088
32089       behavior.off = function(selection) {
32090           if (!_text) return;
32091
32092           container
32093               .on('mousemove.tail', null)
32094               .remove();
32095
32096           selection
32097               .on('mousemove.tail', null)
32098               .on('mouseenter.tail', null)
32099               .on('mouseleave.tail', null);
32100
32101           select(window)
32102               .on('resize.tail', null);
32103       };
32104
32105
32106       behavior.text = function(val) {
32107           if (!arguments.length) return _text;
32108           _text = val;
32109           return behavior;
32110       };
32111
32112
32113       return behavior;
32114   }
32115
32116   var _usedTails = {};
32117   var _disableSpace = false;
32118   var _lastSpace = null;
32119
32120
32121   function behaviorDraw(context) {
32122       var dispatch$1 = dispatch(
32123           'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
32124       );
32125
32126       var keybinding = utilKeybinding('draw');
32127
32128       var _hover = behaviorHover(context).altDisables(true).ignoreVertex(true)
32129           .on('hover', context.ui().sidebar.hover);
32130       var tail = behaviorTail();
32131       var edit = behaviorEdit(context);
32132
32133       var closeTolerance = 4;
32134       var tolerance = 12;
32135       var _mouseLeave = false;
32136       var _lastMouse = null;
32137
32138
32139       // related code
32140       // - `mode/drag_node.js` `datum()`
32141       function datum() {
32142           var mode = context.mode();
32143           var isNote = mode && (mode.id.indexOf('note') !== -1);
32144           if (event.altKey || isNote) return {};
32145
32146           var element;
32147           if (event.type === 'keydown') {
32148               element = _lastMouse && _lastMouse.target;
32149           } else {
32150               element = event.target;
32151           }
32152
32153           // When drawing, snap only to touch targets..
32154           // (this excludes area fills and active drawing elements)
32155           var d = element.__data__;
32156           return (d && d.properties && d.properties.target) ? d : {};
32157       }
32158
32159
32160       function mousedown() {
32161
32162           function point() {
32163               var p = context.container().node();
32164               return touchId !== null ? d3_touches(p).filter(function(p) {
32165                   return p.identifier === touchId;
32166               })[0] : mouse(p);
32167           }
32168
32169           var element = select(this);
32170           var touchId = event.touches ? event.changedTouches[0].identifier : null;
32171           var t1 = +new Date();
32172           var p1 = point();
32173
32174           element.on('mousemove.draw', null);
32175
32176           select(window).on('mouseup.draw', function() {
32177               var t2 = +new Date();
32178               var p2 = point();
32179               var dist = geoVecLength(p1, p2);
32180
32181               element.on('mousemove.draw', mousemove);
32182               select(window).on('mouseup.draw', null);
32183
32184               if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
32185                   // Prevent a quick second click
32186                   select(window).on('click.draw-block', function() {
32187                       event.stopPropagation();
32188                   }, true);
32189
32190                   context.map().dblclickEnable(false);
32191
32192                   window.setTimeout(function() {
32193                       context.map().dblclickEnable(true);
32194                       select(window).on('click.draw-block', null);
32195                   }, 500);
32196
32197                   click();
32198               }
32199           }, true);
32200       }
32201
32202
32203       function mousemove() {
32204           _lastMouse = event;
32205           dispatch$1.call('move', this, datum());
32206       }
32207
32208
32209       function mouseenter() {
32210           _mouseLeave = false;
32211       }
32212
32213
32214       function mouseleave() {
32215           _mouseLeave = true;
32216       }
32217
32218       function allowsVertex(d) {
32219           return isEmpty(d.tags) || context.presets().allowsVertex(d, context.graph());
32220       }
32221
32222       // related code
32223       // - `mode/drag_node.js`     `doMode()`
32224       // - `behavior/draw.js`      `click()`
32225       // - `behavior/draw_way.js`  `move()`
32226       function click() {
32227           var d = datum();
32228           var target = d && d.properties && d.properties.entity;
32229
32230           if (target && target.type === 'node' && allowsVertex(target)) {   // Snap to a node
32231               dispatch$1.call('clickNode', this, target, d);
32232               return;
32233
32234           } else if (target && target.type === 'way') {   // Snap to a way
32235               var choice = geoChooseEdge(
32236                   context.childNodes(target), context.mouse(), context.projection, context.activeID()
32237               );
32238               if (choice) {
32239                   var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
32240                   dispatch$1.call('clickWay', this, choice.loc, edge, d);
32241                   return;
32242               }
32243           }
32244           dispatch$1.call('click', this, context.map().mouseCoordinates(), d);
32245       }
32246
32247
32248       function space() {
32249           event.preventDefault();
32250           event.stopPropagation();
32251
32252           var currSpace = context.mouse();
32253           if (_disableSpace && _lastSpace) {
32254               var dist = geoVecLength(_lastSpace, currSpace);
32255               if (dist > tolerance) {
32256                   _disableSpace = false;
32257               }
32258           }
32259
32260           if (_disableSpace || _mouseLeave || !_lastMouse) return;
32261
32262           // user must move mouse or release space bar to allow another click
32263           _lastSpace = currSpace;
32264           _disableSpace = true;
32265
32266           select(window).on('keyup.space-block', function() {
32267               event.preventDefault();
32268               event.stopPropagation();
32269               _disableSpace = false;
32270               select(window).on('keyup.space-block', null);
32271           });
32272
32273           click();
32274       }
32275
32276
32277       function backspace() {
32278           event.preventDefault();
32279           dispatch$1.call('undo');
32280       }
32281
32282
32283       function del() {
32284           event.preventDefault();
32285           dispatch$1.call('cancel');
32286       }
32287
32288
32289       function ret() {
32290           event.preventDefault();
32291           dispatch$1.call('finish');
32292       }
32293
32294
32295       function behavior(selection) {
32296           context.install(_hover);
32297           context.install(edit);
32298
32299           if (!context.inIntro() && !_usedTails[tail.text()]) {
32300               context.install(tail);
32301           }
32302
32303           keybinding
32304               .on('⌫', backspace)
32305               .on('⌦', del)
32306               .on('⎋', ret)
32307               .on('↩', ret)
32308               .on('space', space)
32309               .on('⌥space', space);
32310
32311           selection
32312               .on('mouseenter.draw', mouseenter)
32313               .on('mouseleave.draw', mouseleave)
32314               .on('mousedown.draw', mousedown)
32315               .on('mousemove.draw', mousemove);
32316
32317           select(document)
32318               .call(keybinding);
32319
32320           return behavior;
32321       }
32322
32323
32324       behavior.off = function(selection) {
32325           context.ui().sidebar.hover.cancel();
32326           context.uninstall(_hover);
32327           context.uninstall(edit);
32328
32329           if (!context.inIntro() && !_usedTails[tail.text()]) {
32330               context.uninstall(tail);
32331               _usedTails[tail.text()] = true;
32332           }
32333
32334           selection
32335               .on('mouseenter.draw', null)
32336               .on('mouseleave.draw', null)
32337               .on('mousedown.draw', null)
32338               .on('mousemove.draw', null);
32339
32340           select(window)
32341               .on('mouseup.draw', null);
32342               // note: keyup.space-block, click.draw-block should remain
32343
32344           select(document)
32345               .call(keybinding.unbind);
32346       };
32347
32348
32349       behavior.tail = function(_) {
32350           tail.text(_);
32351           return behavior;
32352       };
32353
32354       behavior.hover = function() {
32355           return _hover;
32356       };
32357
32358
32359       return utilRebind(behavior, dispatch$1, 'on');
32360   }
32361
32362   function modeAddArea(context) {
32363       var mode = {
32364           id: 'add-area',
32365           button: 'area',
32366           title: t('modes.add_area.title'),
32367           description: t('modes.add_area.description'),
32368           key: '3'
32369       };
32370
32371       var behavior = behaviorAddWay(context)
32372           .tail(t('modes.add_area.tail'))
32373           .on('start', start)
32374           .on('startFromWay', startFromWay)
32375           .on('startFromNode', startFromNode);
32376
32377       var defaultTags = { area: 'yes' };
32378
32379
32380       function actionClose(wayId) {
32381           return function (graph) {
32382               return graph.replace(graph.entity(wayId).close());
32383           };
32384       }
32385
32386
32387       function start(loc) {
32388           var startGraph = context.graph();
32389           var node = osmNode({ loc: loc });
32390           var way = osmWay({ tags: defaultTags });
32391
32392           context.perform(
32393               actionAddEntity(node),
32394               actionAddEntity(way),
32395               actionAddVertex(way.id, node.id),
32396               actionClose(way.id)
32397           );
32398
32399           context.enter(modeDrawArea(context, way.id, startGraph, context.graph()));
32400       }
32401
32402
32403       function startFromWay(loc, edge) {
32404           var startGraph = context.graph();
32405           var node = osmNode({ loc: loc });
32406           var way = osmWay({ tags: defaultTags });
32407
32408           context.perform(
32409               actionAddEntity(node),
32410               actionAddEntity(way),
32411               actionAddVertex(way.id, node.id),
32412               actionClose(way.id),
32413               actionAddMidpoint({ loc: loc, edge: edge }, node)
32414           );
32415
32416           context.enter(modeDrawArea(context, way.id, startGraph, context.graph()));
32417       }
32418
32419
32420       function startFromNode(node) {
32421           var startGraph = context.graph();
32422           var way = osmWay({ tags: defaultTags });
32423
32424           context.perform(
32425               actionAddEntity(way),
32426               actionAddVertex(way.id, node.id),
32427               actionClose(way.id)
32428           );
32429
32430           context.enter(modeDrawArea(context, way.id, startGraph, context.graph()));
32431       }
32432
32433
32434       mode.enter = function() {
32435           context.install(behavior);
32436       };
32437
32438
32439       mode.exit = function() {
32440           context.uninstall(behavior);
32441       };
32442
32443
32444       return mode;
32445   }
32446
32447   function modeAddLine(context) {
32448       var mode = {
32449           id: 'add-line',
32450           button: 'line',
32451           title: t('modes.add_line.title'),
32452           description: t('modes.add_line.description'),
32453           key: '2'
32454       };
32455
32456       var behavior = behaviorAddWay(context)
32457           .tail(t('modes.add_line.tail'))
32458           .on('start', start)
32459           .on('startFromWay', startFromWay)
32460           .on('startFromNode', startFromNode);
32461
32462
32463       function start(loc) {
32464           var startGraph = context.graph();
32465           var node = osmNode({ loc: loc });
32466           var way = osmWay();
32467
32468           context.perform(
32469               actionAddEntity(node),
32470               actionAddEntity(way),
32471               actionAddVertex(way.id, node.id)
32472           );
32473
32474           context.enter(modeDrawLine(context, way.id, startGraph, context.graph()));
32475       }
32476
32477
32478       function startFromWay(loc, edge) {
32479           var startGraph = context.graph();
32480           var node = osmNode({ loc: loc });
32481           var way = osmWay();
32482
32483           context.perform(
32484               actionAddEntity(node),
32485               actionAddEntity(way),
32486               actionAddVertex(way.id, node.id),
32487               actionAddMidpoint({ loc: loc, edge: edge }, node)
32488           );
32489
32490           context.enter(modeDrawLine(context, way.id, startGraph, context.graph()));
32491       }
32492
32493
32494       function startFromNode(node) {
32495           var startGraph = context.graph();
32496           var way = osmWay();
32497
32498           context.perform(
32499               actionAddEntity(way),
32500               actionAddVertex(way.id, node.id)
32501           );
32502
32503           context.enter(modeDrawLine(context, way.id, startGraph, context.graph()));
32504       }
32505
32506
32507       mode.enter = function() {
32508           context.install(behavior);
32509       };
32510
32511
32512       mode.exit = function() {
32513           context.uninstall(behavior);
32514       };
32515
32516       return mode;
32517   }
32518
32519   function modeAddPoint(context) {
32520       var mode = {
32521           id: 'add-point',
32522           button: 'point',
32523           title: t('modes.add_point.title'),
32524           description: t('modes.add_point.description'),
32525           key: '1'
32526       };
32527
32528       var behavior = behaviorDraw(context)
32529           .tail(t('modes.add_point.tail'))
32530           .on('click', add)
32531           .on('clickWay', addWay)
32532           .on('clickNode', addNode)
32533           .on('cancel', cancel)
32534           .on('finish', cancel);
32535
32536
32537       function add(loc) {
32538           var node = osmNode({ loc: loc });
32539
32540           context.perform(
32541               actionAddEntity(node),
32542               t('operations.add.annotation.point')
32543           );
32544
32545           context.enter(
32546               modeSelect(context, [node.id]).newFeature(true)
32547           );
32548       }
32549
32550
32551       function addWay(loc, edge) {
32552           var node =  osmNode();
32553
32554           context.perform(
32555               actionAddMidpoint({loc: loc, edge: edge}, node),
32556               t('operations.add.annotation.vertex')
32557           );
32558
32559           context.enter(
32560               modeSelect(context, [node.id]).newFeature(true)
32561           );
32562       }
32563
32564
32565       function addNode(node) {
32566           add(node.loc);
32567       }
32568
32569
32570       function cancel() {
32571           context.enter(modeBrowse(context));
32572       }
32573
32574
32575       mode.enter = function() {
32576           context.install(behavior);
32577       };
32578
32579
32580       mode.exit = function() {
32581           context.uninstall(behavior);
32582       };
32583
32584
32585       return mode;
32586   }
32587
32588   var localizeStrings = {"this node":"this_node","this way":"this_way","this relation":"this_relation","this one-way":"this_oneway","this highway":"this_highway","this railway":"this_railway","this waterway":"this_waterway","this cycleway":"this_cycleway","this footpath":"this_footpath","this cycleway/footpath":"this_cycleway_footpath","this riverbank":"this_riverbank","this crossing":"this_crossing","this railway crossing":"this_railway_crossing","this bridge":"this_bridge","this tunnel":"this_tunnel","this boundary":"this_boundary","this turn-restriction":"this_turn_restriction","this roundabout":"this_roundabout","this mini-roundabout":"this_mini_roundabout","this track":"this_track","this feature":"this_feature",highway:"highway",railway:"railway",waterway:"waterway",cycleway:"cycleway",cycleway_footpath:"cycleway/footpath",riverbank:"riverbank",place_of_worship:"place_of_worship",pub:"pub",restaurant:"restaurant",school:"school",university:"university",hospital:"hospital",library:"library",theatre:"theatre",courthouse:"courthouse",bank:"bank",cinema:"cinema",pharmacy:"pharmacy",cafe:"cafe",fast_food:"fast_food",fuel:"fuel",from:"from",to:"to","left-hand":"left_hand","right-hand":"right_hand"};
32589   var errorTypes = {"20":{title:"multiple nodes on the same spot",severity:"warning",description:"There is more than one node in this spot. Offending node IDs: $1",IDs:["20"],regex:"IDs: ((?:#\\d+,?)+)"},"30":{title:"non-closed_areas",severity:"error",description:"This way is tagged with '$1' and should be closed-loop.",IDs:["this",""],regex:"(this way) is tagged with '(.+)'"},"40":{title:"dead-ended one-ways",severity:"error",description:"The first node (id $1) of this one-way is not connected to any other way",IDs:["n","this"],regex:"\\(id (\\d+)\\) of (this one-way)"},"41":{title:"",severity:"error",description:"The last node (id $1) of this one-way is not connected to any other way",IDs:["n","this"],regex:"\\(id (\\d+)\\) of (this one-way)"},"42":{title:"",severity:"error",description:"This node cannot be reached because one-ways only lead away from here",IDs:["this"],regex:"(this node)"},"43":{title:"",severity:"error",description:"You cannot escape from this node because one-ways only lead to here",IDs:["this"],regex:"(this node)"},"50":{title:"almost-junctions",severity:"error",description:"This node is very close but not connected to way #$1",IDs:["this","w"],regex:"(this node) is very close but not connected to way #(\\d+)"},"60":{title:"deprecated tags",severity:"warning",description:"This $1 uses deprecated tag $2. Please use $3 instead!",IDs:["this","",""],regex:"(this (?:node|way|relation)) uses deprecated tag '(.+)'\\. Please use &quot;(.+)&quot;"},"70":{title:"missing tags",severity:"error",description:"This $1 has an empty tag: $2",IDs:["this",""],regex:"(this (?:node|way|relation)) has an empty tag: &quot;(.+)=&quot;"},"71":{title:"",severity:"error",description:"This way has no tags",IDs:["this"],regex:"(this way)"},"72":{title:"",severity:"error",description:"This node is not member of any way and does not have any tags",IDs:["this"],regex:"(this node)"},"73":{title:"",severity:"error",description:"This way has a $1 tag but no highway tag",IDs:["this",""],regex:"(this way) has a (.+) tag"},"74":{title:"missing tags",severity:"error",description:"This $1 has an empty tag: $2",IDs:["this",""],regex:"(this (?:node|way|relation)) has an empty tag: &quot;(.+)=&quot;"},"75":{description:"This (node|way|relation) has a name \\((.+)\\) but no other tag",IDs:["this",""],regex:"(this (?:node|way|relation)) has a name \\((.+)\\)"},"90":{title:"motorways without ref",severity:"error",description:"This way is tagged as motorway and therefore needs a ref nat_ref or int_ref tag",IDs:["this"],regex:"(this way)"},"100":{title:"places of worship without religion",severity:"error",description:"This $1 is tagged as place of worship and therefore needs a religion tag",IDs:["this"],regex:"(this (?:node|way|relation))"},"110":{title:"point of interest without name",severity:"error",description:"This node is tagged as $1 and therefore needs a name tag",IDs:["this",""],regex:"(this (?:node|way|relation)) is tagged as (.+) and"},"120":{title:"ways without nodes",severity:"error",description:"This way has just one single node",IDs:["this"],regex:"(this way)"},"130":{title:"floating islands",severity:"error",description:"This way is not connected to the rest of the map",IDs:["this"],regex:"(this way)"},"150":{title:"railway crossing without tag",severity:"error",description:"This crossing of a highway and a railway needs to be tagged as railway=crossing or railway=level_crossing",IDs:["this"],regex:"(this crossing)"},"160":{title:"wrongly used railway tag",severity:"error",description:"There are ways in different layers coming together in this railway crossing. There are ways tagged as tunnel or bridge coming together in this railway crossing",IDs:["this"],regex:"(this railway crossing)"},"170":{title:"FIXME tagged items",severity:"error",description:"This feature has a FIXME tag: (.*)",IDs:["this"],regex:"(this feature) has a FIXME tag: (.*)"},"180":{title:"relations without type",severity:"error",description:"This relation has no type tag which is mandatory for relations",IDs:["this"],regex:"(this relation)"},"190":{title:"intersections without junctions",severity:"error",description:"This $1 intersects the $2 #$3 but there is no junction node",IDs:["this","","w"],regex:"(this .+) intersects the (.+) #(\\d+)"},"200":{title:"overlapping ways",severity:"error",description:"This $1 overlaps the $2 #$3",IDs:["this","","w"],regex:"(this .+) overlaps the (.+) #(\\d+)"},"210":{title:"loopings",severity:"error",description:"These errors contain self intersecting ways"},"211":{title:"",severity:"error",description:"This way contains more than one node at least twice. Nodes are $1.",IDs:["this","211"],regex:"(this way) contains more than one node at least twice. Nodes are ((?:#\\d+(?:, )?)+)\\."},"212":{title:"",severity:"error",description:"This way has only two different nodes and contains one of them more than once",IDs:["this"],regex:"(this way)"},"220":{title:"misspelled tags",severity:"error",description:"This $1 is tagged '$2' where $3 looks like $4",regex:"(this (?:node|way|relation)) is tagged '(.+)' where &quot;(.+)&quot; looks like &quot;(.+)&quot;"},"221":{title:"",severity:"error",description:"The key of this $1's tag is 'key': $2",regex:"(this (?:node|way|relation))\\'s tag is \\'key\\': (.+)"},"230":{title:"layer conflicts",severity:"error",description:"This node is a junction of ways on different layers.",IDs:["this"],regex:"(this node)"},"231":{title:"mixed layers intersection",severity:"error",description:"This node is a junction of ways on different layers: $1",IDs:["this","231"],regex:"(this node) is a junction of ways on different layers: (.+)"},"232":{title:"strange layers",severity:"error",description:"This $1 is tagged with layer $2. This need not be an error, but it looks strange",IDs:["this",""],regex:"(this (?:bridge|tunnel)) is tagged with layer (-?\\d+)\\."},"270":{title:"motorways connected directly",severity:"error",description:"This node is a junction of a motorway and a highway other than motorway, motorway_link, trunk, rest_area or construction. Service or unclassified is only valid if it has access=no/private or it leads to a motorway service area or if it is a service=parking_aisle.",IDs:["this"],regex:"(this node)"},"280":{title:"boundaries",severity:"error",description:"Administrative Boundaries can be expressed either by tagging ways or by adding them to a relation. They should be closed-loop sequences of ways, they must not self-intersect or split and they must have a name and an admin_level."},"281":{title:"missing name",severity:"error",description:"This boundary has no name",IDs:["this"],regex:"(this boundary)"},"282":{title:"missing admin level",severity:"error",description:"The boundary of $1 has no (?:valid numeric)?admin_level",regex:"of (.+) has"},"283":{title:"no closed loop",severity:"error",description:"The boundary of $1 is not closed-loop",regex:"boundary of (.+) is"},"284":{title:"splitting boundary",severity:"error",description:"The boundary of $1 splits here",regex:"boundary of (.+) splits"},"285":{title:"admin_level too high",severity:"error",description:"This boundary-way has admin_level $1 but belongs to a relation with lower admin_level (higher priority); it should have the lowest admin_level of all relations",IDs:["this",""],regex:"(this boundary)-way has admin_level (-?\\d+) but"},"290":{title:"restrictions",severity:"error",description:"Analyses all relations tagged type=restriction or following variations type=restriction:hgv type=restriction:caravan type=restriction:motorcar type=restriction:bus type=restriction:agricultural type=restriction:motorcycle type=restriction:bicycle and type=restriction:hazmat"},"291":{title:"missing type",severity:"error",description:"This turn-restriction has no (?:known )?restriction type",IDs:["this"],regex:"(this turn-restriction) has"},"292":{title:"missing from way",severity:"error",description:"This turn-restriction needs exactly one from member. This one has $1",IDs:["this",""],regex:"(this turn-restriction) needs.+has (\\d+)"},"293":{title:"missing to way",severity:"error",description:"This turn-restriction needs exactly one to member. This one has $1",IDs:["this",""],regex:"(this turn-restriction) needs.+has (\\d+)"},"294":{title:"from or to not a way",severity:"error",description:"From- and To-members of this turn-restriction need to be ways. $1",IDs:["this","294"],regex:"(this turn-restriction)~.+ways\\. ((?:(?:from|to) (?:node|relation) #\\d+,?)+)"},"295":{title:"via is not on the way ends",severity:"error",description:"via (node #$1) is not the first or the last member of (from|to) (way #$3)",IDs:["this","n","","w"],regex:"(this turn-restriction)~via \\(node #(\\d+)\\).+ of (from|to) \\(way #(\\d+)\\)"},"296":{title:"wrong restriction angle",severity:"error",description:"This turn-restriction type is $1, but angle is $2 degrees. Maybe the restriction type is not appropriate?",IDs:["this","",""],regex:"(this turn-restriction)~.+is (\\w+), but angle is (-?\\d+)"},"297":{title:"wrong direction of to member",severity:"error",description:"wrong direction of to way $1",IDs:["this","w"],regex:"(this turn-restriction)~.+to way (\\d+)"},"298":{title:"already restricted by oneway",severity:"error",description:"entry already prohibited by oneway tag on $1",IDs:["this","w"],regex:"(this turn-restriction)~.+tag on (\\d+)"},"300":{title:"missing maxspeed",severity:"warning",description:"This highway is missing a maxspeed tag",IDs:["this"],regex:"(this highway)"},"310":{title:"roundabouts",severity:"error",description:"Analyses ways with tag junction=roundabout. More then one way can form a roundabout. It supports tag oneway=-1"},"311":{title:"not closed loop",severity:"error",description:"This way is part of a roundabout but is not closed-loop. (split carriageways approaching a roundabout should not be tagged as roundabout)",IDs:["this"],regex:"(this way)"},"312":{title:"wrong direction",severity:"error",description:"If this ((?:mini_)?roundabout) is in a country with (left|right)-hand traffic then its orientation goes the wrong way around",IDs:["this",""],regex:"(this (?:mini_)?roundabout) is in a country with ((?:left|right)-hand)"},"313":{title:"faintly connected",severity:"error",description:"This roundabout has only $1 other roads connected. Roundabouts typically have three",IDs:["this",""],regex:"(this roundabout) has only (\\d) other"},"320":{title:"*_link connections",severity:"error",description:"This way is tagged as highway=$1_link but doesn't have a connection to any other $1 or $1_link",IDs:["this","","","",""],regex:"(this way) is tagged as (highway=.+) but doesn't have a connection to any other (.+) or (.+)"},"350":{title:"bridge-tags",severity:"error",description:"This bridge does not have a tag in common with its surrounding ways that shows the purpose of this bridge. There should be one of these tags: (.+)",NOTE:"Group can be arbitrary list of form: key=value,key=value,key=value...",IDs:["this",""],regex:"(this bridge).*tags: (.+)"},"360":{title:"language unknown",severity:"warning",description:"It would be nice if this (node|way|relation) had an additional tag 'name:XX=(.+)' where XX shows the language of its name '\\2'",IDs:["this",""],regex:"(this (?:node|way|relation)) had an additional tag 'name:XX=(.+)' where"},"370":{title:"doubled places",severity:"error",description:"This node has tags in common with the surrounding way #$1 ((?:\\(including the name '.+'\\) )?)and seems to be redundand",IDs:["this","w","370"],regex:"(this node) has tags in common with the surrounding way #(\\d+) ((?:\\(including the name '.+'\\) )?)and"},"380":{title:"non-physical use of sport-tag",severity:"error",description:"This way is tagged sport=$1 but has no physical tag like e.g. leisure, building, amenity or highway",IDs:["this",""],regex:"(this way) is tagged (sport=.+) but"},"390":{title:"missing tracktype",severity:"warning",description:"This track doesn''t have a tracktype",IDs:["this"],regex:"(this track)"},"400":{title:"geometry glitches",severity:"error",description:""},"401":{title:"missing turn restriction",severity:"error",description:"ways $1 and $2 join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning( from way (\\1|\\2) to (\\1|\\2))?",IDs:["w","w"],regex:"ways (\\d+) and (\\d+) join"},"402":{title:"impossible angles",severity:"error",description:"this way bends in a very sharp angle here",IDs:["this"],regex:"(this way)"},"410":{title:"website",severity:"error",description:"Web pages are analyzed. Web page is defined by any of the following tags website=* url=* website:mobile=* contact:website=* contact:url=* image=* source:website=* or source:url=*"},"411":{title:"http error",severity:"error",description:"The URL (<a target=_blank href=$1>$1</a>) cannot be opened (HTTP status code $2)",IDs:["this","url",""],regex:"(this feature)~.+ href=([^>]+)>.+ code (\\d+)\\)"},"412":{title:"domain hijacking",severity:"error",description:"Possible domain squatting: <a target=_blank href=$1>$1</a>. Suspicious text is: \"$2\"",IDs:["this","url",""],regex:"(this feature)~.+ href=([^>]+)>.+ is: &quot;(.+)&quot;"},"413":{title:"non-match",severity:"error",description:"Content of the URL (<a target=_blank href=$1>$1</a>) did not contain these keywords: ($2)",IDs:["this","url",""],regex:"(this feature)~.+ href=([^>]+)>.+ keywords: \\((.+)\\)"}};
32590
32591   var tiler = utilTiler();
32592   var dispatch$1 = dispatch('loaded');
32593
32594   var _krCache;
32595   var _krZoom = 14;
32596   var _krUrlRoot = 'https://www.keepright.at/';
32597
32598   var _krRuleset = [
32599       // no 20 - multiple node on same spot - these are mostly boundaries overlapping roads
32600       30, 40, 50, 60, 70, 90, 100, 110, 120, 130, 150, 160, 170, 180,
32601       190, 191, 192, 193, 194, 195, 196, 197, 198,
32602       200, 201, 202, 203, 204, 205, 206, 207, 208, 210, 220,
32603       230, 231, 232, 270, 280, 281, 282, 283, 284, 285,
32604       290, 291, 292, 293, 294, 295, 296, 297, 298, 300, 310, 311, 312, 313,
32605       320, 350, 360, 370, 380, 390, 400, 401, 402, 410, 411, 412, 413
32606   ];
32607
32608
32609   function abortRequest(i) {
32610       if (i) {
32611           i.abort();
32612       }
32613   }
32614
32615   function abortUnwantedRequests(cache, tiles) {
32616       forEach(cache.inflightTile, function(v, k) {
32617           var wanted = find$1(tiles, function(tile) {
32618               return k === tile.id;
32619           });
32620           if (!wanted) {
32621               abortRequest(v);
32622               delete cache.inflightTile[k];
32623           }
32624       });
32625   }
32626
32627
32628   function encodeErrorRtree(d) {
32629       return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
32630   }
32631
32632
32633   // replace or remove error from rtree
32634   function updateRtree(item, replace) {
32635       _krCache.rtree.remove(item, function isEql(a, b) {
32636           return a.data.id === b.data.id;
32637       });
32638
32639       if (replace) {
32640           _krCache.rtree.insert(item);
32641       }
32642   }
32643
32644
32645   function tokenReplacements(d) {
32646       if (!(d instanceof qaError)) return;
32647
32648       var htmlRegex = new RegExp(/<\/[a-z][\s\S]*>/);
32649       var replacements = {};
32650
32651       var errorTemplate = errorTypes[d.which_type];
32652       if (!errorTemplate) {
32653           /* eslint-disable no-console */
32654           console.log('No Template: ', d.which_type);
32655           console.log('  ', d.description);
32656           /* eslint-enable no-console */
32657           return;
32658       }
32659
32660       // some descriptions are just fixed text
32661       if (!errorTemplate.regex) return;
32662
32663       // regex pattern should match description with variable details captured
32664       var errorRegex = new RegExp(errorTemplate.regex, 'i');
32665       var errorMatch = errorRegex.exec(d.description);
32666       if (!errorMatch) {
32667           /* eslint-disable no-console */
32668           console.log('Unmatched: ', d.which_type);
32669           console.log('  ', d.description);
32670           console.log('  ', errorRegex);
32671           /* eslint-enable no-console */
32672           return;
32673       }
32674
32675       for (var i = 1; i < errorMatch.length; i++) {   // skip first
32676           var capture = errorMatch[i];
32677           var idType;
32678
32679           idType = 'IDs' in errorTemplate ? errorTemplate.IDs[i-1] : '';
32680           if (idType && capture) {   // link IDs if present in the capture
32681               capture = parseError(capture, idType);
32682           } else if (htmlRegex.test(capture)) {   // escape any html in non-IDs
32683               capture = '\\' +  capture + '\\';
32684           } else {
32685               var compare = capture.toLowerCase();
32686               if (localizeStrings[compare]) {   // some replacement strings can be localized
32687                   capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
32688               }
32689           }
32690
32691           replacements['var' + i] = capture;
32692       }
32693
32694       return replacements;
32695   }
32696
32697
32698   function parseError(capture, idType) {
32699       var compare = capture.toLowerCase();
32700       if (localizeStrings[compare]) {   // some replacement strings can be localized
32701           capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
32702       }
32703
32704       switch (idType) {
32705           // link a string like "this node"
32706           case 'this':
32707               capture = linkErrorObject(capture);
32708               break;
32709
32710           case 'url':
32711               capture = linkURL(capture);
32712               break;
32713
32714           // link an entity ID
32715           case 'n':
32716           case 'w':
32717           case 'r':
32718               capture = linkEntity(idType + capture);
32719               break;
32720
32721           // some errors have more complex ID lists/variance
32722           case '20':
32723               capture = parse20(capture);
32724               break;
32725           case '211':
32726               capture = parse211(capture);
32727               break;
32728           case '231':
32729               capture = parse231(capture);
32730               break;
32731           case '294':
32732               capture = parse294(capture);
32733               break;
32734           case '370':
32735               capture = parse370(capture);
32736               break;
32737       }
32738
32739       return capture;
32740
32741
32742       function linkErrorObject(d) {
32743           return '<a class="error_object_link">' + d + '</a>';
32744       }
32745
32746       function linkEntity(d) {
32747           return '<a class="error_entity_link">' + d + '</a>';
32748       }
32749
32750       function linkURL(d) {
32751           return '<a class="kr_external_link" target="_blank" href="' + d + '">' + d + '</a>';
32752       }
32753
32754       // arbitrary node list of form: #ID, #ID, #ID...
32755       function parse211(capture) {
32756           var newList = [];
32757           var items = capture.split(', ');
32758
32759           items.forEach(function(item) {
32760               // ID has # at the front
32761               var id = linkEntity('n' + item.slice(1));
32762               newList.push(id);
32763           });
32764
32765           return newList.join(', ');
32766       }
32767
32768       // arbitrary way list of form: #ID(layer),#ID(layer),#ID(layer)...
32769       function parse231(capture) {
32770           var newList = [];
32771           // unfortunately 'layer' can itself contain commas, so we split on '),'
32772           var items = capture.split('),');
32773
32774           items.forEach(function(item) {
32775               var match = item.match(/\#(\d+)\((.+)\)?/);
32776               if (match !== null && match.length > 2) {
32777                   newList.push(linkEntity('w' + match[1]) + ' ' +
32778                       t('QA.keepRight.errorTypes.231.layer', { layer: match[2] })
32779                   );
32780               }
32781           });
32782
32783           return newList.join(', ');
32784       }
32785
32786       // arbitrary node/relation list of form: from node #ID,to relation #ID,to node #ID...
32787       function parse294(capture) {
32788           var newList = [];
32789           var items = capture.split(',');
32790
32791           items.forEach(function(item) {
32792               var role;
32793               var idType;
32794               var id;
32795
32796               // item of form "from/to node/relation #ID"
32797               item = item.split(' ');
32798
32799               // to/from role is more clear in quotes
32800               role = '"' + item[0] + '"';
32801
32802               // first letter of node/relation provides the type
32803               idType = item[1].slice(0,1);
32804
32805               // ID has # at the front
32806               id = item[2].slice(1);
32807               id = linkEntity(idType + id);
32808
32809               item = [role, item[1], id].join(' ');
32810               newList.push(item);
32811           });
32812
32813           return newList.join(', ');
32814       }
32815
32816       // may or may not include the string "(including the name 'name')"
32817       function parse370(capture) {
32818           if (!capture) return '';
32819
32820           var match = capture.match(/\(including the name (\'.+\')\)/);
32821           if (match !== null && match.length) {
32822               return t('QA.keepRight.errorTypes.370.including_the_name', { name: match[1] });
32823           }
32824           return '';
32825       }
32826
32827       // arbitrary node list of form: #ID,#ID,#ID...
32828       function parse20(capture) {
32829           var newList = [];
32830           var items = capture.split(',');
32831
32832           items.forEach(function(item) {
32833               // ID has # at the front
32834               var id = linkEntity('n' + item.slice(1));
32835               newList.push(id);
32836           });
32837
32838           return newList.join(', ');
32839       }
32840   }
32841
32842
32843   var serviceKeepRight = {
32844       init: function() {
32845           if (!_krCache) {
32846               this.reset();
32847           }
32848
32849           this.event = utilRebind(this, dispatch$1, 'on');
32850       },
32851
32852       reset: function() {
32853           if (_krCache) {
32854               forEach(_krCache.inflightTile, abortRequest);
32855           }
32856           _krCache = {
32857               data: {},
32858               loadedTile: {},
32859               inflightTile: {},
32860               inflightPost: {},
32861               closed: {},
32862               rtree: rbush_1()
32863           };
32864       },
32865
32866
32867       // KeepRight API:  http://osm.mueschelsoft.de/keepright/interfacing.php
32868       loadErrors: function(projection) {
32869           var options = { format: 'geojson' };
32870           var rules = _krRuleset.join();
32871
32872           // determine the needed tiles to cover the view
32873           var tiles = tiler
32874               .zoomExtent([_krZoom, _krZoom])
32875               .getTiles(projection);
32876
32877           // abort inflight requests that are no longer needed
32878           abortUnwantedRequests(_krCache, tiles);
32879
32880           // issue new requests..
32881           tiles.forEach(function(tile) {
32882               if (_krCache.loadedTile[tile.id] || _krCache.inflightTile[tile.id]) return;
32883
32884               var rect = tile.extent.rectangle();
32885               var params = assignIn({}, options, { left: rect[0], bottom: rect[3], right: rect[2], top: rect[1] });
32886               var url = _krUrlRoot + 'export.php?' + utilQsString(params) + '&ch=' + rules;
32887
32888               _krCache.inflightTile[tile.id] = d3_json(url,
32889                   function(err, data) {
32890                       delete _krCache.inflightTile[tile.id];
32891
32892                       if (err) return;
32893                       _krCache.loadedTile[tile.id] = true;
32894
32895                       if (!data.features || !data.features.length) return;
32896
32897                       data.features.forEach(function(feature) {
32898                           var loc = feature.geometry.coordinates;
32899                           var props = feature.properties;
32900
32901                           // if there is a parent, save its error type e.g.:
32902                           //  Error 191 = "highway-highway"
32903                           //  Error 190 = "intersections without junctions"  (parent)
32904                           var errorType = props.error_type;
32905                           var errorTemplate = errorTypes[errorType];
32906                           var parentErrorType = (Math.floor(errorType / 10) * 10).toString();
32907
32908                           // try to handle error type directly, fallback to parent error type.
32909                           var whichType = errorTemplate ? errorType : parentErrorType;
32910                           var whichTemplate = errorTypes[whichType];
32911
32912                           // Rewrite a few of the errors at this point..
32913                           // This is done to make them easier to linkify and translate.
32914                           switch (whichType) {
32915                               case '170':
32916                                   props.description = 'This feature has a FIXME tag: ' + props.description;
32917                                   break;
32918                               case '292':
32919                               case '293':
32920                                   props.description = props.description.replace('A turn-', 'This turn-');
32921                                   break;
32922                               case '294':
32923                               case '295':
32924                               case '296':
32925                               case '297':
32926                               case '298':
32927                                   props.description = 'This turn-restriction~' + props.description;
32928                                   break;
32929                               case '300':
32930                                   props.description = 'This highway is missing a maxspeed tag';
32931                                   break;
32932                               case '411':
32933                               case '412':
32934                               case '413':
32935                                   props.description = 'This feature~' + props.description;
32936                                   break;
32937                           }
32938
32939                           // - move markers slightly so it doesn't obscure the geometry,
32940                           // - then move markers away from other coincident markers
32941                           var coincident = false;
32942                           do {
32943                               // first time, move marker up. after that, move marker right.
32944                               var delta = coincident ? [0.00001, 0] : [0, 0.00001];
32945                               loc = geoVecAdd(loc, delta);
32946                               var bbox = geoExtent(loc).bbox();
32947                               coincident = _krCache.rtree.search(bbox).length;
32948                           } while (coincident);
32949
32950                           var d = new qaError({
32951                               // Required values
32952                               loc: loc,
32953                               service: 'keepRight',
32954                               error_type: errorType,
32955                               // Extra values for this service
32956                               id: props.error_id,
32957                               comment: props.comment || null,
32958                               description: props.description || '',
32959                               error_id: props.error_id,
32960                               which_type: whichType,
32961                               parent_error_type: parentErrorType,
32962                               severity: whichTemplate.severity || 'error',
32963                               object_id: props.object_id,
32964                               object_type: props.object_type,
32965                               schema: props.schema,
32966                               title: props.title
32967                           });
32968
32969                           d.replacements = tokenReplacements(d);
32970
32971                           _krCache.data[d.id] = d;
32972                           _krCache.rtree.insert(encodeErrorRtree(d));
32973                       });
32974
32975                       dispatch$1.call('loaded');
32976                   }
32977               );
32978           });
32979       },
32980
32981
32982       postKeepRightUpdate: function(d, callback) {
32983           if (_krCache.inflightPost[d.id]) {
32984               return callback({ message: 'Error update already inflight', status: -2 }, d);
32985           }
32986
32987           var that = this;
32988           var params = { schema: d.schema, id: d.error_id };
32989
32990           if (d.state) {
32991               params.st = d.state;
32992           }
32993           if (d.newComment !== undefined) {
32994               params.co = d.newComment;
32995           }
32996
32997           // NOTE: This throws a CORS err, but it seems successful.
32998           // We don't care too much about the response, so this is fine.
32999           var url = _krUrlRoot + 'comment.php?' + utilQsString(params);
33000           _krCache.inflightPost[d.id] = request(url)
33001               .post(function(err) {
33002                   delete _krCache.inflightPost[d.id];
33003
33004                   if (d.state === 'ignore') {   // ignore permanently (false positive)
33005                       that.removeError(d);
33006
33007                   } else if (d.state === 'ignore_t') {  // ignore temporarily (error fixed)
33008                       that.removeError(d);
33009                       _krCache.closed[d.schema + ':' + d.error_id] = true;
33010
33011                   } else {
33012                       d = that.replaceError(d.update({
33013                           comment: d.newComment,
33014                           newComment: undefined,
33015                           state: undefined
33016                       }));
33017                   }
33018
33019                   return callback(err, d);
33020               });
33021
33022       },
33023
33024
33025       // get all cached errors covering the viewport
33026       getErrors: function(projection) {
33027           var viewport = projection.clipExtent();
33028           var min = [viewport[0][0], viewport[1][1]];
33029           var max = [viewport[1][0], viewport[0][1]];
33030           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
33031
33032           return _krCache.rtree.search(bbox).map(function(d) {
33033               return d.data;
33034           });
33035       },
33036
33037
33038       // get a single error from the cache
33039       getError: function(id) {
33040           return _krCache.data[id];
33041       },
33042
33043
33044       // replace a single error in the cache
33045       replaceError: function(error) {
33046           if (!(error instanceof qaError) || !error.id) return;
33047
33048           _krCache.data[error.id] = error;
33049           updateRtree(encodeErrorRtree(error), true); // true = replace
33050           return error;
33051       },
33052
33053
33054       // remove a single error from the cache
33055       removeError: function(error) {
33056           if (!(error instanceof qaError) || !error.id) return;
33057
33058           delete _krCache.data[error.id];
33059           updateRtree(encodeErrorRtree(error), false); // false = remove
33060       },
33061
33062
33063       errorURL: function(error) {
33064           return _krUrlRoot + 'report_map.php?schema=' + error.schema + '&error=' + error.id;
33065       },
33066
33067
33068       // Get an array of errors closed during this session.
33069       // Used to populate `closed:keepright` changeset tag
33070       getClosedIDs: function() {
33071           return Object.keys(_krCache.closed).sort();
33072       }
33073
33074   };
33075
33076   var tiler$1 = utilTiler();
33077   var dispatch$2 = dispatch('loaded');
33078
33079   var _erCache;
33080   var _erZoom = 14;
33081
33082   var _impOsmUrls = {
33083       ow: 'https://directionofflow.skobbler.net/directionOfFlowService',
33084       mr: 'https://missingroads.skobbler.net/missingGeoService',
33085       tr: 'https://turnrestrictionservice.skobbler.net/turnRestrictionService'
33086   };
33087
33088   function abortRequest$1(i) {
33089       forEach(i, function(v) {
33090           if (v) {
33091               v.abort();
33092           }
33093       });
33094   }
33095
33096   function abortUnwantedRequests$1(cache, tiles) {
33097       forEach(cache.inflightTile, function(v, k) {
33098           var wanted = find$1(tiles, function(tile) {
33099               return k === tile.id;
33100           });
33101           if (!wanted) {
33102               abortRequest$1(v);
33103               delete cache.inflightTile[k];
33104           }
33105       });
33106   }
33107
33108
33109   function encodeErrorRtree$1(d) {
33110       return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
33111   }
33112
33113
33114   // replace or remove error from rtree
33115   function updateRtree$1(item, replace) {
33116       _erCache.rtree.remove(item, function isEql(a, b) {
33117           return a.data.id === b.data.id;
33118       });
33119
33120       if (replace) {
33121           _erCache.rtree.insert(item);
33122       }
33123   }
33124
33125   function linkErrorObject(d) {
33126       return '<a class="error_object_link">' + d + '</a>';
33127   }
33128
33129   function linkEntity(d) {
33130       return '<a class="error_entity_link">' + d + '</a>';
33131   }
33132
33133   function pointAverage(points) {
33134       var x = 0;
33135       var y = 0;
33136
33137       forEach(points, function(v) {
33138           x += v.lon;
33139           y += v.lat;
33140       });
33141
33142       x /= points.length;
33143       y /= points.length;
33144
33145       return [x, y];
33146   }
33147
33148   function relativeBearing(p1, p2) {
33149       var angle = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat);
33150       if (angle < 0) {
33151           angle += 2 * Math.PI;
33152       }
33153
33154       // Return degrees
33155       return angle * 180 / Math.PI;
33156   }
33157
33158   // Assuming range [0,360)
33159   function cardinalDirection(bearing) {
33160       var dir = 45 * Math.round(bearing / 45);
33161       var compass = {
33162           0: 'north',
33163           45: 'northeast',
33164           90: 'east',
33165           135: 'southeast',
33166           180: 'south',
33167           225: 'southwest',
33168           270: 'west',
33169           315: 'northwest',
33170           360: 'north'
33171       };
33172
33173       return t('QA.improveOSM.directions.' + compass[dir]);
33174   }
33175
33176   // Errors shouldn't obscure eachother
33177   function preventCoincident(loc, bumpUp) {
33178       var coincident = false;
33179       do {
33180           // first time, move marker up. after that, move marker right.
33181           var delta = coincident ? [0.00001, 0] : (bumpUp ? [0, 0.00001] : [0, 0]);
33182           loc = geoVecAdd(loc, delta);
33183           var bbox = geoExtent(loc).bbox();
33184           coincident = _erCache.rtree.search(bbox).length;
33185       } while (coincident);
33186
33187       return loc;
33188   }
33189
33190   var serviceImproveOSM = {
33191       init: function() {
33192           if (!_erCache) {
33193               this.reset();
33194           }
33195
33196           this.event = utilRebind(this, dispatch$2, 'on');
33197       },
33198
33199       reset: function() {
33200           if (_erCache) {
33201               forEach(_erCache.inflightTile, abortRequest$1);
33202           }
33203           _erCache = {
33204               data: {},
33205               loadedTile: {},
33206               inflightTile: {},
33207               inflightPost: {},
33208               closed: {},
33209               rtree: rbush_1()
33210           };
33211       },
33212
33213       loadErrors: function(projection) {
33214           var options = {
33215               client: 'iD',
33216               status: 'OPEN',
33217               zoom: '19' // Use a high zoom so that clusters aren't returned
33218           };
33219
33220           // determine the needed tiles to cover the view
33221           var tiles = tiler$1
33222               .zoomExtent([_erZoom, _erZoom])
33223               .getTiles(projection);
33224
33225           // abort inflight requests that are no longer needed
33226           abortUnwantedRequests$1(_erCache, tiles);
33227
33228           // issue new requests..
33229           tiles.forEach(function(tile) {
33230               if (_erCache.loadedTile[tile.id] || _erCache.inflightTile[tile.id]) return;
33231
33232               var rect = tile.extent.rectangle();
33233               var params = assignIn({}, options, { east: rect[0], south: rect[3], west: rect[2], north: rect[1] });
33234
33235               // 3 separate requests to store for each tile
33236               var requests = {};
33237
33238               forEach(_impOsmUrls, function(v, k) {
33239                   // We exclude WATER from missing geometry as it doesn't seem useful
33240                   // We use most confident one-way and turn restrictions only, still have false positives
33241                   var kParams = assignIn({}, params, (k === 'mr') ? { type: 'PARKING,ROAD,BOTH,PATH' } : { confidenceLevel: 'C1' });
33242                   var url = v + '/search?' + utilQsString(kParams);
33243
33244                   requests[k] = d3_json(url,
33245                       function(err, data) {
33246                           delete _erCache.inflightTile[tile.id];
33247
33248                           if (err) return;
33249                           _erCache.loadedTile[tile.id] = true;
33250
33251                           // Road segments at high zoom == oneways
33252                           if (data.roadSegments) {
33253                               data.roadSegments.forEach(function(feature) {
33254                                   // Position error at the approximate middle of the segment
33255                                   var points = feature.points;
33256                                   var mid = points.length / 2;
33257                                   var loc;
33258
33259                                   // Even number of points, find midpoint of the middle two
33260                                   // Odd number of points, use position of very middle point
33261                                   if (mid % 1 === 0) {
33262                                       loc = pointAverage([points[mid - 1], points[mid]]);
33263                                   } else {
33264                                       mid = points[Math.floor(mid)];
33265                                       loc = [mid.lon, mid.lat];
33266                                   }
33267
33268                                   // One-ways can land on same segment in opposite direction
33269                                   loc = preventCoincident(loc, false);
33270
33271                                   var d = new qaError({
33272                                       // Info required for every error
33273                                       loc: loc,
33274                                       service: 'improveOSM',
33275                                       error_type: k,
33276                                       // Extra details needed for this service
33277                                       error_key: k,
33278                                       identifier: { // this is used to post changes to the error
33279                                           wayId: feature.wayId,
33280                                           fromNodeId: feature.fromNodeId,
33281                                           toNodeId: feature.toNodeId
33282                                       },
33283                                       object_id: feature.wayId,
33284                                       object_type: 'way',
33285                                       status: feature.status
33286                                   });
33287
33288                                   // Variables used in the description
33289                                   d.replacements = {
33290                                       percentage: feature.percentOfTrips,
33291                                       num_trips: feature.numberOfTrips,
33292                                       highway: linkErrorObject(t('QA.keepRight.error_parts.highway')),
33293                                       from_node: linkEntity('n' + feature.fromNodeId),
33294                                       to_node: linkEntity('n' + feature.toNodeId)
33295                                   };
33296
33297                                   _erCache.data[d.id] = d;
33298                                   _erCache.rtree.insert(encodeErrorRtree$1(d));
33299                               });
33300                           }
33301
33302                           // Tiles at high zoom == missing roads
33303                           if (data.tiles) {
33304                               data.tiles.forEach(function(feature) {
33305                                   var geoType = feature.type.toLowerCase();
33306
33307                                   // Average of recorded points should land on the missing geometry
33308                                   // Missing geometry could happen to land on another error
33309                                   var loc = pointAverage(feature.points);
33310                                   loc = preventCoincident(loc, false);
33311
33312                                   var d = new qaError({
33313                                       // Info required for every error
33314                                       loc: loc,
33315                                       service: 'improveOSM',
33316                                       error_type: k + '-' + geoType,
33317                                       // Extra details needed for this service
33318                                       error_key: k,
33319                                       identifier: { x: feature.x, y: feature.y },
33320                                       status: feature.status
33321                                   });
33322
33323                                   d.replacements = {
33324                                       num_trips: feature.numberOfTrips,
33325                                       geometry_type: t('QA.improveOSM.geometry_types.' + geoType)
33326                                   };
33327
33328                                   // -1 trips indicates data came from a 3rd party
33329                                   if (feature.numberOfTrips === -1) {
33330                                       d.desc = t('QA.improveOSM.error_types.mr.description_alt', d.replacements);
33331                                   }
33332
33333                                   _erCache.data[d.id] = d;
33334                                   _erCache.rtree.insert(encodeErrorRtree$1(d));
33335                               });
33336                           }
33337
33338                           // Entities at high zoom == turn restrictions
33339                           if (data.entities) {
33340                               data.entities.forEach(function(feature) {
33341                                   // Turn restrictions could be missing at same junction
33342                                   // We also want to bump the error up so node is accessible
33343                                   var loc = feature.point;
33344                                   loc = preventCoincident([loc.lon, loc.lat], true);
33345
33346                                   // Elements are presented in a strange way
33347                                   var ids = feature.id.split(',');
33348                                   var from_way = ids[0];
33349                                   var via_node = ids[3];
33350                                   var to_way = ids[2].split(':')[1];
33351
33352                                   var d = new qaError({
33353                                       // Info required for every error
33354                                       loc: loc,
33355                                       service: 'improveOSM',
33356                                       error_type: k,
33357                                       // Extra details needed for this service
33358                                       error_key: k,
33359                                       identifier: feature.id,
33360                                       object_id: via_node,
33361                                       object_type: 'node',
33362                                       status: feature.status
33363                                   });
33364
33365                                   // Travel direction along from_way clarifies the turn restriction
33366                                   var p1 = feature.segments[0].points[0];
33367                                   var p2 = feature.segments[0].points[1];
33368
33369                                   var dir_of_travel = cardinalDirection(relativeBearing(p1, p2));
33370
33371                                   // Variables used in the description
33372                                   d.replacements = {
33373                                       num_passed: feature.numberOfPasses,
33374                                       num_trips: feature.segments[0].numberOfTrips,
33375                                       turn_restriction: feature.turnType.toLowerCase(),
33376                                       from_way: linkEntity('w' + from_way),
33377                                       to_way: linkEntity('w' + to_way),
33378                                       travel_direction: dir_of_travel,
33379                                       junction: linkErrorObject(t('QA.keepRight.error_parts.this_node'))
33380                                   };
33381
33382                                   _erCache.data[d.id] = d;
33383                                   _erCache.rtree.insert(encodeErrorRtree$1(d));
33384                               });
33385                           }
33386                       }
33387                   );
33388               });
33389
33390               _erCache.inflightTile[tile.id] = requests;
33391               dispatch$2.call('loaded');
33392           });
33393       },
33394
33395       getComments: function(d, callback) {
33396           // If comments already retrieved no need to do so again
33397           if (d.comments !== undefined) { return callback({}, d); }
33398
33399           var key = d.error_key;
33400           var qParams = {};
33401
33402           if (key === 'ow') {
33403               qParams = d.identifier;
33404           } else if (key === 'mr') {
33405               qParams.tileX = d.identifier.x;
33406               qParams.tileY = d.identifier.y;
33407           } else if (key === 'tr') {
33408               qParams.targetId = d.identifier;
33409           }
33410
33411           var url = _impOsmUrls[key] + '/retrieveComments?' + utilQsString(qParams);
33412
33413           var that = this;
33414           d3_json(url, function(err, data) {
33415               // comments are served newest to oldest
33416               var comments = data.comments ? data.comments.reverse() : [];
33417
33418               that.replaceError(d.update({
33419                   comments: comments
33420               }));
33421               return callback(err, d);
33422           });
33423       },
33424
33425       postUpdate: function(d, callback) {
33426           if (!services.osm.authenticated()) { // Username required in payload
33427               return callback({ message: 'Not Authenticated', status: -3}, d);
33428           }
33429           if (_erCache.inflightPost[d.id]) {
33430               return callback({ message: 'Error update already inflight', status: -2 }, d);
33431           }
33432
33433           var that = this;
33434
33435           // Payload can only be sent once username is established
33436           services.osm.userDetails(sendPayload);
33437
33438           function sendPayload(err, user) {
33439               if (err) { return callback(err, d); }
33440
33441               var key = d.error_key;
33442               var url = _impOsmUrls[key] + '/comment';
33443               var payload = {
33444                   username: user.display_name
33445               };
33446
33447               // Each error type has different data for identification
33448               if (key === 'ow') {
33449                   payload.roadSegments = [ d.identifier ];
33450               } else if (key === 'mr') {
33451                   payload.tiles = [ d.identifier ];
33452               } else if (key === 'tr') {
33453                   payload.targetIds = [ d.identifier ];
33454               }
33455
33456               if (d.newStatus !== undefined) {
33457                   payload.status = d.newStatus;
33458                   payload.text = 'status changed';
33459               }
33460
33461               // Comment take place of default text
33462               if (d.newComment !== undefined) {
33463                   payload.text = d.newComment;
33464               }
33465
33466               _erCache.inflightPost[d.id] = request(url)
33467                   .header('Content-Type', 'application/json')
33468                   .post(JSON.stringify(payload), function(err) {
33469                       delete _erCache.inflightPost[d.id];
33470
33471                       // Unsuccessful response status, keep issue open
33472                       if (err.status !== 200) { return callback(err, d); }
33473
33474                       // Just a comment, update error in cache
33475                       if (d.newStatus === undefined) {
33476                           var now = new Date();
33477                           var comments = d.comments ? d.comments : [];
33478
33479                           comments.push({
33480                               username: payload.username,
33481                               text: payload.text,
33482                               timestamp: now.getTime() / 1000
33483                           });
33484
33485                           that.replaceError(d.update({
33486                               comments: comments,
33487                               newComment: undefined
33488                           }));
33489                       } else {
33490                           that.removeError(d);
33491
33492                           if (d.newStatus === 'SOLVED') {
33493                               // No pretty identifier, so we just use coordinates
33494                               var closedID = d.loc[1].toFixed(5) + '/' + d.loc[0].toFixed(5);
33495                               _erCache.closed[key + ':' + closedID] = true;
33496                           }
33497                       }
33498
33499                       return callback(err, d);
33500                   });
33501           }
33502       },
33503
33504       // get all cached errors covering the viewport
33505       getErrors: function(projection) {
33506           var viewport = projection.clipExtent();
33507           var min = [viewport[0][0], viewport[1][1]];
33508           var max = [viewport[1][0], viewport[0][1]];
33509           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
33510
33511           return _erCache.rtree.search(bbox).map(function(d) {
33512               return d.data;
33513           });
33514       },
33515
33516       // get a single error from the cache
33517       getError: function(id) {
33518           return _erCache.data[id];
33519       },
33520
33521       // replace a single error in the cache
33522       replaceError: function(error) {
33523           if (!(error instanceof qaError) || !error.id) return;
33524
33525           _erCache.data[error.id] = error;
33526           updateRtree$1(encodeErrorRtree$1(error), true); // true = replace
33527           return error;
33528       },
33529
33530       // remove a single error from the cache
33531       removeError: function(error) {
33532           if (!(error instanceof qaError) || !error.id) return;
33533
33534           delete _erCache.data[error.id];
33535           updateRtree$1(encodeErrorRtree$1(error), false); // false = remove
33536       },
33537
33538       // Used to populate `closed:improveosm` changeset tag
33539       getClosedIDs: function() {
33540           return Object.keys(_erCache.closed).sort();
33541       }
33542   };
33543
33544   function svgAreas(projection, context) {
33545       // Patterns only work in Firefox when set directly on element.
33546       // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
33547       var patterns = {
33548           // tag - pattern name
33549           // -or-
33550           // tag - value - pattern name
33551           // -or-
33552           // tag - value - rules (optional tag-values, pattern name)
33553           // (matches earlier rules first, so fallback should be last entry)
33554           amenity: {
33555               grave_yard: 'cemetery',
33556               fountain: 'water_standing'
33557           },
33558           landuse: {
33559               cemetery: [
33560                   { religion: 'christian', pattern: 'cemetery_christian' },
33561                   { religion: 'buddhist', pattern: 'cemetery_buddhist' },
33562                   { religion: 'muslim', pattern: 'cemetery_muslim' },
33563                   { religion: 'jewish', pattern: 'cemetery_jewish' },
33564                   { pattern: 'cemetery' }
33565               ],
33566               construction: 'construction',
33567               farmland: 'farmland',
33568               farmyard: 'farmyard',
33569               forest: [
33570                   { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
33571                   { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
33572                   { leaf_type: 'leafless', pattern: 'forest_leafless' },
33573                   { pattern: 'forest' } // same as 'leaf_type:mixed'
33574               ],
33575               grave_yard: 'cemetery',
33576               grass: 'grass',
33577               landfill: 'landfill',
33578               meadow: 'meadow',
33579               military: 'construction',
33580               orchard: 'orchard',
33581               reservoir: 'water_standing',
33582               quarry: 'quarry',
33583               vineyard: 'vineyard'
33584           },
33585           natural: {
33586               beach: 'beach',
33587               grassland: 'grass',
33588               sand: 'beach',
33589               scrub: 'scrub',
33590               water: [
33591                   { water: 'pond', pattern: 'pond' },
33592                   { water: 'reservoir', pattern: 'water_standing' },
33593                   { pattern: 'waves' }
33594               ],
33595               wetland: [
33596                   { wetland: 'marsh', pattern: 'wetland_marsh' },
33597                   { wetland: 'swamp', pattern: 'wetland_swamp' },
33598                   { wetland: 'bog', pattern: 'wetland_bog' },
33599                   { wetland: 'reedbed', pattern: 'wetland_reedbed' },
33600                   { pattern: 'wetland' }
33601               ],
33602               wood: [
33603                   { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
33604                   { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
33605                   { leaf_type: 'leafless', pattern: 'forest_leafless' },
33606                   { pattern: 'forest' } // same as 'leaf_type:mixed'
33607               ]
33608           },
33609           traffic_calming: {
33610               island: [
33611                   { surface: 'grass', pattern: 'grass' },
33612               ],
33613               chicane: [
33614                   { surface: 'grass', pattern: 'grass' },
33615               ],
33616               choker: [
33617                   { surface: 'grass', pattern: 'grass' },
33618               ]
33619           }
33620       };
33621
33622       function setPattern(entity) {
33623           // Skip pattern filling if this is a building (buildings don't get patterns applied)
33624           if (entity.tags.building && entity.tags.building !== 'no') {
33625               this.style.fill = this.style.stroke = '';
33626               return;
33627           }
33628
33629           for (var tag in patterns) {
33630               var entityValue = entity.tags[tag];
33631               if (!entityValue) continue;
33632
33633               if (typeof patterns[tag] === 'string') { // extra short syntax (just tag) - pattern name
33634                   this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[tag] + '")';
33635                   return;
33636               } else {
33637                   var values = patterns[tag];
33638                   for (var value in values) {
33639                       if (entityValue !== value) continue;
33640
33641                       var rules = values[value];
33642                       if (typeof rules === 'string') { // short syntax - pattern name
33643                           this.style.fill = this.style.stroke = 'url("#pattern-' + rules + '")';
33644                           return;
33645                       } else { // long syntax - rule array
33646                           for (var ruleKey in rules) {
33647                               var rule = rules[ruleKey];
33648
33649                               var pass = true;
33650                               for (var criterion in rule) {
33651                                   if (criterion !== 'pattern') { // reserved for pattern name
33652                                       // The only rule is a required tag-value pair
33653                                       var v = entity.tags[criterion];
33654                                       if (!v || v !== rule[criterion]) {
33655                                           pass = false;
33656                                           break;
33657                                       }
33658                                   }
33659                               }
33660
33661                               if (pass) {
33662                                   this.style.fill = this.style.stroke = 'url("#pattern-' + rule.pattern + '")';
33663                                   return;
33664                               }
33665                           }
33666                       }
33667                   }
33668               }
33669           }
33670
33671           this.style.fill = this.style.stroke = '';
33672       }
33673
33674
33675       function drawTargets(selection, graph, entities, filter) {
33676           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
33677           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
33678           var getPath = svgPath(projection).geojson;
33679           var activeID = context.activeID();
33680
33681           // The targets and nopes will be MultiLineString sub-segments of the ways
33682           var data = { targets: [], nopes: [] };
33683
33684           entities.forEach(function(way) {
33685               var features = svgSegmentWay(way, graph, activeID);
33686               data.targets.push.apply(data.targets, features.passive);
33687               data.nopes.push.apply(data.nopes, features.active);
33688           });
33689
33690
33691           // Targets allow hover and vertex snapping
33692           var targetData = data.targets.filter(getPath);
33693           var targets = selection.selectAll('.area.target-allowed')
33694               .filter(function(d) { return filter(d.properties.entity); })
33695               .data(targetData, function key(d) { return d.id; });
33696
33697           // exit
33698           targets.exit()
33699               .remove();
33700
33701           // enter/update
33702           targets.enter()
33703               .append('path')
33704               .merge(targets)
33705               .attr('d', getPath)
33706               .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
33707
33708
33709           // NOPE
33710           var nopeData = data.nopes.filter(getPath);
33711           var nopes = selection.selectAll('.area.target-nope')
33712               .filter(function(d) { return filter(d.properties.entity); })
33713               .data(nopeData, function key(d) { return d.id; });
33714
33715           // exit
33716           nopes.exit()
33717               .remove();
33718
33719           // enter/update
33720           nopes.enter()
33721               .append('path')
33722               .merge(nopes)
33723               .attr('d', getPath)
33724               .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
33725       }
33726
33727
33728       function drawAreas(selection, graph, entities, filter) {
33729           var path = svgPath(projection, graph, true);
33730           var areas = {};
33731           var multipolygon;
33732
33733           for (var i = 0; i < entities.length; i++) {
33734               var entity = entities[i];
33735               if (entity.geometry(graph) !== 'area') continue;
33736
33737               multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
33738               if (multipolygon) {
33739                   areas[multipolygon.id] = {
33740                       entity: multipolygon.mergeTags(entity.tags),
33741                       area: Math.abs(entity.area(graph))
33742                   };
33743               } else if (!areas[entity.id]) {
33744                   areas[entity.id] = {
33745                       entity: entity,
33746                       area: Math.abs(entity.area(graph))
33747                   };
33748               }
33749           }
33750
33751           areas = values$1(areas).filter(function hasPath(a) { return path(a.entity); });
33752           areas.sort(function areaSort(a, b) { return b.area - a.area; });
33753           areas = map$3(areas, 'entity');
33754
33755           var strokes = areas.filter(function(area) {
33756               return area.type === 'way';
33757           });
33758
33759           var data = {
33760               clip: areas,
33761               shadow: strokes,
33762               stroke: strokes,
33763               fill: areas
33764           };
33765
33766           var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath-osm')
33767              .filter(filter)
33768              .data(data.clip, osmEntity.key);
33769
33770           clipPaths.exit()
33771              .remove();
33772
33773           var clipPathsEnter = clipPaths.enter()
33774              .append('clipPath')
33775              .attr('class', 'clipPath-osm')
33776              .attr('id', function(entity) { return entity.id + '-clippath'; });
33777
33778           clipPathsEnter
33779              .append('path');
33780
33781           clipPaths.merge(clipPathsEnter)
33782              .selectAll('path')
33783              .attr('d', path);
33784
33785
33786           var drawLayer = selection.selectAll('.layer-osm.areas');
33787           var touchLayer = selection.selectAll('.layer-touch.areas');
33788
33789           // Draw areas..
33790           var areagroup = drawLayer
33791               .selectAll('g.areagroup')
33792               .data(['fill', 'shadow', 'stroke']);
33793
33794           areagroup = areagroup.enter()
33795               .append('g')
33796               .attr('class', function(d) { return 'areagroup area-' + d; })
33797               .merge(areagroup);
33798
33799           var paths = areagroup
33800               .selectAll('path')
33801               .filter(filter)
33802               .data(function(layer) { return data[layer]; }, osmEntity.key);
33803
33804           paths.exit()
33805               .remove();
33806
33807           var fills = selection.selectAll('.area-fill path.area').nodes();
33808
33809           var bisect = bisector(function(node) {
33810               return -node.__data__.area(graph);
33811           }).left;
33812
33813           function sortedByArea(entity) {
33814               if (this._parent.__data__ === 'fill') {
33815                   return fills[bisect(fills, -entity.area(graph))];
33816               }
33817           }
33818
33819           paths = paths.enter()
33820               .insert('path', sortedByArea)
33821               .merge(paths)
33822               .each(function(entity) {
33823                   var layer = this.parentNode.__data__;
33824                   this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
33825
33826                   if (layer === 'fill') {
33827                       this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
33828                       setPattern.call(this, entity);
33829                   }
33830               })
33831               .call(svgTagClasses())
33832               .attr('d', path);
33833
33834
33835           // Draw touch targets..
33836           touchLayer
33837               .call(drawTargets, graph, data.stroke, filter);
33838       }
33839
33840       return drawAreas;
33841   }
33842
33843   /**
33844    * A specialized version of `_.reduce` for arrays without support for
33845    * iteratee shorthands.
33846    *
33847    * @private
33848    * @param {Array} [array] The array to iterate over.
33849    * @param {Function} iteratee The function invoked per iteration.
33850    * @param {*} [accumulator] The initial value.
33851    * @param {boolean} [initAccum] Specify using the first element of `array` as
33852    *  the initial value.
33853    * @returns {*} Returns the accumulated value.
33854    */
33855   function arrayReduce(array, iteratee, accumulator, initAccum) {
33856     var index = -1,
33857         length = array == null ? 0 : array.length;
33858
33859     if (initAccum && length) {
33860       accumulator = array[++index];
33861     }
33862     while (++index < length) {
33863       accumulator = iteratee(accumulator, array[index], index, array);
33864     }
33865     return accumulator;
33866   }
33867
33868   /**
33869    * The base implementation of `_.reduce` and `_.reduceRight`, without support
33870    * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
33871    *
33872    * @private
33873    * @param {Array|Object} collection The collection to iterate over.
33874    * @param {Function} iteratee The function invoked per iteration.
33875    * @param {*} accumulator The initial value.
33876    * @param {boolean} initAccum Specify using the first or last element of
33877    *  `collection` as the initial value.
33878    * @param {Function} eachFunc The function to iterate over `collection`.
33879    * @returns {*} Returns the accumulated value.
33880    */
33881   function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
33882     eachFunc(collection, function(value, index, collection) {
33883       accumulator = initAccum
33884         ? (initAccum = false, value)
33885         : iteratee(accumulator, value, index, collection);
33886     });
33887     return accumulator;
33888   }
33889
33890   /**
33891    * Reduces `collection` to a value which is the accumulated result of running
33892    * each element in `collection` thru `iteratee`, where each successive
33893    * invocation is supplied the return value of the previous. If `accumulator`
33894    * is not given, the first element of `collection` is used as the initial
33895    * value. The iteratee is invoked with four arguments:
33896    * (accumulator, value, index|key, collection).
33897    *
33898    * Many lodash methods are guarded to work as iteratees for methods like
33899    * `_.reduce`, `_.reduceRight`, and `_.transform`.
33900    *
33901    * The guarded methods are:
33902    * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
33903    * and `sortBy`
33904    *
33905    * @static
33906    * @memberOf _
33907    * @since 0.1.0
33908    * @category Collection
33909    * @param {Array|Object} collection The collection to iterate over.
33910    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
33911    * @param {*} [accumulator] The initial value.
33912    * @returns {*} Returns the accumulated value.
33913    * @see _.reduceRight
33914    * @example
33915    *
33916    * _.reduce([1, 2], function(sum, n) {
33917    *   return sum + n;
33918    * }, 0);
33919    * // => 3
33920    *
33921    * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
33922    *   (result[value] || (result[value] = [])).push(key);
33923    *   return result;
33924    * }, {});
33925    * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
33926    */
33927   function reduce(collection, iteratee, accumulator) {
33928     var func = isArray(collection) ? arrayReduce : baseReduce,
33929         initAccum = arguments.length < 3;
33930
33931     return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
33932   }
33933
33934   /** Error message constants. */
33935   var FUNC_ERROR_TEXT$3 = 'Expected a function';
33936
33937   /**
33938    * Creates a throttled function that only invokes `func` at most once per
33939    * every `wait` milliseconds. The throttled function comes with a `cancel`
33940    * method to cancel delayed `func` invocations and a `flush` method to
33941    * immediately invoke them. Provide `options` to indicate whether `func`
33942    * should be invoked on the leading and/or trailing edge of the `wait`
33943    * timeout. The `func` is invoked with the last arguments provided to the
33944    * throttled function. Subsequent calls to the throttled function return the
33945    * result of the last `func` invocation.
33946    *
33947    * **Note:** If `leading` and `trailing` options are `true`, `func` is
33948    * invoked on the trailing edge of the timeout only if the throttled function
33949    * is invoked more than once during the `wait` timeout.
33950    *
33951    * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
33952    * until to the next tick, similar to `setTimeout` with a timeout of `0`.
33953    *
33954    * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
33955    * for details over the differences between `_.throttle` and `_.debounce`.
33956    *
33957    * @static
33958    * @memberOf _
33959    * @since 0.1.0
33960    * @category Function
33961    * @param {Function} func The function to throttle.
33962    * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
33963    * @param {Object} [options={}] The options object.
33964    * @param {boolean} [options.leading=true]
33965    *  Specify invoking on the leading edge of the timeout.
33966    * @param {boolean} [options.trailing=true]
33967    *  Specify invoking on the trailing edge of the timeout.
33968    * @returns {Function} Returns the new throttled function.
33969    * @example
33970    *
33971    * // Avoid excessively updating the position while scrolling.
33972    * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
33973    *
33974    * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
33975    * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
33976    * jQuery(element).on('click', throttled);
33977    *
33978    * // Cancel the trailing throttled invocation.
33979    * jQuery(window).on('popstate', throttled.cancel);
33980    */
33981   function throttle(func, wait, options) {
33982     var leading = true,
33983         trailing = true;
33984
33985     if (typeof func != 'function') {
33986       throw new TypeError(FUNC_ERROR_TEXT$3);
33987     }
33988     if (isObject(options)) {
33989       leading = 'leading' in options ? !!options.leading : leading;
33990       trailing = 'trailing' in options ? !!options.trailing : trailing;
33991     }
33992     return debounce(func, wait, {
33993       'leading': leading,
33994       'maxWait': wait,
33995       'trailing': trailing
33996     });
33997   }
33998
33999   var fastJsonStableStringify = function (data, opts) {
34000       if (!opts) opts = {};
34001       if (typeof opts === 'function') opts = { cmp: opts };
34002       var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;
34003
34004       var cmp = opts.cmp && (function (f) {
34005           return function (node) {
34006               return function (a, b) {
34007                   var aobj = { key: a, value: node[a] };
34008                   var bobj = { key: b, value: node[b] };
34009                   return f(aobj, bobj);
34010               };
34011           };
34012       })(opts.cmp);
34013
34014       var seen = [];
34015       return (function stringify (node) {
34016           if (node && node.toJSON && typeof node.toJSON === 'function') {
34017               node = node.toJSON();
34018           }
34019
34020           if (node === undefined) return;
34021           if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
34022           if (typeof node !== 'object') return JSON.stringify(node);
34023
34024           var i, out;
34025           if (Array.isArray(node)) {
34026               out = '[';
34027               for (i = 0; i < node.length; i++) {
34028                   if (i) out += ',';
34029                   out += stringify(node[i]) || 'null';
34030               }
34031               return out + ']';
34032           }
34033
34034           if (node === null) return 'null';
34035
34036           if (seen.indexOf(node) !== -1) {
34037               if (cycles) return JSON.stringify('__cycle__');
34038               throw new TypeError('Converting circular structure to JSON');
34039           }
34040
34041           var seenIndex = seen.push(node) - 1;
34042           var keys = Object.keys(node).sort(cmp && cmp(node));
34043           out = '';
34044           for (i = 0; i < keys.length; i++) {
34045               var key = keys[i];
34046               var value = stringify(node[key]);
34047
34048               if (!value) continue;
34049               if (out) out += ',';
34050               out += JSON.stringify(key) + ':' + value;
34051           }
34052           seen.splice(seenIndex, 1);
34053           return '{' + out + '}';
34054       })(data);
34055   };
34056
34057   //[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]
34058   //[4a]        NameChar           ::=          NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
34059   //[5]         Name       ::=          NameStartChar (NameChar)*
34060   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
34061   var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
34062   var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
34063   //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
34064   //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(',')
34065
34066   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
34067   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
34068   var S_TAG = 0;//tag name offerring
34069   var S_ATTR = 1;//attr name offerring 
34070   var S_ATTR_SPACE=2;//attr name end and space offer
34071   var S_EQ = 3;//=space?
34072   var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
34073   var S_ATTR_END = 5;//attr value end and no space(quot end)
34074   var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
34075   var S_TAG_CLOSE = 7;//closed el<el />
34076
34077   function XMLReader(){
34078         
34079   }
34080
34081   XMLReader.prototype = {
34082         parse:function(source,defaultNSMap,entityMap){
34083                 var domBuilder = this.domBuilder;
34084                 domBuilder.startDocument();
34085                 _copy(defaultNSMap ,defaultNSMap = {});
34086                 parse(source,defaultNSMap,entityMap,
34087                                 domBuilder,this.errorHandler);
34088                 domBuilder.endDocument();
34089         }
34090   };
34091   function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
34092         function fixedFromCharCode(code) {
34093                 // String.prototype.fromCharCode does not supports
34094                 // > 2 bytes unicode chars directly
34095                 if (code > 0xffff) {
34096                         code -= 0x10000;
34097                         var surrogate1 = 0xd800 + (code >> 10)
34098                                 , surrogate2 = 0xdc00 + (code & 0x3ff);
34099
34100                         return String.fromCharCode(surrogate1, surrogate2);
34101                 } else {
34102                         return String.fromCharCode(code);
34103                 }
34104         }
34105         function entityReplacer(a){
34106                 var k = a.slice(1,-1);
34107                 if(k in entityMap){
34108                         return entityMap[k]; 
34109                 }else if(k.charAt(0) === '#'){
34110                         return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
34111                 }else{
34112                         errorHandler.error('entity not found:'+a);
34113                         return a;
34114                 }
34115         }
34116         function appendText(end){//has some bugs
34117                 if(end>start){
34118                         var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
34119                         locator&&position(start);
34120                         domBuilder.characters(xt,0,end-start);
34121                         start = end;
34122                 }
34123         }
34124         function position(p,m){
34125                 while(p>=lineEnd && (m = linePattern.exec(source))){
34126                         lineStart = m.index;
34127                         lineEnd = lineStart + m[0].length;
34128                         locator.lineNumber++;
34129                         //console.log('line++:',locator,startPos,endPos)
34130                 }
34131                 locator.columnNumber = p-lineStart+1;
34132         }
34133         var lineStart = 0;
34134         var lineEnd = 0;
34135         var linePattern = /.*(?:\r\n?|\n)|.*$/g;
34136         var locator = domBuilder.locator;
34137         
34138         var parseStack = [{currentNSMap:defaultNSMapCopy}];
34139         var closeMap = {};
34140         var start = 0;
34141         while(true){
34142                 try{
34143                         var tagStart = source.indexOf('<',start);
34144                         if(tagStart<0){
34145                                 if(!source.substr(start).match(/^\s*$/)){
34146                                         var doc = domBuilder.doc;
34147                                 var text = doc.createTextNode(source.substr(start));
34148                                 doc.appendChild(text);
34149                                 domBuilder.currentElement = text;
34150                                 }
34151                                 return;
34152                         }
34153                         if(tagStart>start){
34154                                 appendText(tagStart);
34155                         }
34156                         switch(source.charAt(tagStart+1)){
34157                         case '/':
34158                                 var end = source.indexOf('>',tagStart+3);
34159                                 var tagName = source.substring(tagStart+2,end);
34160                                 var config = parseStack.pop();
34161                                 if(end<0){
34162                                         
34163                                 tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
34164                                 //console.error('#@@@@@@'+tagName)
34165                                 errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
34166                                 end = tagStart+1+tagName.length;
34167                         }else if(tagName.match(/\s</)){
34168                                 tagName = tagName.replace(/[\s<].*/,'');
34169                                 errorHandler.error("end tag name: "+tagName+' maybe not complete');
34170                                 end = tagStart+1+tagName.length;
34171                                 }
34172                                 //console.error(parseStack.length,parseStack)
34173                                 //console.error(config);
34174                                 var localNSMap = config.localNSMap;
34175                                 var endMatch = config.tagName == tagName;
34176                                 var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
34177                         if(endIgnoreCaseMach){
34178                                 domBuilder.endElement(config.uri,config.localName,tagName);
34179                                         if(localNSMap){
34180                                                 for(var prefix in localNSMap){
34181                                                         domBuilder.endPrefixMapping(prefix) ;
34182                                                 }
34183                                         }
34184                                         if(!endMatch){
34185                                 errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
34186                                         }
34187                         }else{
34188                                 parseStack.push(config);
34189                         }
34190                                 
34191                                 end++;
34192                                 break;
34193                                 // end elment
34194                         case '?':// <?...?>
34195                                 locator&&position(tagStart);
34196                                 end = parseInstruction(source,tagStart,domBuilder);
34197                                 break;
34198                         case '!':// <!doctype,<![CDATA,<!--
34199                                 locator&&position(tagStart);
34200                                 end = parseDCC(source,tagStart,domBuilder,errorHandler);
34201                                 break;
34202                         default:
34203                                 locator&&position(tagStart);
34204                                 var el = new ElementAttributes();
34205                                 var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
34206                                 //elStartEnd
34207                                 var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
34208                                 var len = el.length;
34209                                 
34210                                 
34211                                 if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
34212                                         el.closed = true;
34213                                         if(!entityMap.nbsp){
34214                                                 errorHandler.warning('unclosed xml attribute');
34215                                         }
34216                                 }
34217                                 if(locator && len){
34218                                         var locator2 = copyLocator(locator,{});
34219                                         //try{//attribute position fixed
34220                                         for(var i = 0;i<len;i++){
34221                                                 var a = el[i];
34222                                                 position(a.offset);
34223                                                 a.locator = copyLocator(locator,{});
34224                                         }
34225                                         //}catch(e){console.error('@@@@@'+e)}
34226                                         domBuilder.locator = locator2;
34227                                         if(appendElement(el,domBuilder,currentNSMap)){
34228                                                 parseStack.push(el);
34229                                         }
34230                                         domBuilder.locator = locator;
34231                                 }else{
34232                                         if(appendElement(el,domBuilder,currentNSMap)){
34233                                                 parseStack.push(el);
34234                                         }
34235                                 }
34236                                 
34237                                 
34238                                 
34239                                 if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
34240                                         end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
34241                                 }else{
34242                                         end++;
34243                                 }
34244                         }
34245                 }catch(e){
34246                         errorHandler.error('element parse error: '+e);
34247                         //errorHandler.error('element parse error: '+e);
34248                         end = -1;
34249                         //throw e;
34250                 }
34251                 if(end>start){
34252                         start = end;
34253                 }else{
34254                         //TODO: 这里有可能sax回退,有位置错误风险
34255                         appendText(Math.max(tagStart,start)+1);
34256                 }
34257         }
34258   }
34259   function copyLocator(f,t){
34260         t.lineNumber = f.lineNumber;
34261         t.columnNumber = f.columnNumber;
34262         return t;
34263   }
34264
34265   /**
34266    * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
34267    * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
34268    */
34269   function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
34270         var attrName;
34271         var value;
34272         var p = ++start;
34273         var s = S_TAG;//status
34274         while(true){
34275                 var c = source.charAt(p);
34276                 switch(c){
34277                 case '=':
34278                         if(s === S_ATTR){//attrName
34279                                 attrName = source.slice(start,p);
34280                                 s = S_EQ;
34281                         }else if(s === S_ATTR_SPACE){
34282                                 s = S_EQ;
34283                         }else{
34284                                 //fatalError: equal must after attrName or space after attrName
34285                                 throw new Error('attribute equal must after attrName');
34286                         }
34287                         break;
34288                 case '\'':
34289                 case '"':
34290                         if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
34291                                 ){//equal
34292                                 if(s === S_ATTR){
34293                                         errorHandler.warning('attribute value must after "="');
34294                                         attrName = source.slice(start,p);
34295                                 }
34296                                 start = p+1;
34297                                 p = source.indexOf(c,start);
34298                                 if(p>0){
34299                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
34300                                         el.add(attrName,value,start-1);
34301                                         s = S_ATTR_END;
34302                                 }else{
34303                                         //fatalError: no end quot match
34304                                         throw new Error('attribute value no end \''+c+'\' match');
34305                                 }
34306                         }else if(s == S_ATTR_NOQUOT_VALUE){
34307                                 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
34308                                 //console.log(attrName,value,start,p)
34309                                 el.add(attrName,value,start);
34310                                 //console.dir(el)
34311                                 errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
34312                                 start = p+1;
34313                                 s = S_ATTR_END;
34314                         }else{
34315                                 //fatalError: no equal before
34316                                 throw new Error('attribute value must after "="');
34317                         }
34318                         break;
34319                 case '/':
34320                         switch(s){
34321                         case S_TAG:
34322                                 el.setTagName(source.slice(start,p));
34323                         case S_ATTR_END:
34324                         case S_TAG_SPACE:
34325                         case S_TAG_CLOSE:
34326                                 s =S_TAG_CLOSE;
34327                                 el.closed = true;
34328                         case S_ATTR_NOQUOT_VALUE:
34329                         case S_ATTR:
34330                         case S_ATTR_SPACE:
34331                                 break;
34332                         //case S_EQ:
34333                         default:
34334                                 throw new Error("attribute invalid close char('/')")
34335                         }
34336                         break;
34337                 case ''://end document
34338                         //throw new Error('unexpected end of input')
34339                         errorHandler.error('unexpected end of input');
34340                         if(s == S_TAG){
34341                                 el.setTagName(source.slice(start,p));
34342                         }
34343                         return p;
34344                 case '>':
34345                         switch(s){
34346                         case S_TAG:
34347                                 el.setTagName(source.slice(start,p));
34348                         case S_ATTR_END:
34349                         case S_TAG_SPACE:
34350                         case S_TAG_CLOSE:
34351                                 break;//normal
34352                         case S_ATTR_NOQUOT_VALUE://Compatible state
34353                         case S_ATTR:
34354                                 value = source.slice(start,p);
34355                                 if(value.slice(-1) === '/'){
34356                                         el.closed  = true;
34357                                         value = value.slice(0,-1);
34358                                 }
34359                         case S_ATTR_SPACE:
34360                                 if(s === S_ATTR_SPACE){
34361                                         value = attrName;
34362                                 }
34363                                 if(s == S_ATTR_NOQUOT_VALUE){
34364                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
34365                                         el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
34366                                 }else{
34367                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
34368                                                 errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
34369                                         }
34370                                         el.add(value,value,start);
34371                                 }
34372                                 break;
34373                         case S_EQ:
34374                                 throw new Error('attribute value missed!!');
34375                         }
34376   //                    console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
34377                         return p;
34378                 /*xml space '\x20' | #x9 | #xD | #xA; */
34379                 case '\u0080':
34380                         c = ' ';
34381                 default:
34382                         if(c<= ' '){//space
34383                                 switch(s){
34384                                 case S_TAG:
34385                                         el.setTagName(source.slice(start,p));//tagName
34386                                         s = S_TAG_SPACE;
34387                                         break;
34388                                 case S_ATTR:
34389                                         attrName = source.slice(start,p);
34390                                         s = S_ATTR_SPACE;
34391                                         break;
34392                                 case S_ATTR_NOQUOT_VALUE:
34393                                         var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
34394                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
34395                                         el.add(attrName,value,start);
34396                                 case S_ATTR_END:
34397                                         s = S_TAG_SPACE;
34398                                         break;
34399                                 //case S_TAG_SPACE:
34400                                 //case S_EQ:
34401                                 //case S_ATTR_SPACE:
34402                                 //      void();break;
34403                                 //case S_TAG_CLOSE:
34404                                         //ignore warning
34405                                 }
34406                         }else{//not space
34407   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
34408   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
34409                                 switch(s){
34410                                 //case S_TAG:void();break;
34411                                 //case S_ATTR:void();break;
34412                                 //case S_ATTR_NOQUOT_VALUE:void();break;
34413                                 case S_ATTR_SPACE:
34414                                         var tagName =  el.tagName;
34415                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
34416                                                 errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
34417                                         }
34418                                         el.add(attrName,attrName,start);
34419                                         start = p;
34420                                         s = S_ATTR;
34421                                         break;
34422                                 case S_ATTR_END:
34423                                         errorHandler.warning('attribute space is required"'+attrName+'"!!');
34424                                 case S_TAG_SPACE:
34425                                         s = S_ATTR;
34426                                         start = p;
34427                                         break;
34428                                 case S_EQ:
34429                                         s = S_ATTR_NOQUOT_VALUE;
34430                                         start = p;
34431                                         break;
34432                                 case S_TAG_CLOSE:
34433                                         throw new Error("elements closed character '/' and '>' must be connected to");
34434                                 }
34435                         }
34436                 }//end outer switch
34437                 //console.log('p++',p)
34438                 p++;
34439         }
34440   }
34441   /**
34442    * @return true if has new namespace define
34443    */
34444   function appendElement(el,domBuilder,currentNSMap){
34445         var tagName = el.tagName;
34446         var localNSMap = null;
34447         //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
34448         var i = el.length;
34449         while(i--){
34450                 var a = el[i];
34451                 var qName = a.qName;
34452                 var value = a.value;
34453                 var nsp = qName.indexOf(':');
34454                 if(nsp>0){
34455                         var prefix = a.prefix = qName.slice(0,nsp);
34456                         var localName = qName.slice(nsp+1);
34457                         var nsPrefix = prefix === 'xmlns' && localName;
34458                 }else{
34459                         localName = qName;
34460                         prefix = null;
34461                         nsPrefix = qName === 'xmlns' && '';
34462                 }
34463                 //can not set prefix,because prefix !== ''
34464                 a.localName = localName ;
34465                 //prefix == null for no ns prefix attribute 
34466                 if(nsPrefix !== false){//hack!!
34467                         if(localNSMap == null){
34468                                 localNSMap = {};
34469                                 //console.log(currentNSMap,0)
34470                                 _copy(currentNSMap,currentNSMap={});
34471                                 //console.log(currentNSMap,1)
34472                         }
34473                         currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
34474                         a.uri = 'http://www.w3.org/2000/xmlns/';
34475                         domBuilder.startPrefixMapping(nsPrefix, value); 
34476                 }
34477         }
34478         var i = el.length;
34479         while(i--){
34480                 a = el[i];
34481                 var prefix = a.prefix;
34482                 if(prefix){//no prefix attribute has no namespace
34483                         if(prefix === 'xml'){
34484                                 a.uri = 'http://www.w3.org/XML/1998/namespace';
34485                         }if(prefix !== 'xmlns'){
34486                                 a.uri = currentNSMap[prefix || ''];
34487                                 
34488                                 //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
34489                         }
34490                 }
34491         }
34492         var nsp = tagName.indexOf(':');
34493         if(nsp>0){
34494                 prefix = el.prefix = tagName.slice(0,nsp);
34495                 localName = el.localName = tagName.slice(nsp+1);
34496         }else{
34497                 prefix = null;//important!!
34498                 localName = el.localName = tagName;
34499         }
34500         //no prefix element has default namespace
34501         var ns = el.uri = currentNSMap[prefix || ''];
34502         domBuilder.startElement(ns,localName,tagName,el);
34503         //endPrefixMapping and startPrefixMapping have not any help for dom builder
34504         //localNSMap = null
34505         if(el.closed){
34506                 domBuilder.endElement(ns,localName,tagName);
34507                 if(localNSMap){
34508                         for(prefix in localNSMap){
34509                                 domBuilder.endPrefixMapping(prefix); 
34510                         }
34511                 }
34512         }else{
34513                 el.currentNSMap = currentNSMap;
34514                 el.localNSMap = localNSMap;
34515                 //parseStack.push(el);
34516                 return true;
34517         }
34518   }
34519   function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
34520         if(/^(?:script|textarea)$/i.test(tagName)){
34521                 var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
34522                 var text = source.substring(elStartEnd+1,elEndStart);
34523                 if(/[&<]/.test(text)){
34524                         if(/^script$/i.test(tagName)){
34525                                 //if(!/\]\]>/.test(text)){
34526                                         //lexHandler.startCDATA();
34527                                         domBuilder.characters(text,0,text.length);
34528                                         //lexHandler.endCDATA();
34529                                         return elEndStart;
34530                                 //}
34531                         }//}else{//text area
34532                                 text = text.replace(/&#?\w+;/g,entityReplacer);
34533                                 domBuilder.characters(text,0,text.length);
34534                                 return elEndStart;
34535                         //}
34536                         
34537                 }
34538         }
34539         return elStartEnd+1;
34540   }
34541   function fixSelfClosed(source,elStartEnd,tagName,closeMap){
34542         //if(tagName in closeMap){
34543         var pos = closeMap[tagName];
34544         if(pos == null){
34545                 //console.log(tagName)
34546                 pos =  source.lastIndexOf('</'+tagName+'>');
34547                 if(pos<elStartEnd){//忘记闭合
34548                         pos = source.lastIndexOf('</'+tagName);
34549                 }
34550                 closeMap[tagName] =pos;
34551         }
34552         return pos<elStartEnd;
34553         //} 
34554   }
34555   function _copy(source,target){
34556         for(var n in source){target[n] = source[n];}
34557   }
34558   function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
34559         var next= source.charAt(start+2);
34560         switch(next){
34561         case '-':
34562                 if(source.charAt(start + 3) === '-'){
34563                         var end = source.indexOf('-->',start+4);
34564                         //append comment source.substring(4,end)//<!--
34565                         if(end>start){
34566                                 domBuilder.comment(source,start+4,end-start-4);
34567                                 return end+3;
34568                         }else{
34569                                 errorHandler.error("Unclosed comment");
34570                                 return -1;
34571                         }
34572                 }else{
34573                         //error
34574                         return -1;
34575                 }
34576         default:
34577                 if(source.substr(start+3,6) == 'CDATA['){
34578                         var end = source.indexOf(']]>',start+9);
34579                         domBuilder.startCDATA();
34580                         domBuilder.characters(source,start+9,end-start-9);
34581                         domBuilder.endCDATA(); 
34582                         return end+3;
34583                 }
34584                 //<!DOCTYPE
34585                 //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
34586                 var matchs = split(source,start);
34587                 var len = matchs.length;
34588                 if(len>1 && /!doctype/i.test(matchs[0][0])){
34589                         var name = matchs[1][0];
34590                         var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
34591                         var sysid = len>4 && matchs[4][0];
34592                         var lastMatch = matchs[len-1];
34593                         domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
34594                                         sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
34595                         domBuilder.endDTD();
34596                         
34597                         return lastMatch.index+lastMatch[0].length
34598                 }
34599         }
34600         return -1;
34601   }
34602
34603
34604
34605   function parseInstruction(source,start,domBuilder){
34606         var end = source.indexOf('?>',start);
34607         if(end){
34608                 var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
34609                 if(match){
34610                         var len = match[0].length;
34611                         domBuilder.processingInstruction(match[1], match[2]) ;
34612                         return end+2;
34613                 }else{//error
34614                         return -1;
34615                 }
34616         }
34617         return -1;
34618   }
34619
34620   /**
34621    * @param source
34622    */
34623   function ElementAttributes(source){
34624         
34625   }
34626   ElementAttributes.prototype = {
34627         setTagName:function(tagName){
34628                 if(!tagNamePattern.test(tagName)){
34629                         throw new Error('invalid tagName:'+tagName)
34630                 }
34631                 this.tagName = tagName;
34632         },
34633         add:function(qName,value,offset){
34634                 if(!tagNamePattern.test(qName)){
34635                         throw new Error('invalid attribute:'+qName)
34636                 }
34637                 this[this.length++] = {qName:qName,value:value,offset:offset};
34638         },
34639         length:0,
34640         getLocalName:function(i){return this[i].localName},
34641         getLocator:function(i){return this[i].locator},
34642         getQName:function(i){return this[i].qName},
34643         getURI:function(i){return this[i].uri},
34644         getValue:function(i){return this[i].value}
34645   //    ,getIndex:function(uri, localName)){
34646   //            if(localName){
34647   //                    
34648   //            }else{
34649   //                    var qName = uri
34650   //            }
34651   //    },
34652   //    getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
34653   //    getType:function(uri,localName){}
34654   //    getType:function(i){},
34655   };
34656
34657
34658
34659
34660   function _set_proto_(thiz,parent){
34661         thiz.__proto__ = parent;
34662         return thiz;
34663   }
34664   if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
34665         _set_proto_ = function(thiz,parent){
34666                 function p(){}          p.prototype = parent;
34667                 p = new p();
34668                 for(parent in thiz){
34669                         p[parent] = thiz[parent];
34670                 }
34671                 return p;
34672         };
34673   }
34674
34675   function split(source,start){
34676         var match;
34677         var buf = [];
34678         var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
34679         reg.lastIndex = start;
34680         reg.exec(source);//skip <
34681         while(match = reg.exec(source)){
34682                 buf.push(match);
34683                 if(match[1])return buf;
34684         }
34685   }
34686
34687   var XMLReader_1 = XMLReader;
34688
34689   var sax = {
34690         XMLReader: XMLReader_1
34691   };
34692
34693   /*
34694    * DOM Level 2
34695    * Object DOMException
34696    * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
34697    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
34698    */
34699
34700   function copy$1(src,dest){
34701         for(var p in src){
34702                 dest[p] = src[p];
34703         }
34704   }
34705   /**
34706   ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
34707   ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
34708    */
34709   function _extends(Class,Super){
34710         var pt = Class.prototype;
34711         if(Object.create){
34712                 var ppt = Object.create(Super.prototype);
34713                 pt.__proto__ = ppt;
34714         }
34715         if(!(pt instanceof Super)){
34716                 function t(){}          t.prototype = Super.prototype;
34717                 t = new t();
34718                 copy$1(pt,t);
34719                 Class.prototype = pt = t;
34720         }
34721         if(pt.constructor != Class){
34722                 if(typeof Class != 'function'){
34723                         console.error("unknow Class:"+Class);
34724                 }
34725                 pt.constructor = Class;
34726         }
34727   }
34728   var htmlns = 'http://www.w3.org/1999/xhtml' ;
34729   // Node Types
34730   var NodeType = {};
34731   var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
34732   var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
34733   var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
34734   var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
34735   var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
34736   var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
34737   var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
34738   var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
34739   var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
34740   var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
34741   var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
34742   var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
34743
34744   // ExceptionCode
34745   var ExceptionCode = {};
34746   var ExceptionMessage = {};
34747   var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
34748   var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
34749   var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
34750   var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
34751   var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
34752   var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
34753   var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
34754   var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
34755   var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
34756   var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
34757   //level2
34758   var INVALID_STATE_ERR         = ExceptionCode.INVALID_STATE_ERR               = ((ExceptionMessage[11]="Invalid state"),11);
34759   var SYNTAX_ERR                = ExceptionCode.SYNTAX_ERR                      = ((ExceptionMessage[12]="Syntax error"),12);
34760   var INVALID_MODIFICATION_ERR  = ExceptionCode.INVALID_MODIFICATION_ERR        = ((ExceptionMessage[13]="Invalid modification"),13);
34761   var NAMESPACE_ERR             = ExceptionCode.NAMESPACE_ERR                   = ((ExceptionMessage[14]="Invalid namespace"),14);
34762   var INVALID_ACCESS_ERR        = ExceptionCode.INVALID_ACCESS_ERR              = ((ExceptionMessage[15]="Invalid access"),15);
34763
34764
34765   function DOMException(code, message) {
34766         if(message instanceof Error){
34767                 var error = message;
34768         }else{
34769                 error = this;
34770                 Error.call(this, ExceptionMessage[code]);
34771                 this.message = ExceptionMessage[code];
34772                 if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
34773         }
34774         error.code = code;
34775         if(message) this.message = this.message + ": " + message;
34776         return error;
34777   }DOMException.prototype = Error.prototype;
34778   copy$1(ExceptionCode,DOMException);
34779   /**
34780    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
34781    * 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.
34782    * The items in the NodeList are accessible via an integral index, starting from 0.
34783    */
34784   function NodeList() {
34785   }NodeList.prototype = {
34786         /**
34787          * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
34788          * @standard level1
34789          */
34790         length:0, 
34791         /**
34792          * 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.
34793          * @standard level1
34794          * @param index  unsigned long 
34795          *   Index into the collection.
34796          * @return Node
34797          *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
34798          */
34799         item: function(index) {
34800                 return this[index] || null;
34801         },
34802         toString:function(isHTML,nodeFilter){
34803                 for(var buf = [], i = 0;i<this.length;i++){
34804                         serializeToString(this[i],buf,isHTML,nodeFilter);
34805                 }
34806                 return buf.join('');
34807         }
34808   };
34809   function LiveNodeList(node,refresh){
34810         this._node = node;
34811         this._refresh = refresh;
34812         _updateLiveList(this);
34813   }
34814   function _updateLiveList(list){
34815         var inc = list._node._inc || list._node.ownerDocument._inc;
34816         if(list._inc != inc){
34817                 var ls = list._refresh(list._node);
34818                 //console.log(ls.length)
34819                 __set__(list,'length',ls.length);
34820                 copy$1(ls,list);
34821                 list._inc = inc;
34822         }
34823   }
34824   LiveNodeList.prototype.item = function(i){
34825         _updateLiveList(this);
34826         return this[i];
34827   };
34828
34829   _extends(LiveNodeList,NodeList);
34830   /**
34831    * 
34832    * 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.
34833    * NamedNodeMap objects in the DOM are live.
34834    * used for attributes or DocumentType entities 
34835    */
34836   function NamedNodeMap() {
34837   }
34838   function _findNodeIndex(list,node){
34839         var i = list.length;
34840         while(i--){
34841                 if(list[i] === node){return i}
34842         }
34843   }
34844
34845   function _addNamedNode(el,list,newAttr,oldAttr){
34846         if(oldAttr){
34847                 list[_findNodeIndex(list,oldAttr)] = newAttr;
34848         }else{
34849                 list[list.length++] = newAttr;
34850         }
34851         if(el){
34852                 newAttr.ownerElement = el;
34853                 var doc = el.ownerDocument;
34854                 if(doc){
34855                         oldAttr && _onRemoveAttribute(doc,el,oldAttr);
34856                         _onAddAttribute(doc,el,newAttr);
34857                 }
34858         }
34859   }
34860   function _removeNamedNode(el,list,attr){
34861         //console.log('remove attr:'+attr)
34862         var i = _findNodeIndex(list,attr);
34863         if(i>=0){
34864                 var lastIndex = list.length-1;
34865                 while(i<lastIndex){
34866                         list[i] = list[++i];
34867                 }
34868                 list.length = lastIndex;
34869                 if(el){
34870                         var doc = el.ownerDocument;
34871                         if(doc){
34872                                 _onRemoveAttribute(doc,el,attr);
34873                                 attr.ownerElement = null;
34874                         }
34875                 }
34876         }else{
34877                 throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
34878         }
34879   }
34880   NamedNodeMap.prototype = {
34881         length:0,
34882         item:NodeList.prototype.item,
34883         getNamedItem: function(key) {
34884   //            if(key.indexOf(':')>0 || key == 'xmlns'){
34885   //                    return null;
34886   //            }
34887                 //console.log()
34888                 var i = this.length;
34889                 while(i--){
34890                         var attr = this[i];
34891                         //console.log(attr.nodeName,key)
34892                         if(attr.nodeName == key){
34893                                 return attr;
34894                         }
34895                 }
34896         },
34897         setNamedItem: function(attr) {
34898                 var el = attr.ownerElement;
34899                 if(el && el!=this._ownerElement){
34900                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
34901                 }
34902                 var oldAttr = this.getNamedItem(attr.nodeName);
34903                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
34904                 return oldAttr;
34905         },
34906         /* returns Node */
34907         setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
34908                 var el = attr.ownerElement, oldAttr;
34909                 if(el && el!=this._ownerElement){
34910                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
34911                 }
34912                 oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
34913                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
34914                 return oldAttr;
34915         },
34916
34917         /* returns Node */
34918         removeNamedItem: function(key) {
34919                 var attr = this.getNamedItem(key);
34920                 _removeNamedNode(this._ownerElement,this,attr);
34921                 return attr;
34922                 
34923                 
34924         },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
34925         
34926         //for level2
34927         removeNamedItemNS:function(namespaceURI,localName){
34928                 var attr = this.getNamedItemNS(namespaceURI,localName);
34929                 _removeNamedNode(this._ownerElement,this,attr);
34930                 return attr;
34931         },
34932         getNamedItemNS: function(namespaceURI, localName) {
34933                 var i = this.length;
34934                 while(i--){
34935                         var node = this[i];
34936                         if(node.localName == localName && node.namespaceURI == namespaceURI){
34937                                 return node;
34938                         }
34939                 }
34940                 return null;
34941         }
34942   };
34943   /**
34944    * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
34945    */
34946   function DOMImplementation(/* Object */ features) {
34947         this._features = {};
34948         if (features) {
34949                 for (var feature in features) {
34950                          this._features = features[feature];
34951                 }
34952         }
34953   }
34954   DOMImplementation.prototype = {
34955         hasFeature: function(/* string */ feature, /* string */ version) {
34956                 var versions = this._features[feature.toLowerCase()];
34957                 if (versions && (!version || version in versions)) {
34958                         return true;
34959                 } else {
34960                         return false;
34961                 }
34962         },
34963         // Introduced in DOM Level 2:
34964         createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
34965                 var doc = new Document();
34966                 doc.implementation = this;
34967                 doc.childNodes = new NodeList();
34968                 doc.doctype = doctype;
34969                 if(doctype){
34970                         doc.appendChild(doctype);
34971                 }
34972                 if(qualifiedName){
34973                         var root = doc.createElementNS(namespaceURI,qualifiedName);
34974                         doc.appendChild(root);
34975                 }
34976                 return doc;
34977         },
34978         // Introduced in DOM Level 2:
34979         createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
34980                 var node = new DocumentType();
34981                 node.name = qualifiedName;
34982                 node.nodeName = qualifiedName;
34983                 node.publicId = publicId;
34984                 node.systemId = systemId;
34985                 // Introduced in DOM Level 2:
34986                 //readonly attribute DOMString        internalSubset;
34987                 
34988                 //TODO:..
34989                 //  readonly attribute NamedNodeMap     entities;
34990                 //  readonly attribute NamedNodeMap     notations;
34991                 return node;
34992         }
34993   };
34994
34995
34996   /**
34997    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
34998    */
34999
35000   function Node$2() {
35001   }
35002   Node$2.prototype = {
35003         firstChild : null,
35004         lastChild : null,
35005         previousSibling : null,
35006         nextSibling : null,
35007         attributes : null,
35008         parentNode : null,
35009         childNodes : null,
35010         ownerDocument : null,
35011         nodeValue : null,
35012         namespaceURI : null,
35013         prefix : null,
35014         localName : null,
35015         // Modified in DOM Level 2:
35016         insertBefore:function(newChild, refChild){//raises 
35017                 return _insertBefore(this,newChild,refChild);
35018         },
35019         replaceChild:function(newChild, oldChild){//raises 
35020                 this.insertBefore(newChild,oldChild);
35021                 if(oldChild){
35022                         this.removeChild(oldChild);
35023                 }
35024         },
35025         removeChild:function(oldChild){
35026                 return _removeChild(this,oldChild);
35027         },
35028         appendChild:function(newChild){
35029                 return this.insertBefore(newChild,null);
35030         },
35031         hasChildNodes:function(){
35032                 return this.firstChild != null;
35033         },
35034         cloneNode:function(deep){
35035                 return cloneNode(this.ownerDocument||this,this,deep);
35036         },
35037         // Modified in DOM Level 2:
35038         normalize:function(){
35039                 var child = this.firstChild;
35040                 while(child){
35041                         var next = child.nextSibling;
35042                         if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
35043                                 this.removeChild(next);
35044                                 child.appendData(next.data);
35045                         }else{
35046                                 child.normalize();
35047                                 child = next;
35048                         }
35049                 }
35050         },
35051         // Introduced in DOM Level 2:
35052         isSupported:function(feature, version){
35053                 return this.ownerDocument.implementation.hasFeature(feature,version);
35054         },
35055       // Introduced in DOM Level 2:
35056       hasAttributes:function(){
35057         return this.attributes.length>0;
35058       },
35059       lookupPrefix:function(namespaceURI){
35060         var el = this;
35061         while(el){
35062                 var map = el._nsMap;
35063                 //console.dir(map)
35064                 if(map){
35065                         for(var n in map){
35066                                 if(map[n] == namespaceURI){
35067                                         return n;
35068                                 }
35069                         }
35070                 }
35071                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
35072         }
35073         return null;
35074       },
35075       // Introduced in DOM Level 3:
35076       lookupNamespaceURI:function(prefix){
35077         var el = this;
35078         while(el){
35079                 var map = el._nsMap;
35080                 //console.dir(map)
35081                 if(map){
35082                         if(prefix in map){
35083                                 return map[prefix] ;
35084                         }
35085                 }
35086                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
35087         }
35088         return null;
35089       },
35090       // Introduced in DOM Level 3:
35091       isDefaultNamespace:function(namespaceURI){
35092         var prefix = this.lookupPrefix(namespaceURI);
35093         return prefix == null;
35094       }
35095   };
35096
35097
35098   function _xmlEncoder(c){
35099         return c == '<' && '&lt;' ||
35100            c == '>' && '&gt;' ||
35101            c == '&' && '&amp;' ||
35102            c == '"' && '&quot;' ||
35103            '&#'+c.charCodeAt()+';'
35104   }
35105
35106
35107   copy$1(NodeType,Node$2);
35108   copy$1(NodeType,Node$2.prototype);
35109
35110   /**
35111    * @param callback return true for continue,false for break
35112    * @return boolean true: break visit;
35113    */
35114   function _visitNode(node,callback){
35115         if(callback(node)){
35116                 return true;
35117         }
35118         if(node = node.firstChild){
35119                 do{
35120                         if(_visitNode(node,callback)){return true}
35121           }while(node=node.nextSibling)
35122       }
35123   }
35124
35125
35126
35127   function Document(){
35128   }
35129   function _onAddAttribute(doc,el,newAttr){
35130         doc && doc._inc++;
35131         var ns = newAttr.namespaceURI ;
35132         if(ns == 'http://www.w3.org/2000/xmlns/'){
35133                 //update namespace
35134                 el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
35135         }
35136   }
35137   function _onRemoveAttribute(doc,el,newAttr,remove){
35138         doc && doc._inc++;
35139         var ns = newAttr.namespaceURI ;
35140         if(ns == 'http://www.w3.org/2000/xmlns/'){
35141                 //update namespace
35142                 delete el._nsMap[newAttr.prefix?newAttr.localName:''];
35143         }
35144   }
35145   function _onUpdateChild(doc,el,newChild){
35146         if(doc && doc._inc){
35147                 doc._inc++;
35148                 //update childNodes
35149                 var cs = el.childNodes;
35150                 if(newChild){
35151                         cs[cs.length++] = newChild;
35152                 }else{
35153                         //console.log(1)
35154                         var child = el.firstChild;
35155                         var i = 0;
35156                         while(child){
35157                                 cs[i++] = child;
35158                                 child =child.nextSibling;
35159                         }
35160                         cs.length = i;
35161                 }
35162         }
35163   }
35164
35165   /**
35166    * attributes;
35167    * children;
35168    * 
35169    * writeable properties:
35170    * nodeValue,Attr:value,CharacterData:data
35171    * prefix
35172    */
35173   function _removeChild(parentNode,child){
35174         var previous = child.previousSibling;
35175         var next = child.nextSibling;
35176         if(previous){
35177                 previous.nextSibling = next;
35178         }else{
35179                 parentNode.firstChild = next;
35180         }
35181         if(next){
35182                 next.previousSibling = previous;
35183         }else{
35184                 parentNode.lastChild = previous;
35185         }
35186         _onUpdateChild(parentNode.ownerDocument,parentNode);
35187         return child;
35188   }
35189   /**
35190    * preformance key(refChild == null)
35191    */
35192   function _insertBefore(parentNode,newChild,nextChild){
35193         var cp = newChild.parentNode;
35194         if(cp){
35195                 cp.removeChild(newChild);//remove and update
35196         }
35197         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
35198                 var newFirst = newChild.firstChild;
35199                 if (newFirst == null) {
35200                         return newChild;
35201                 }
35202                 var newLast = newChild.lastChild;
35203         }else{
35204                 newFirst = newLast = newChild;
35205         }
35206         var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
35207
35208         newFirst.previousSibling = pre;
35209         newLast.nextSibling = nextChild;
35210         
35211         
35212         if(pre){
35213                 pre.nextSibling = newFirst;
35214         }else{
35215                 parentNode.firstChild = newFirst;
35216         }
35217         if(nextChild == null){
35218                 parentNode.lastChild = newLast;
35219         }else{
35220                 nextChild.previousSibling = newLast;
35221         }
35222         do{
35223                 newFirst.parentNode = parentNode;
35224         }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
35225         _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
35226         //console.log(parentNode.lastChild.nextSibling == null)
35227         if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
35228                 newChild.firstChild = newChild.lastChild = null;
35229         }
35230         return newChild;
35231   }
35232   function _appendSingleChild(parentNode,newChild){
35233         var cp = newChild.parentNode;
35234         if(cp){
35235                 var pre = parentNode.lastChild;
35236                 cp.removeChild(newChild);//remove and update
35237                 var pre = parentNode.lastChild;
35238         }
35239         var pre = parentNode.lastChild;
35240         newChild.parentNode = parentNode;
35241         newChild.previousSibling = pre;
35242         newChild.nextSibling = null;
35243         if(pre){
35244                 pre.nextSibling = newChild;
35245         }else{
35246                 parentNode.firstChild = newChild;
35247         }
35248         parentNode.lastChild = newChild;
35249         _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
35250         return newChild;
35251         //console.log("__aa",parentNode.lastChild.nextSibling == null)
35252   }
35253   Document.prototype = {
35254         //implementation : null,
35255         nodeName :  '#document',
35256         nodeType :  DOCUMENT_NODE,
35257         doctype :  null,
35258         documentElement :  null,
35259         _inc : 1,
35260         
35261         insertBefore :  function(newChild, refChild){//raises 
35262                 if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
35263                         var child = newChild.firstChild;
35264                         while(child){
35265                                 var next = child.nextSibling;
35266                                 this.insertBefore(child,refChild);
35267                                 child = next;
35268                         }
35269                         return newChild;
35270                 }
35271                 if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
35272                         this.documentElement = newChild;
35273                 }
35274                 
35275                 return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
35276         },
35277         removeChild :  function(oldChild){
35278                 if(this.documentElement == oldChild){
35279                         this.documentElement = null;
35280                 }
35281                 return _removeChild(this,oldChild);
35282         },
35283         // Introduced in DOM Level 2:
35284         importNode : function(importedNode,deep){
35285                 return importNode(this,importedNode,deep);
35286         },
35287         // Introduced in DOM Level 2:
35288         getElementById :        function(id){
35289                 var rtv = null;
35290                 _visitNode(this.documentElement,function(node){
35291                         if(node.nodeType == ELEMENT_NODE){
35292                                 if(node.getAttribute('id') == id){
35293                                         rtv = node;
35294                                         return true;
35295                                 }
35296                         }
35297                 });
35298                 return rtv;
35299         },
35300         
35301         //document factory method:
35302         createElement : function(tagName){
35303                 var node = new Element();
35304                 node.ownerDocument = this;
35305                 node.nodeName = tagName;
35306                 node.tagName = tagName;
35307                 node.childNodes = new NodeList();
35308                 var attrs       = node.attributes = new NamedNodeMap();
35309                 attrs._ownerElement = node;
35310                 return node;
35311         },
35312         createDocumentFragment :        function(){
35313                 var node = new DocumentFragment();
35314                 node.ownerDocument = this;
35315                 node.childNodes = new NodeList();
35316                 return node;
35317         },
35318         createTextNode :        function(data){
35319                 var node = new Text();
35320                 node.ownerDocument = this;
35321                 node.appendData(data);
35322                 return node;
35323         },
35324         createComment : function(data){
35325                 var node = new Comment();
35326                 node.ownerDocument = this;
35327                 node.appendData(data);
35328                 return node;
35329         },
35330         createCDATASection :    function(data){
35331                 var node = new CDATASection();
35332                 node.ownerDocument = this;
35333                 node.appendData(data);
35334                 return node;
35335         },
35336         createProcessingInstruction :   function(target,data){
35337                 var node = new ProcessingInstruction();
35338                 node.ownerDocument = this;
35339                 node.tagName = node.target = target;
35340                 node.nodeValue= node.data = data;
35341                 return node;
35342         },
35343         createAttribute :       function(name){
35344                 var node = new Attr();
35345                 node.ownerDocument      = this;
35346                 node.name = name;
35347                 node.nodeName   = name;
35348                 node.localName = name;
35349                 node.specified = true;
35350                 return node;
35351         },
35352         createEntityReference : function(name){
35353                 var node = new EntityReference();
35354                 node.ownerDocument      = this;
35355                 node.nodeName   = name;
35356                 return node;
35357         },
35358         // Introduced in DOM Level 2:
35359         createElementNS :       function(namespaceURI,qualifiedName){
35360                 var node = new Element();
35361                 var pl = qualifiedName.split(':');
35362                 var attrs       = node.attributes = new NamedNodeMap();
35363                 node.childNodes = new NodeList();
35364                 node.ownerDocument = this;
35365                 node.nodeName = qualifiedName;
35366                 node.tagName = qualifiedName;
35367                 node.namespaceURI = namespaceURI;
35368                 if(pl.length == 2){
35369                         node.prefix = pl[0];
35370                         node.localName = pl[1];
35371                 }else{
35372                         //el.prefix = null;
35373                         node.localName = qualifiedName;
35374                 }
35375                 attrs._ownerElement = node;
35376                 return node;
35377         },
35378         // Introduced in DOM Level 2:
35379         createAttributeNS :     function(namespaceURI,qualifiedName){
35380                 var node = new Attr();
35381                 var pl = qualifiedName.split(':');
35382                 node.ownerDocument = this;
35383                 node.nodeName = qualifiedName;
35384                 node.name = qualifiedName;
35385                 node.namespaceURI = namespaceURI;
35386                 node.specified = true;
35387                 if(pl.length == 2){
35388                         node.prefix = pl[0];
35389                         node.localName = pl[1];
35390                 }else{
35391                         //el.prefix = null;
35392                         node.localName = qualifiedName;
35393                 }
35394                 return node;
35395         }
35396   };
35397   _extends(Document,Node$2);
35398
35399
35400   function Element() {
35401         this._nsMap = {};
35402   }Element.prototype = {
35403         nodeType : ELEMENT_NODE,
35404         hasAttribute : function(name){
35405                 return this.getAttributeNode(name)!=null;
35406         },
35407         getAttribute : function(name){
35408                 var attr = this.getAttributeNode(name);
35409                 return attr && attr.value || '';
35410         },
35411         getAttributeNode : function(name){
35412                 return this.attributes.getNamedItem(name);
35413         },
35414         setAttribute : function(name, value){
35415                 var attr = this.ownerDocument.createAttribute(name);
35416                 attr.value = attr.nodeValue = "" + value;
35417                 this.setAttributeNode(attr);
35418         },
35419         removeAttribute : function(name){
35420                 var attr = this.getAttributeNode(name);
35421                 attr && this.removeAttributeNode(attr);
35422         },
35423         
35424         //four real opeartion method
35425         appendChild:function(newChild){
35426                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
35427                         return this.insertBefore(newChild,null);
35428                 }else{
35429                         return _appendSingleChild(this,newChild);
35430                 }
35431         },
35432         setAttributeNode : function(newAttr){
35433                 return this.attributes.setNamedItem(newAttr);
35434         },
35435         setAttributeNodeNS : function(newAttr){
35436                 return this.attributes.setNamedItemNS(newAttr);
35437         },
35438         removeAttributeNode : function(oldAttr){
35439                 //console.log(this == oldAttr.ownerElement)
35440                 return this.attributes.removeNamedItem(oldAttr.nodeName);
35441         },
35442         //get real attribute name,and remove it by removeAttributeNode
35443         removeAttributeNS : function(namespaceURI, localName){
35444                 var old = this.getAttributeNodeNS(namespaceURI, localName);
35445                 old && this.removeAttributeNode(old);
35446         },
35447         
35448         hasAttributeNS : function(namespaceURI, localName){
35449                 return this.getAttributeNodeNS(namespaceURI, localName)!=null;
35450         },
35451         getAttributeNS : function(namespaceURI, localName){
35452                 var attr = this.getAttributeNodeNS(namespaceURI, localName);
35453                 return attr && attr.value || '';
35454         },
35455         setAttributeNS : function(namespaceURI, qualifiedName, value){
35456                 var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
35457                 attr.value = attr.nodeValue = "" + value;
35458                 this.setAttributeNode(attr);
35459         },
35460         getAttributeNodeNS : function(namespaceURI, localName){
35461                 return this.attributes.getNamedItemNS(namespaceURI, localName);
35462         },
35463         
35464         getElementsByTagName : function(tagName){
35465                 return new LiveNodeList(this,function(base){
35466                         var ls = [];
35467                         _visitNode(base,function(node){
35468                                 if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
35469                                         ls.push(node);
35470                                 }
35471                         });
35472                         return ls;
35473                 });
35474         },
35475         getElementsByTagNameNS : function(namespaceURI, localName){
35476                 return new LiveNodeList(this,function(base){
35477                         var ls = [];
35478                         _visitNode(base,function(node){
35479                                 if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
35480                                         ls.push(node);
35481                                 }
35482                         });
35483                         return ls;
35484                         
35485                 });
35486         }
35487   };
35488   Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
35489   Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
35490
35491
35492   _extends(Element,Node$2);
35493   function Attr() {
35494   }Attr.prototype.nodeType = ATTRIBUTE_NODE;
35495   _extends(Attr,Node$2);
35496
35497
35498   function CharacterData() {
35499   }CharacterData.prototype = {
35500         data : '',
35501         substringData : function(offset, count) {
35502                 return this.data.substring(offset, offset+count);
35503         },
35504         appendData: function(text) {
35505                 text = this.data+text;
35506                 this.nodeValue = this.data = text;
35507                 this.length = text.length;
35508         },
35509         insertData: function(offset,text) {
35510                 this.replaceData(offset,0,text);
35511         
35512         },
35513         appendChild:function(newChild){
35514                 throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
35515         },
35516         deleteData: function(offset, count) {
35517                 this.replaceData(offset,count,"");
35518         },
35519         replaceData: function(offset, count, text) {
35520                 var start = this.data.substring(0,offset);
35521                 var end = this.data.substring(offset+count);
35522                 text = start + text + end;
35523                 this.nodeValue = this.data = text;
35524                 this.length = text.length;
35525         }
35526   };
35527   _extends(CharacterData,Node$2);
35528   function Text() {
35529   }Text.prototype = {
35530         nodeName : "#text",
35531         nodeType : TEXT_NODE,
35532         splitText : function(offset) {
35533                 var text = this.data;
35534                 var newText = text.substring(offset);
35535                 text = text.substring(0, offset);
35536                 this.data = this.nodeValue = text;
35537                 this.length = text.length;
35538                 var newNode = this.ownerDocument.createTextNode(newText);
35539                 if(this.parentNode){
35540                         this.parentNode.insertBefore(newNode, this.nextSibling);
35541                 }
35542                 return newNode;
35543         }
35544   };
35545   _extends(Text,CharacterData);
35546   function Comment() {
35547   }Comment.prototype = {
35548         nodeName : "#comment",
35549         nodeType : COMMENT_NODE
35550   };
35551   _extends(Comment,CharacterData);
35552
35553   function CDATASection() {
35554   }CDATASection.prototype = {
35555         nodeName : "#cdata-section",
35556         nodeType : CDATA_SECTION_NODE
35557   };
35558   _extends(CDATASection,CharacterData);
35559
35560
35561   function DocumentType() {
35562   }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
35563   _extends(DocumentType,Node$2);
35564
35565   function Notation() {
35566   }Notation.prototype.nodeType = NOTATION_NODE;
35567   _extends(Notation,Node$2);
35568
35569   function Entity() {
35570   }Entity.prototype.nodeType = ENTITY_NODE;
35571   _extends(Entity,Node$2);
35572
35573   function EntityReference() {
35574   }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
35575   _extends(EntityReference,Node$2);
35576
35577   function DocumentFragment() {
35578   }DocumentFragment.prototype.nodeName =        "#document-fragment";
35579   DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE;
35580   _extends(DocumentFragment,Node$2);
35581
35582
35583   function ProcessingInstruction() {
35584   }
35585   ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
35586   _extends(ProcessingInstruction,Node$2);
35587   function XMLSerializer$1(){}
35588   XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
35589         return nodeSerializeToString.call(node,isHtml,nodeFilter);
35590   };
35591   Node$2.prototype.toString = nodeSerializeToString;
35592   function nodeSerializeToString(isHtml,nodeFilter){
35593         var buf = [];
35594         var refNode = this.nodeType == 9?this.documentElement:this;
35595         var prefix = refNode.prefix;
35596         var uri = refNode.namespaceURI;
35597         
35598         if(uri && prefix == null){
35599                 //console.log(prefix)
35600                 var prefix = refNode.lookupPrefix(uri);
35601                 if(prefix == null){
35602                         //isHTML = true;
35603                         var visibleNamespaces=[
35604                         {namespace:uri,prefix:null}
35605                         //{namespace:uri,prefix:''}
35606                         ];
35607                 }
35608         }
35609         serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
35610         //console.log('###',this.nodeType,uri,prefix,buf.join(''))
35611         return buf.join('');
35612   }
35613   function needNamespaceDefine(node,isHTML, visibleNamespaces) {
35614         var prefix = node.prefix||'';
35615         var uri = node.namespaceURI;
35616         if (!prefix && !uri){
35617                 return false;
35618         }
35619         if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
35620                 || uri == 'http://www.w3.org/2000/xmlns/'){
35621                 return false;
35622         }
35623         
35624         var i = visibleNamespaces.length; 
35625         //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
35626         while (i--) {
35627                 var ns = visibleNamespaces[i];
35628                 // get namespace prefix
35629                 //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
35630                 if (ns.prefix == prefix){
35631                         return ns.namespace != uri;
35632                 }
35633         }
35634         //console.log(isHTML,uri,prefix=='')
35635         //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
35636         //      return false;
35637         //}
35638         //node.flag = '11111'
35639         //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
35640         return true;
35641   }
35642   function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
35643         if(nodeFilter){
35644                 node = nodeFilter(node);
35645                 if(node){
35646                         if(typeof node == 'string'){
35647                                 buf.push(node);
35648                                 return;
35649                         }
35650                 }else{
35651                         return;
35652                 }
35653                 //buf.sort.apply(attrs, attributeSorter);
35654         }
35655         switch(node.nodeType){
35656         case ELEMENT_NODE:
35657                 if (!visibleNamespaces) visibleNamespaces = [];
35658                 var startVisibleNamespaces = visibleNamespaces.length;
35659                 var attrs = node.attributes;
35660                 var len = attrs.length;
35661                 var child = node.firstChild;
35662                 var nodeName = node.tagName;
35663                 
35664                 isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
35665                 buf.push('<',nodeName);
35666                 
35667                 
35668                 
35669                 for(var i=0;i<len;i++){
35670                         // add namespaces for attributes
35671                         var attr = attrs.item(i);
35672                         if (attr.prefix == 'xmlns') {
35673                                 visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
35674                         }else if(attr.nodeName == 'xmlns'){
35675                                 visibleNamespaces.push({ prefix: '', namespace: attr.value });
35676                         }
35677                 }
35678                 for(var i=0;i<len;i++){
35679                         var attr = attrs.item(i);
35680                         if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
35681                                 var prefix = attr.prefix||'';
35682                                 var uri = attr.namespaceURI;
35683                                 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
35684                                 buf.push(ns, '="' , uri , '"');
35685                                 visibleNamespaces.push({ prefix: prefix, namespace:uri });
35686                         }
35687                         serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
35688                 }
35689                 // add namespace for current node               
35690                 if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
35691                         var prefix = node.prefix||'';
35692                         var uri = node.namespaceURI;
35693                         var ns = prefix ? ' xmlns:' + prefix : " xmlns";
35694                         buf.push(ns, '="' , uri , '"');
35695                         visibleNamespaces.push({ prefix: prefix, namespace:uri });
35696                 }
35697                 
35698                 if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
35699                         buf.push('>');
35700                         //if is cdata child node
35701                         if(isHTML && /^script$/i.test(nodeName)){
35702                                 while(child){
35703                                         if(child.data){
35704                                                 buf.push(child.data);
35705                                         }else{
35706                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
35707                                         }
35708                                         child = child.nextSibling;
35709                                 }
35710                         }else
35711                         {
35712                                 while(child){
35713                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
35714                                         child = child.nextSibling;
35715                                 }
35716                         }
35717                         buf.push('</',nodeName,'>');
35718                 }else{
35719                         buf.push('/>');
35720                 }
35721                 // remove added visible namespaces
35722                 //visibleNamespaces.length = startVisibleNamespaces;
35723                 return;
35724         case DOCUMENT_NODE:
35725         case DOCUMENT_FRAGMENT_NODE:
35726                 var child = node.firstChild;
35727                 while(child){
35728                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
35729                         child = child.nextSibling;
35730                 }
35731                 return;
35732         case ATTRIBUTE_NODE:
35733                 return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
35734         case TEXT_NODE:
35735                 return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
35736         case CDATA_SECTION_NODE:
35737                 return buf.push( '<![CDATA[',node.data,']]>');
35738         case COMMENT_NODE:
35739                 return buf.push( "<!--",node.data,"-->");
35740         case DOCUMENT_TYPE_NODE:
35741                 var pubid = node.publicId;
35742                 var sysid = node.systemId;
35743                 buf.push('<!DOCTYPE ',node.name);
35744                 if(pubid){
35745                         buf.push(' PUBLIC "',pubid);
35746                         if (sysid && sysid!='.') {
35747                                 buf.push( '" "',sysid);
35748                         }
35749                         buf.push('">');
35750                 }else if(sysid && sysid!='.'){
35751                         buf.push(' SYSTEM "',sysid,'">');
35752                 }else{
35753                         var sub = node.internalSubset;
35754                         if(sub){
35755                                 buf.push(" [",sub,"]");
35756                         }
35757                         buf.push(">");
35758                 }
35759                 return;
35760         case PROCESSING_INSTRUCTION_NODE:
35761                 return buf.push( "<?",node.target," ",node.data,"?>");
35762         case ENTITY_REFERENCE_NODE:
35763                 return buf.push( '&',node.nodeName,';');
35764         //case ENTITY_NODE:
35765         //case NOTATION_NODE:
35766         default:
35767                 buf.push('??',node.nodeName);
35768         }
35769   }
35770   function importNode(doc,node,deep){
35771         var node2;
35772         switch (node.nodeType) {
35773         case ELEMENT_NODE:
35774                 node2 = node.cloneNode(false);
35775                 node2.ownerDocument = doc;
35776                 //var attrs = node2.attributes;
35777                 //var len = attrs.length;
35778                 //for(var i=0;i<len;i++){
35779                         //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
35780                 //}
35781         case DOCUMENT_FRAGMENT_NODE:
35782                 break;
35783         case ATTRIBUTE_NODE:
35784                 deep = true;
35785                 break;
35786         //case ENTITY_REFERENCE_NODE:
35787         //case PROCESSING_INSTRUCTION_NODE:
35788         ////case TEXT_NODE:
35789         //case CDATA_SECTION_NODE:
35790         //case COMMENT_NODE:
35791         //      deep = false;
35792         //      break;
35793         //case DOCUMENT_NODE:
35794         //case DOCUMENT_TYPE_NODE:
35795         //cannot be imported.
35796         //case ENTITY_NODE:
35797         //case NOTATION_NODE:
35798         //can not hit in level3
35799         //default:throw e;
35800         }
35801         if(!node2){
35802                 node2 = node.cloneNode(false);//false
35803         }
35804         node2.ownerDocument = doc;
35805         node2.parentNode = null;
35806         if(deep){
35807                 var child = node.firstChild;
35808                 while(child){
35809                         node2.appendChild(importNode(doc,child,deep));
35810                         child = child.nextSibling;
35811                 }
35812         }
35813         return node2;
35814   }
35815   //
35816   //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
35817   //                                    attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
35818   function cloneNode(doc,node,deep){
35819         var node2 = new node.constructor();
35820         for(var n in node){
35821                 var v = node[n];
35822                 if(typeof v != 'object' ){
35823                         if(v != node2[n]){
35824                                 node2[n] = v;
35825                         }
35826                 }
35827         }
35828         if(node.childNodes){
35829                 node2.childNodes = new NodeList();
35830         }
35831         node2.ownerDocument = doc;
35832         switch (node2.nodeType) {
35833         case ELEMENT_NODE:
35834                 var attrs       = node.attributes;
35835                 var attrs2      = node2.attributes = new NamedNodeMap();
35836                 var len = attrs.length;
35837                 attrs2._ownerElement = node2;
35838                 for(var i=0;i<len;i++){
35839                         node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
35840                 }
35841                 break;
35842         case ATTRIBUTE_NODE:
35843                 deep = true;
35844         }
35845         if(deep){
35846                 var child = node.firstChild;
35847                 while(child){
35848                         node2.appendChild(cloneNode(doc,child,deep));
35849                         child = child.nextSibling;
35850                 }
35851         }
35852         return node2;
35853   }
35854
35855   function __set__(object,key,value){
35856         object[key] = value;
35857   }
35858   //do dynamic
35859   try{
35860         if(Object.defineProperty){
35861                 Object.defineProperty(LiveNodeList.prototype,'length',{
35862                         get:function(){
35863                                 _updateLiveList(this);
35864                                 return this.$$length;
35865                         }
35866                 });
35867                 Object.defineProperty(Node$2.prototype,'textContent',{
35868                         get:function(){
35869                                 return getTextContent(this);
35870                         },
35871                         set:function(data){
35872                                 switch(this.nodeType){
35873                                 case ELEMENT_NODE:
35874                                 case DOCUMENT_FRAGMENT_NODE:
35875                                         while(this.firstChild){
35876                                                 this.removeChild(this.firstChild);
35877                                         }
35878                                         if(data || String(data)){
35879                                                 this.appendChild(this.ownerDocument.createTextNode(data));
35880                                         }
35881                                         break;
35882                                 default:
35883                                         //TODO:
35884                                         this.data = data;
35885                                         this.value = data;
35886                                         this.nodeValue = data;
35887                                 }
35888                         }
35889                 });
35890                 
35891                 function getTextContent(node){
35892                         switch(node.nodeType){
35893                         case ELEMENT_NODE:
35894                         case DOCUMENT_FRAGMENT_NODE:
35895                                 var buf = [];
35896                                 node = node.firstChild;
35897                                 while(node){
35898                                         if(node.nodeType!==7 && node.nodeType !==8){
35899                                                 buf.push(getTextContent(node));
35900                                         }
35901                                         node = node.nextSibling;
35902                                 }
35903                                 return buf.join('');
35904                         default:
35905                                 return node.nodeValue;
35906                         }
35907                 }
35908                 __set__ = function(object,key,value){
35909                         //console.log(value)
35910                         object['$$'+key] = value;
35911                 };
35912         }
35913   }catch(e){//ie8
35914   }
35915
35916   //if(typeof require == 'function'){
35917         var DOMImplementation_1 = DOMImplementation;
35918         var XMLSerializer_1 = XMLSerializer$1;
35919   //}
35920
35921   var dom = {
35922         DOMImplementation: DOMImplementation_1,
35923         XMLSerializer: XMLSerializer_1
35924   };
35925
35926   var domParser = createCommonjsModule(function (module, exports) {
35927   function DOMParser(options){
35928         this.options = options ||{locator:{}};
35929         
35930   }
35931   DOMParser.prototype.parseFromString = function(source,mimeType){
35932         var options = this.options;
35933         var sax =  new XMLReader();
35934         var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
35935         var errorHandler = options.errorHandler;
35936         var locator = options.locator;
35937         var defaultNSMap = options.xmlns||{};
35938         var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
35939         if(locator){
35940                 domBuilder.setDocumentLocator(locator);
35941         }
35942         
35943         sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
35944         sax.domBuilder = options.domBuilder || domBuilder;
35945         if(/\/x?html?$/.test(mimeType)){
35946                 entityMap.nbsp = '\xa0';
35947                 entityMap.copy = '\xa9';
35948                 defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
35949         }
35950         defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
35951         if(source){
35952                 sax.parse(source,defaultNSMap,entityMap);
35953         }else{
35954                 sax.errorHandler.error("invalid doc source");
35955         }
35956         return domBuilder.doc;
35957   };
35958   function buildErrorHandler(errorImpl,domBuilder,locator){
35959         if(!errorImpl){
35960                 if(domBuilder instanceof DOMHandler){
35961                         return domBuilder;
35962                 }
35963                 errorImpl = domBuilder ;
35964         }
35965         var errorHandler = {};
35966         var isCallback = errorImpl instanceof Function;
35967         locator = locator||{};
35968         function build(key){
35969                 var fn = errorImpl[key];
35970                 if(!fn && isCallback){
35971                         fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
35972                 }
35973                 errorHandler[key] = fn && function(msg){
35974                         fn('[xmldom '+key+']\t'+msg+_locator(locator));
35975                 }||function(){};
35976         }
35977         build('warning');
35978         build('error');
35979         build('fatalError');
35980         return errorHandler;
35981   }
35982
35983   //console.log('#\n\n\n\n\n\n\n####')
35984   /**
35985    * +ContentHandler+ErrorHandler
35986    * +LexicalHandler+EntityResolver2
35987    * -DeclHandler-DTDHandler 
35988    * 
35989    * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
35990    * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
35991    * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
35992    */
35993   function DOMHandler() {
35994       this.cdata = false;
35995   }
35996   function position(locator,node){
35997         node.lineNumber = locator.lineNumber;
35998         node.columnNumber = locator.columnNumber;
35999   }
36000   /**
36001    * @see org.xml.sax.ContentHandler#startDocument
36002    * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
36003    */ 
36004   DOMHandler.prototype = {
36005         startDocument : function() {
36006         this.doc = new DOMImplementation().createDocument(null, null, null);
36007         if (this.locator) {
36008                 this.doc.documentURI = this.locator.systemId;
36009         }
36010         },
36011         startElement:function(namespaceURI, localName, qName, attrs) {
36012                 var doc = this.doc;
36013             var el = doc.createElementNS(namespaceURI, qName||localName);
36014             var len = attrs.length;
36015             appendElement(this, el);
36016             this.currentElement = el;
36017             
36018                 this.locator && position(this.locator,el);
36019             for (var i = 0 ; i < len; i++) {
36020                 var namespaceURI = attrs.getURI(i);
36021                 var value = attrs.getValue(i);
36022                 var qName = attrs.getQName(i);
36023                         var attr = doc.createAttributeNS(namespaceURI, qName);
36024                         this.locator &&position(attrs.getLocator(i),attr);
36025                         attr.value = attr.nodeValue = value;
36026                         el.setAttributeNode(attr);
36027             }
36028         },
36029         endElement:function(namespaceURI, localName, qName) {
36030                 var current = this.currentElement;
36031                 var tagName = current.tagName;
36032                 this.currentElement = current.parentNode;
36033         },
36034         startPrefixMapping:function(prefix, uri) {
36035         },
36036         endPrefixMapping:function(prefix) {
36037         },
36038         processingInstruction:function(target, data) {
36039             var ins = this.doc.createProcessingInstruction(target, data);
36040             this.locator && position(this.locator,ins);
36041             appendElement(this, ins);
36042         },
36043         ignorableWhitespace:function(ch, start, length) {
36044         },
36045         characters:function(chars, start, length) {
36046                 chars = _toString.apply(this,arguments);
36047                 //console.log(chars)
36048                 if(chars){
36049                         if (this.cdata) {
36050                                 var charNode = this.doc.createCDATASection(chars);
36051                         } else {
36052                                 var charNode = this.doc.createTextNode(chars);
36053                         }
36054                         if(this.currentElement){
36055                                 this.currentElement.appendChild(charNode);
36056                         }else if(/^\s*$/.test(chars)){
36057                                 this.doc.appendChild(charNode);
36058                                 //process xml
36059                         }
36060                         this.locator && position(this.locator,charNode);
36061                 }
36062         },
36063         skippedEntity:function(name) {
36064         },
36065         endDocument:function() {
36066                 this.doc.normalize();
36067         },
36068         setDocumentLocator:function (locator) {
36069             if(this.locator = locator){// && !('lineNumber' in locator)){
36070                 locator.lineNumber = 0;
36071             }
36072         },
36073         //LexicalHandler
36074         comment:function(chars, start, length) {
36075                 chars = _toString.apply(this,arguments);
36076             var comm = this.doc.createComment(chars);
36077             this.locator && position(this.locator,comm);
36078             appendElement(this, comm);
36079         },
36080         
36081         startCDATA:function() {
36082             //used in characters() methods
36083             this.cdata = true;
36084         },
36085         endCDATA:function() {
36086             this.cdata = false;
36087         },
36088         
36089         startDTD:function(name, publicId, systemId) {
36090                 var impl = this.doc.implementation;
36091             if (impl && impl.createDocumentType) {
36092                 var dt = impl.createDocumentType(name, publicId, systemId);
36093                 this.locator && position(this.locator,dt);
36094                 appendElement(this, dt);
36095             }
36096         },
36097         /**
36098          * @see org.xml.sax.ErrorHandler
36099          * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
36100          */
36101         warning:function(error) {
36102                 console.warn('[xmldom warning]\t'+error,_locator(this.locator));
36103         },
36104         error:function(error) {
36105                 console.error('[xmldom error]\t'+error,_locator(this.locator));
36106         },
36107         fatalError:function(error) {
36108                 console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
36109             throw error;
36110         }
36111   };
36112   function _locator(l){
36113         if(l){
36114                 return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
36115         }
36116   }
36117   function _toString(chars,start,length){
36118         if(typeof chars == 'string'){
36119                 return chars.substr(start,length)
36120         }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
36121                 if(chars.length >= start+length || start){
36122                         return new java.lang.String(chars,start,length)+'';
36123                 }
36124                 return chars;
36125         }
36126   }
36127
36128   /*
36129    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
36130    * used method of org.xml.sax.ext.LexicalHandler:
36131    *  #comment(chars, start, length)
36132    *  #startCDATA()
36133    *  #endCDATA()
36134    *  #startDTD(name, publicId, systemId)
36135    *
36136    *
36137    * IGNORED method of org.xml.sax.ext.LexicalHandler:
36138    *  #endDTD()
36139    *  #startEntity(name)
36140    *  #endEntity(name)
36141    *
36142    *
36143    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
36144    * IGNORED method of org.xml.sax.ext.DeclHandler
36145    *    #attributeDecl(eName, aName, type, mode, value)
36146    *  #elementDecl(name, model)
36147    *  #externalEntityDecl(name, publicId, systemId)
36148    *  #internalEntityDecl(name, value)
36149    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
36150    * IGNORED method of org.xml.sax.EntityResolver2
36151    *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
36152    *  #resolveEntity(publicId, systemId)
36153    *  #getExternalSubset(name, baseURI)
36154    * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
36155    * IGNORED method of org.xml.sax.DTDHandler
36156    *  #notationDecl(name, publicId, systemId) {};
36157    *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
36158    */
36159   "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
36160         DOMHandler.prototype[key] = function(){return null};
36161   });
36162
36163   /* 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 */
36164   function appendElement (hander,node) {
36165       if (!hander.currentElement) {
36166           hander.doc.appendChild(node);
36167       } else {
36168           hander.currentElement.appendChild(node);
36169       }
36170   }//appendChild and setAttributeNS are preformance key
36171
36172   //if(typeof require == 'function'){
36173         var XMLReader = sax.XMLReader;
36174         var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
36175         exports.XMLSerializer = dom.XMLSerializer ;
36176         exports.DOMParser = DOMParser;
36177   //}
36178   });
36179   var domParser_1 = domParser.DOMImplementation;
36180   var domParser_2 = domParser.XMLSerializer;
36181   var domParser_3 = domParser.DOMParser;
36182
36183   var togeojson = createCommonjsModule(function (module, exports) {
36184   var toGeoJSON = (function() {
36185
36186       var removeSpace = /\s*/g,
36187           trimSpace = /^\s*|\s*$/g,
36188           splitSpace = /\s+/;
36189       // generate a short, numeric hash of a string
36190       function okhash(x) {
36191           if (!x || !x.length) return 0;
36192           for (var i = 0, h = 0; i < x.length; i++) {
36193               h = ((h << 5) - h) + x.charCodeAt(i) | 0;
36194           } return h;
36195       }
36196       // all Y children of X
36197       function get(x, y) { return x.getElementsByTagName(y); }
36198       function attr(x, y) { return x.getAttribute(y); }
36199       function attrf(x, y) { return parseFloat(attr(x, y)); }
36200       // one Y child of X, if any, otherwise null
36201       function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
36202       // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
36203       function norm(el) { if (el.normalize) { el.normalize(); } return el; }
36204       // cast array x into numbers
36205       function numarray(x) {
36206           for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
36207           return o;
36208       }
36209       // get the content of a text node, if any
36210       function nodeVal(x) {
36211           if (x) { norm(x); }
36212           return (x && x.textContent) || '';
36213       }
36214       // get the contents of multiple text nodes, if present
36215       function getMulti(x, ys) {
36216           var o = {}, n, k;
36217           for (k = 0; k < ys.length; k++) {
36218               n = get1(x, ys[k]);
36219               if (n) o[ys[k]] = nodeVal(n);
36220           }
36221           return o;
36222       }
36223       // add properties of Y to X, overwriting if present in both
36224       function extend(x, y) { for (var k in y) x[k] = y[k]; }
36225       // get one coordinate from a coordinate array, if any
36226       function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
36227       // get all coordinates from a coordinate array as [[],[]]
36228       function coord(v) {
36229           var coords = v.replace(trimSpace, '').split(splitSpace),
36230               o = [];
36231           for (var i = 0; i < coords.length; i++) {
36232               o.push(coord1(coords[i]));
36233           }
36234           return o;
36235       }
36236       function coordPair(x) {
36237           var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
36238               ele = get1(x, 'ele'),
36239               // handle namespaced attribute in browser
36240               heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
36241               time = get1(x, 'time'),
36242               e;
36243           if (ele) {
36244               e = parseFloat(nodeVal(ele));
36245               if (!isNaN(e)) {
36246                   ll.push(e);
36247               }
36248           }
36249           return {
36250               coordinates: ll,
36251               time: time ? nodeVal(time) : null,
36252               heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
36253           };
36254       }
36255
36256       // create a new feature collection parent object
36257       function fc() {
36258           return {
36259               type: 'FeatureCollection',
36260               features: []
36261           };
36262       }
36263
36264       var serializer;
36265       if (typeof XMLSerializer !== 'undefined') {
36266           /* istanbul ignore next */
36267           serializer = new XMLSerializer();
36268       // only require xmldom in a node environment
36269       } else if (typeof process === 'object' && !process.browser) {
36270           serializer = new (domParser.XMLSerializer)();
36271       }
36272       function xml2str(str) {
36273           // IE9 will create a new XMLSerializer but it'll crash immediately.
36274           // This line is ignored because we don't run coverage tests in IE9
36275           /* istanbul ignore next */
36276           if (str.xml !== undefined) return str.xml;
36277           return serializer.serializeToString(str);
36278       }
36279
36280       var t = {
36281           kml: function(doc) {
36282
36283               var gj = fc(),
36284                   // styleindex keeps track of hashed styles in order to match features
36285                   styleIndex = {}, styleByHash = {},
36286                   // stylemapindex keeps track of style maps to expose in properties
36287                   styleMapIndex = {},
36288                   // atomic geospatial types supported by KML - MultiGeometry is
36289                   // handled separately
36290                   geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
36291                   // all root placemarks in the file
36292                   placemarks = get(doc, 'Placemark'),
36293                   styles = get(doc, 'Style'),
36294                   styleMaps = get(doc, 'StyleMap');
36295
36296               for (var k = 0; k < styles.length; k++) {
36297                   var hash = okhash(xml2str(styles[k])).toString(16);
36298                   styleIndex['#' + attr(styles[k], 'id')] = hash;
36299                   styleByHash[hash] = styles[k];
36300               }
36301               for (var l = 0; l < styleMaps.length; l++) {
36302                   styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
36303                   var pairs = get(styleMaps[l], 'Pair');
36304                   var pairsMap = {};
36305                   for (var m = 0; m < pairs.length; m++) {
36306                       pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
36307                   }
36308                   styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
36309
36310               }
36311               for (var j = 0; j < placemarks.length; j++) {
36312                   gj.features = gj.features.concat(getPlacemark(placemarks[j]));
36313               }
36314               function kmlColor(v) {
36315                   var color, opacity;
36316                   v = v || '';
36317                   if (v.substr(0, 1) === '#') { v = v.substr(1); }
36318                   if (v.length === 6 || v.length === 3) { color = v; }
36319                   if (v.length === 8) {
36320                       opacity = parseInt(v.substr(0, 2), 16) / 255;
36321                       color = '#' + v.substr(6, 2) +
36322                           v.substr(4, 2) +
36323                           v.substr(2, 2);
36324                   }
36325                   return [color, isNaN(opacity) ? undefined : opacity];
36326               }
36327               function gxCoord(v) { return numarray(v.split(' ')); }
36328               function gxCoords(root) {
36329                   var elems = get(root, 'coord', 'gx'), coords = [], times = [];
36330                   if (elems.length === 0) elems = get(root, 'gx:coord');
36331                   for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
36332                   var timeElems = get(root, 'when');
36333                   for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
36334                   return {
36335                       coords: coords,
36336                       times: times
36337                   };
36338               }
36339               function getGeometry(root) {
36340                   var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
36341                   if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
36342                   if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
36343                   if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
36344                   for (i = 0; i < geotypes.length; i++) {
36345                       geomNodes = get(root, geotypes[i]);
36346                       if (geomNodes) {
36347                           for (j = 0; j < geomNodes.length; j++) {
36348                               geomNode = geomNodes[j];
36349                               if (geotypes[i] === 'Point') {
36350                                   geoms.push({
36351                                       type: 'Point',
36352                                       coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
36353                                   });
36354                               } else if (geotypes[i] === 'LineString') {
36355                                   geoms.push({
36356                                       type: 'LineString',
36357                                       coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
36358                                   });
36359                               } else if (geotypes[i] === 'Polygon') {
36360                                   var rings = get(geomNode, 'LinearRing'),
36361                                       coords = [];
36362                                   for (k = 0; k < rings.length; k++) {
36363                                       coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
36364                                   }
36365                                   geoms.push({
36366                                       type: 'Polygon',
36367                                       coordinates: coords
36368                                   });
36369                               } else if (geotypes[i] === 'Track' ||
36370                                   geotypes[i] === 'gx:Track') {
36371                                   var track = gxCoords(geomNode);
36372                                   geoms.push({
36373                                       type: 'LineString',
36374                                       coordinates: track.coords
36375                                   });
36376                                   if (track.times.length) coordTimes.push(track.times);
36377                               }
36378                           }
36379                       }
36380                   }
36381                   return {
36382                       geoms: geoms,
36383                       coordTimes: coordTimes
36384                   };
36385               }
36386               function getPlacemark(root) {
36387                   var geomsAndTimes = getGeometry(root), i, properties = {},
36388                       name = nodeVal(get1(root, 'name')),
36389                       address = nodeVal(get1(root, 'address')),
36390                       styleUrl = nodeVal(get1(root, 'styleUrl')),
36391                       description = nodeVal(get1(root, 'description')),
36392                       timeSpan = get1(root, 'TimeSpan'),
36393                       timeStamp = get1(root, 'TimeStamp'),
36394                       extendedData = get1(root, 'ExtendedData'),
36395                       lineStyle = get1(root, 'LineStyle'),
36396                       polyStyle = get1(root, 'PolyStyle'),
36397                       visibility = get1(root, 'visibility');
36398
36399                   if (!geomsAndTimes.geoms.length) return [];
36400                   if (name) properties.name = name;
36401                   if (address) properties.address = address;
36402                   if (styleUrl) {
36403                       if (styleUrl[0] !== '#') {
36404                           styleUrl = '#' + styleUrl;
36405                       }
36406
36407                       properties.styleUrl = styleUrl;
36408                       if (styleIndex[styleUrl]) {
36409                           properties.styleHash = styleIndex[styleUrl];
36410                       }
36411                       if (styleMapIndex[styleUrl]) {
36412                           properties.styleMapHash = styleMapIndex[styleUrl];
36413                           properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
36414                       }
36415                       // Try to populate the lineStyle or polyStyle since we got the style hash
36416                       var style = styleByHash[properties.styleHash];
36417                       if (style) {
36418                           if (!lineStyle) lineStyle = get1(style, 'LineStyle');
36419                           if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
36420                       }
36421                   }
36422                   if (description) properties.description = description;
36423                   if (timeSpan) {
36424                       var begin = nodeVal(get1(timeSpan, 'begin'));
36425                       var end = nodeVal(get1(timeSpan, 'end'));
36426                       properties.timespan = { begin: begin, end: end };
36427                   }
36428                   if (timeStamp) {
36429                       properties.timestamp = nodeVal(get1(timeStamp, 'when'));
36430                   }
36431                   if (lineStyle) {
36432                       var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
36433                           color = linestyles[0],
36434                           opacity = linestyles[1],
36435                           width = parseFloat(nodeVal(get1(lineStyle, 'width')));
36436                       if (color) properties.stroke = color;
36437                       if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
36438                       if (!isNaN(width)) properties['stroke-width'] = width;
36439                   }
36440                   if (polyStyle) {
36441                       var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
36442                           pcolor = polystyles[0],
36443                           popacity = polystyles[1],
36444                           fill = nodeVal(get1(polyStyle, 'fill')),
36445                           outline = nodeVal(get1(polyStyle, 'outline'));
36446                       if (pcolor) properties.fill = pcolor;
36447                       if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
36448                       if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
36449                       if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
36450                   }
36451                   if (extendedData) {
36452                       var datas = get(extendedData, 'Data'),
36453                           simpleDatas = get(extendedData, 'SimpleData');
36454
36455                       for (i = 0; i < datas.length; i++) {
36456                           properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
36457                       }
36458                       for (i = 0; i < simpleDatas.length; i++) {
36459                           properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
36460                       }
36461                   }
36462                   if (visibility) {
36463                       properties.visibility = nodeVal(visibility);
36464                   }
36465                   if (geomsAndTimes.coordTimes.length) {
36466                       properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
36467                           geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
36468                   }
36469                   var feature = {
36470                       type: 'Feature',
36471                       geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
36472                           type: 'GeometryCollection',
36473                           geometries: geomsAndTimes.geoms
36474                       },
36475                       properties: properties
36476                   };
36477                   if (attr(root, 'id')) feature.id = attr(root, 'id');
36478                   return [feature];
36479               }
36480               return gj;
36481           },
36482           gpx: function(doc) {
36483               var i,
36484                   tracks = get(doc, 'trk'),
36485                   routes = get(doc, 'rte'),
36486                   waypoints = get(doc, 'wpt'),
36487                   // a feature collection
36488                   gj = fc(),
36489                   feature;
36490               for (i = 0; i < tracks.length; i++) {
36491                   feature = getTrack(tracks[i]);
36492                   if (feature) gj.features.push(feature);
36493               }
36494               for (i = 0; i < routes.length; i++) {
36495                   feature = getRoute(routes[i]);
36496                   if (feature) gj.features.push(feature);
36497               }
36498               for (i = 0; i < waypoints.length; i++) {
36499                   gj.features.push(getPoint(waypoints[i]));
36500               }
36501               function getPoints(node, pointname) {
36502                   var pts = get(node, pointname),
36503                       line = [],
36504                       times = [],
36505                       heartRates = [],
36506                       l = pts.length;
36507                   if (l < 2) return {};  // Invalid line in GeoJSON
36508                   for (var i = 0; i < l; i++) {
36509                       var c = coordPair(pts[i]);
36510                       line.push(c.coordinates);
36511                       if (c.time) times.push(c.time);
36512                       if (c.heartRate) heartRates.push(c.heartRate);
36513                   }
36514                   return {
36515                       line: line,
36516                       times: times,
36517                       heartRates: heartRates
36518                   };
36519               }
36520               function getTrack(node) {
36521                   var segments = get(node, 'trkseg'),
36522                       track = [],
36523                       times = [],
36524                       heartRates = [],
36525                       line;
36526                   for (var i = 0; i < segments.length; i++) {
36527                       line = getPoints(segments[i], 'trkpt');
36528                       if (line) {
36529                           if (line.line) track.push(line.line);
36530                           if (line.times && line.times.length) times.push(line.times);
36531                           if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
36532                       }
36533                   }
36534                   if (track.length === 0) return;
36535                   var properties = getProperties(node);
36536                   extend(properties, getLineStyle(get1(node, 'extensions')));
36537                   if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
36538                   if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
36539                   return {
36540                       type: 'Feature',
36541                       properties: properties,
36542                       geometry: {
36543                           type: track.length === 1 ? 'LineString' : 'MultiLineString',
36544                           coordinates: track.length === 1 ? track[0] : track
36545                       }
36546                   };
36547               }
36548               function getRoute(node) {
36549                   var line = getPoints(node, 'rtept');
36550                   if (!line.line) return;
36551                   var prop = getProperties(node);
36552                   extend(prop, getLineStyle(get1(node, 'extensions')));
36553                   var routeObj = {
36554                       type: 'Feature',
36555                       properties: prop,
36556                       geometry: {
36557                           type: 'LineString',
36558                           coordinates: line.line
36559                       }
36560                   };
36561                   return routeObj;
36562               }
36563               function getPoint(node) {
36564                   var prop = getProperties(node);
36565                   extend(prop, getMulti(node, ['sym']));
36566                   return {
36567                       type: 'Feature',
36568                       properties: prop,
36569                       geometry: {
36570                           type: 'Point',
36571                           coordinates: coordPair(node).coordinates
36572                       }
36573                   };
36574               }
36575               function getLineStyle(extensions) {
36576                   var style = {};
36577                   if (extensions) {
36578                       var lineStyle = get1(extensions, 'line');
36579                       if (lineStyle) {
36580                           var color = nodeVal(get1(lineStyle, 'color')),
36581                               opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
36582                               width = parseFloat(nodeVal(get1(lineStyle, 'width')));
36583                           if (color) style.stroke = color;
36584                           if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
36585                           // GPX width is in mm, convert to px with 96 px per inch
36586                           if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
36587                       }
36588                   }
36589                   return style;
36590               }
36591               function getProperties(node) {
36592                   var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
36593                       links = get(node, 'link');
36594                   if (links.length) prop.links = [];
36595                   for (var i = 0, link; i < links.length; i++) {
36596                       link = { href: attr(links[i], 'href') };
36597                       extend(link, getMulti(links[i], ['text', 'type']));
36598                       prop.links.push(link);
36599                   }
36600                   return prop;
36601               }
36602               return gj;
36603           }
36604       };
36605       return t;
36606   })();
36607
36608   module.exports = toGeoJSON;
36609   });
36610
36611   var _initialized = false;
36612   var _enabled = false;
36613   var _geojson;
36614
36615
36616   function svgData(projection, context, dispatch) {
36617       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
36618       var _showLabels = true;
36619       var detected = utilDetect();
36620       var layer = select(null);
36621       var _vtService;
36622       var _fileList;
36623       var _template;
36624       var _src;
36625
36626
36627       function init() {
36628           if (_initialized) return;  // run once
36629
36630           _geojson = {};
36631           _enabled = true;
36632
36633           function over() {
36634               event.stopPropagation();
36635               event.preventDefault();
36636               event.dataTransfer.dropEffect = 'copy';
36637           }
36638
36639           select('body')
36640               .attr('dropzone', 'copy')
36641               .on('drop.svgData', function() {
36642                   event.stopPropagation();
36643                   event.preventDefault();
36644                   if (!detected.filedrop) return;
36645                   drawData.fileList(event.dataTransfer.files);
36646               })
36647               .on('dragenter.svgData', over)
36648               .on('dragexit.svgData', over)
36649               .on('dragover.svgData', over);
36650
36651           _initialized = true;
36652       }
36653
36654
36655       function getService() {
36656           if (services.vectorTile && !_vtService) {
36657               _vtService = services.vectorTile;
36658               _vtService.event.on('loadedData', throttledRedraw);
36659           } else if (!services.vectorTile && _vtService) {
36660               _vtService = null;
36661           }
36662
36663           return _vtService;
36664       }
36665
36666
36667       function showLayer() {
36668           layerOn();
36669
36670           layer
36671               .style('opacity', 0)
36672               .transition()
36673               .duration(250)
36674               .style('opacity', 1)
36675               .on('end', function () { dispatch.call('change'); });
36676       }
36677
36678
36679       function hideLayer() {
36680           throttledRedraw.cancel();
36681
36682           layer
36683               .transition()
36684               .duration(250)
36685               .style('opacity', 0)
36686               .on('end', layerOff);
36687       }
36688
36689
36690       function layerOn() {
36691           layer.style('display', 'block');
36692       }
36693
36694
36695       function layerOff() {
36696           layer.selectAll('.viewfield-group').remove();
36697           layer.style('display', 'none');
36698       }
36699
36700
36701       // ensure that all geojson features in a collection have IDs
36702       function ensureIDs(gj) {
36703           if (!gj) return null;
36704
36705           if (gj.type === 'FeatureCollection') {
36706               for (var i = 0; i < gj.features.length; i++) {
36707                   ensureFeatureID(gj.features[i]);
36708               }
36709           } else {
36710               ensureFeatureID(gj);
36711           }
36712           return gj;
36713       }
36714
36715
36716       // ensure that each single Feature object has a unique ID
36717       function ensureFeatureID(feature) {
36718           if (!feature) return;
36719           feature.__featurehash__ = utilHashcode(fastJsonStableStringify(feature));
36720           return feature;
36721       }
36722
36723
36724       // Prefer an array of Features instead of a FeatureCollection
36725       function getFeatures(gj) {
36726           if (!gj) return [];
36727
36728           if (gj.type === 'FeatureCollection') {
36729               return gj.features;
36730           } else {
36731               return [gj];
36732           }
36733       }
36734
36735
36736       function featureKey(d) {
36737           return d.__featurehash__;
36738       }
36739
36740
36741       function isPolygon(d) {
36742           return d.geometry.type === 'Polygon' || d.geometry.type === 'MultiPolygon';
36743       }
36744
36745
36746       function clipPathID(d) {
36747           return 'data-' + d.__featurehash__ + '-clippath';
36748       }
36749
36750
36751       function featureClasses(d) {
36752           return [
36753               'data' + d.__featurehash__,
36754               d.geometry.type,
36755               isPolygon(d) ? 'area' : '',
36756               d.__layerID__ || ''
36757           ].filter(Boolean).join(' ');
36758       }
36759
36760
36761       function drawData(selection) {
36762           var vtService = getService();
36763           var getPath = svgPath(projection).geojson;
36764           var getAreaPath = svgPath(projection, null, true).geojson;
36765           var hasData = drawData.hasData();
36766
36767           layer = selection.selectAll('.layer-mapdata')
36768               .data(_enabled && hasData ? [0] : []);
36769
36770           layer.exit()
36771               .remove();
36772
36773           layer = layer.enter()
36774               .append('g')
36775               .attr('class', 'layer-mapdata')
36776               .merge(layer);
36777
36778           var surface = context.surface();
36779           if (!surface || surface.empty()) return;  // not ready to draw yet, starting up
36780
36781
36782           // Gather data
36783           var geoData, polygonData;
36784           if (_template && vtService) {   // fetch data from vector tile service
36785               var sourceID = _template;
36786               vtService.loadTiles(sourceID, _template, projection);
36787               geoData = vtService.data(sourceID, projection);
36788           } else {
36789               geoData = getFeatures(_geojson);
36790           }
36791           geoData = geoData.filter(getPath);
36792           polygonData = geoData.filter(isPolygon);
36793
36794
36795           // Draw clip paths for polygons
36796           var clipPaths = surface.selectAll('defs').selectAll('.clipPath-data')
36797              .data(polygonData, featureKey);
36798
36799           clipPaths.exit()
36800              .remove();
36801
36802           var clipPathsEnter = clipPaths.enter()
36803              .append('clipPath')
36804              .attr('class', 'clipPath-data')
36805              .attr('id', clipPathID);
36806
36807           clipPathsEnter
36808              .append('path');
36809
36810           clipPaths.merge(clipPathsEnter)
36811              .selectAll('path')
36812              .attr('d', getAreaPath);
36813
36814
36815           // Draw fill, shadow, stroke layers
36816           var datagroups = layer
36817               .selectAll('g.datagroup')
36818               .data(['fill', 'shadow', 'stroke']);
36819
36820           datagroups = datagroups.enter()
36821               .append('g')
36822               .attr('class', function(d) { return 'datagroup datagroup-' + d; })
36823               .merge(datagroups);
36824
36825
36826           // Draw paths
36827           var pathData = {
36828               fill: polygonData,
36829               shadow: geoData,
36830               stroke: geoData
36831           };
36832
36833           var paths = datagroups
36834               .selectAll('path')
36835               .data(function(layer) { return pathData[layer]; }, featureKey);
36836
36837           // exit
36838           paths.exit()
36839               .remove();
36840
36841           // enter/update
36842           paths = paths.enter()
36843               .append('path')
36844               .attr('class', function(d) {
36845                   var datagroup = this.parentNode.__data__;
36846                   return 'pathdata ' + datagroup + ' ' + featureClasses(d);
36847               })
36848               .attr('clip-path', function(d) {
36849                   var datagroup = this.parentNode.__data__;
36850                   return datagroup === 'fill' ? ('url(#' + clipPathID(d) + ')') : null;
36851               })
36852               .merge(paths)
36853               .attr('d', function(d) {
36854                   var datagroup = this.parentNode.__data__;
36855                   return datagroup === 'fill' ? getAreaPath(d) : getPath(d);
36856               });
36857
36858
36859           // Draw labels
36860           layer
36861               .call(drawLabels, 'label-halo', geoData)
36862               .call(drawLabels, 'label', geoData);
36863
36864
36865           function drawLabels(selection, textClass, data) {
36866               var labelPath = d3_geoPath(projection);
36867               var labelData = data.filter(function(d) {
36868                   return _showLabels && d.properties && (d.properties.desc || d.properties.name);
36869               });
36870
36871               var labels = selection.selectAll('text.' + textClass)
36872                   .data(labelData, featureKey);
36873
36874               // exit
36875               labels.exit()
36876                   .remove();
36877
36878               // enter/update
36879               labels = labels.enter()
36880                   .append('text')
36881                   .attr('class', function(d) { return textClass + ' ' + featureClasses(d); })
36882                   .merge(labels)
36883                   .text(function(d) {
36884                       return d.properties.desc || d.properties.name;
36885                   })
36886                   .attr('x', function(d) {
36887                       var centroid = labelPath.centroid(d);
36888                       return centroid[0] + 11;
36889                   })
36890                   .attr('y', function(d) {
36891                       var centroid = labelPath.centroid(d);
36892                       return centroid[1];
36893                   });
36894           }
36895       }
36896
36897
36898       function getExtension(fileName) {
36899           if (!fileName) return;
36900
36901           var re = /\.(gpx|kml|(geo)?json)$/i;
36902           var match = fileName.toLowerCase().match(re);
36903           return match && match.length && match[0];
36904       }
36905
36906
36907       function xmlToDom(textdata) {
36908           return (new DOMParser()).parseFromString(textdata, 'text/xml');
36909       }
36910
36911
36912       drawData.setFile = function(extension, data) {
36913           _template = null;
36914           _fileList = null;
36915           _geojson = null;
36916           _src = null;
36917
36918           var gj;
36919           switch (extension) {
36920               case '.gpx':
36921                   gj = togeojson.gpx(xmlToDom(data));
36922                   break;
36923               case '.kml':
36924                   gj = togeojson.kml(xmlToDom(data));
36925                   break;
36926               case '.geojson':
36927               case '.json':
36928                   gj = JSON.parse(data);
36929                   break;
36930           }
36931
36932           if (!isEmpty(gj)) {
36933               _geojson = ensureIDs(gj);
36934               _src = extension + ' data file';
36935               this.fitZoom();
36936           }
36937
36938           dispatch.call('change');
36939           return this;
36940       };
36941
36942
36943       drawData.showLabels = function(val) {
36944           if (!arguments.length) return _showLabels;
36945
36946           _showLabels = val;
36947           return this;
36948       };
36949
36950
36951       drawData.enabled = function(val) {
36952           if (!arguments.length) return _enabled;
36953
36954           _enabled = val;
36955           if (_enabled) {
36956               showLayer();
36957           } else {
36958               hideLayer();
36959           }
36960
36961           dispatch.call('change');
36962           return this;
36963       };
36964
36965
36966       drawData.hasData = function() {
36967           return !!(_template || !isEmpty(_geojson));
36968       };
36969
36970
36971       drawData.template = function(val, src) {
36972           if (!arguments.length) return _template;
36973
36974           // test source against OSM imagery blacklists..
36975           var osm = context.connection();
36976           if (osm) {
36977               var blacklists = osm.imageryBlacklists();
36978               var fail = false;
36979               var tested = 0;
36980               var regex;
36981
36982               for (var i = 0; i < blacklists.length; i++) {
36983                   try {
36984                       regex = new RegExp(blacklists[i]);
36985                       fail = regex.test(val);
36986                       tested++;
36987                       if (fail) break;
36988                   } catch (e) {
36989                       /* noop */
36990                   }
36991               }
36992
36993               // ensure at least one test was run.
36994               if (!tested) {
36995                   regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
36996                   fail = regex.test(val);
36997               }
36998           }
36999
37000           _template = val;
37001           _fileList = null;
37002           _geojson = null;
37003
37004           // strip off the querystring/hash from the template,
37005           // it often includes the access token
37006           _src = src || ('vectortile:' + val.split(/[?#]/)[0]);
37007
37008           dispatch.call('change');
37009           return this;
37010       };
37011
37012
37013       drawData.geojson = function(gj, src) {
37014           if (!arguments.length) return _geojson;
37015
37016           _template = null;
37017           _fileList = null;
37018           _geojson = null;
37019           _src = null;
37020
37021           if (!isEmpty(gj)) {
37022               _geojson = ensureIDs(gj);
37023               _src = src || 'unknown.geojson';
37024           }
37025
37026           dispatch.call('change');
37027           return this;
37028       };
37029
37030
37031       drawData.fileList = function(fileList) {
37032           if (!arguments.length) return _fileList;
37033
37034           _template = null;
37035           _fileList = fileList;
37036           _geojson = null;
37037           _src = null;
37038
37039           if (!fileList || !fileList.length) return this;
37040           var f = fileList[0];
37041           var extension = getExtension(f.name);
37042           var reader = new FileReader();
37043           reader.onload = (function() {
37044               return function(e) {
37045                   drawData.setFile(extension, e.target.result);
37046               };
37047           })(f);
37048
37049           reader.readAsText(f);
37050
37051           return this;
37052       };
37053
37054
37055       drawData.url = function(url, defaultExtension) {
37056           _template = null;
37057           _fileList = null;
37058           _geojson = null;
37059           _src = null;
37060
37061           // strip off any querystring/hash from the url before checking extension
37062           var testUrl = url.split(/[?#]/)[0];
37063           var extension = getExtension(testUrl) || defaultExtension;
37064           if (extension) {
37065               _template = null;
37066               d3_text(url, function(err, data) {
37067                   if (err) return;
37068                   drawData.setFile(extension, data);
37069               });
37070           } else {
37071               drawData.template(url);
37072           }
37073
37074           return this;
37075       };
37076
37077
37078       drawData.getSrc = function() {
37079           return _src || '';
37080       };
37081
37082
37083       drawData.fitZoom = function() {
37084           var features = getFeatures(_geojson);
37085           if (!features.length) return;
37086
37087           var map = context.map();
37088           var viewport = map.trimmedExtent().polygon();
37089           var coords = reduce(features, function(coords, feature) {
37090               var c = feature.geometry.coordinates;
37091
37092               /* eslint-disable no-fallthrough */
37093               switch (feature.geometry.type) {
37094                   case 'Point':
37095                       c = [c];
37096                   case 'MultiPoint':
37097                   case 'LineString':
37098                       break;
37099
37100                   case 'MultiPolygon':
37101                       c = flatten(c);
37102                   case 'Polygon':
37103                   case 'MultiLineString':
37104                       c = flatten(c);
37105                       break;
37106               }
37107               /* eslint-enable no-fallthrough */
37108
37109               return union(coords, c);
37110           }, []);
37111
37112           if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
37113               var extent = geoExtent(d3_geoBounds({ type: 'LineString', coordinates: coords }));
37114               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
37115           }
37116
37117           return this;
37118       };
37119
37120
37121       init();
37122       return drawData;
37123   }
37124
37125   function svgDebug(projection, context) {
37126
37127       function drawDebug(selection) {
37128           var showsTile = context.getDebug('tile');
37129           var showsCollision = context.getDebug('collision');
37130           var showsImagery = context.getDebug('imagery');
37131           var showsCommunity = context.getDebug('community');
37132           var showsImperial = context.getDebug('imperial');
37133           var showsDriveLeft = context.getDebug('driveLeft');
37134           var showsTouchTargets = context.getDebug('target');
37135
37136           var debugData = [];
37137           if (showsTile) {
37138               debugData.push({ class: 'red', label: 'tile' });
37139           }
37140           if (showsCollision) {
37141               debugData.push({ class: 'yellow', label: 'collision' });
37142           }
37143           if (showsImagery) {
37144               debugData.push({ class: 'orange', label: 'imagery' });
37145           }
37146           if (showsCommunity) {
37147               debugData.push({ class: 'blue', label: 'community' });
37148           }
37149           if (showsImperial) {
37150               debugData.push({ class: 'cyan', label: 'imperial' });
37151           }
37152           if (showsDriveLeft) {
37153               debugData.push({ class: 'green', label: 'driveLeft' });
37154           }
37155           if (showsTouchTargets) {
37156               debugData.push({ class: 'pink', label: 'touchTargets' });
37157           }
37158
37159
37160           var legend = select('#content')
37161               .selectAll('.debug-legend')
37162               .data(debugData.length ? [0] : []);
37163
37164           legend.exit()
37165               .remove();
37166
37167           legend = legend.enter()
37168               .append('div')
37169               .attr('class', 'fillD debug-legend')
37170               .merge(legend);
37171
37172
37173           var legendItems = legend.selectAll('.debug-legend-item')
37174               .data(debugData, function(d) { return d.label; });
37175
37176           legendItems.exit()
37177               .remove();
37178
37179           legendItems.enter()
37180               .append('span')
37181               .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
37182               .text(function(d) { return d.label; });
37183
37184
37185           var layer = selection.selectAll('.layer-debug')
37186               .data(showsImagery || showsCommunity || showsImperial || showsDriveLeft ? [0] : []);
37187
37188           layer.exit()
37189               .remove();
37190
37191           layer = layer.enter()
37192               .append('g')
37193               .attr('class', 'layer-debug')
37194               .merge(layer);
37195
37196
37197           var extent = context.map().extent();
37198           var matchImagery = (showsImagery && data.imagery.query.bbox(extent.rectangle(), true)) || [];
37199           var features = matchImagery.map(function(d) { return data.imagery.features[d.id]; });
37200
37201           var imagery = layer.selectAll('path.debug-imagery')
37202               .data(features);
37203
37204           imagery.exit()
37205               .remove();
37206
37207           imagery.enter()
37208               .append('path')
37209               .attr('class', 'debug-imagery debug orange');
37210
37211
37212           var community = layer.selectAll('path.debug-community')
37213               .data(showsCommunity ? values$1(data.community.features) : []);
37214
37215           community.exit()
37216               .remove();
37217
37218           community.enter()
37219               .append('path')
37220               .attr('class', 'debug-community debug blue');
37221
37222
37223           var imperial = layer
37224               .selectAll('path.debug-imperial')
37225               .data(showsImperial ? [dataImperial] : []);
37226
37227           imperial.exit()
37228               .remove();
37229
37230           imperial.enter()
37231               .append('path')
37232               .attr('class', 'debug-imperial debug cyan');
37233
37234
37235           var driveLeft = layer
37236               .selectAll('path.debug-drive-left')
37237               .data(showsDriveLeft ? [dataDriveLeft] : []);
37238
37239           driveLeft.exit()
37240               .remove();
37241
37242           driveLeft.enter()
37243               .append('path')
37244               .attr('class', 'debug-drive-left debug green');
37245
37246
37247           // update
37248           layer.selectAll('path')
37249               .attr('d', svgPath(projection).geojson);
37250       }
37251
37252
37253       // This looks strange because `enabled` methods on other layers are
37254       // chainable getter/setters, and this one is just a getter.
37255       drawDebug.enabled = function() {
37256           if (!arguments.length) {
37257               return context.getDebug('tile') ||
37258                   context.getDebug('collision') ||
37259                   context.getDebug('imagery') ||
37260                   context.getDebug('imperial') ||
37261                   context.getDebug('driveLeft') ||
37262                   context.getDebug('target');
37263           } else {
37264               return this;
37265           }
37266       };
37267
37268
37269       return drawDebug;
37270   }
37271
37272   /*
37273       A standalone SVG element that contains only a `defs` sub-element. To be
37274       used once globally, since defs IDs must be unique within a document.
37275   */
37276   function svgDefs(context) {
37277
37278       function drawDefs(selection) {
37279           var defs = selection.append('defs');
37280
37281           // add markers
37282           defs
37283               .append('marker')
37284               .attr('id', 'oneway-marker')
37285               .attr('viewBox', '0 0 10 5')
37286               .attr('refX', 2.5)
37287               .attr('refY', 2.5)
37288               .attr('markerWidth', 2)
37289               .attr('markerHeight', 2)
37290               .attr('markerUnits', 'strokeWidth')
37291               .attr('orient', 'auto')
37292               .append('path')
37293               .attr('class', 'oneway-marker-path')
37294               .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')
37295               .attr('stroke', 'none')
37296               .attr('fill', '#000')
37297               .attr('opacity', '0.75');
37298
37299           // SVG markers have to be given a colour where they're defined
37300           // (they can't inherit it from the line they're attached to),
37301           // so we need to manually define markers for each color of tag
37302           // (also, it's slightly nicer if we can control the
37303           // positioning for different tags)
37304           function addSidedMarker(name, color, offset) {
37305               defs
37306                   .append('marker')
37307                   .attr('id', 'sided-marker-' + name)
37308                   .attr('viewBox', '0 0 2 2')
37309                   .attr('refX', 1)
37310                   .attr('refY', -offset)
37311                   .attr('markerWidth', 1.5)
37312                   .attr('markerHeight', 1.5)
37313                   .attr('markerUnits', 'strokeWidth')
37314                   .attr('orient', 'auto')
37315                   .append('path')
37316                   .attr('class', 'sided-marker-path sided-marker-' + name + '-path')
37317                   .attr('d', 'M 0,0 L 1,1 L 2,0 z')
37318                   .attr('stroke', 'none')
37319                   .attr('fill', color);
37320           }
37321           addSidedMarker('natural', 'rgb(140, 208, 95)', 0);
37322           // for a coastline, the arrows are (somewhat unintuitively) on
37323           // the water side, so let's color them blue (with a gap) to
37324           // give a stronger indication
37325           addSidedMarker('coastline', '#77dede', 1);
37326           // barriers have a dashed line, and separating the triangle
37327           // from the line visually suits that
37328           addSidedMarker('barrier', '#ddd', 1);
37329           addSidedMarker('man_made', '#fff', 0);
37330
37331           defs
37332               .append('marker')
37333               .attr('id', 'viewfield-marker')
37334               .attr('viewBox', '0 0 16 16')
37335               .attr('refX', 8)
37336               .attr('refY', 16)
37337               .attr('markerWidth', 4)
37338               .attr('markerHeight', 4)
37339               .attr('markerUnits', 'strokeWidth')
37340               .attr('orient', 'auto')
37341               .append('path')
37342               .attr('class', 'viewfield-marker-path')
37343               .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')
37344               .attr('fill', '#333')
37345               .attr('fill-opacity', '0.75')
37346               .attr('stroke', '#fff')
37347               .attr('stroke-width', '0.5px')
37348               .attr('stroke-opacity', '0.75');
37349
37350           defs
37351               .append('marker')
37352               .attr('id', 'viewfield-marker-wireframe')
37353               .attr('viewBox', '0 0 16 16')
37354               .attr('refX', 8)
37355               .attr('refY', 16)
37356               .attr('markerWidth', 4)
37357               .attr('markerHeight', 4)
37358               .attr('markerUnits', 'strokeWidth')
37359               .attr('orient', 'auto')
37360               .append('path')
37361               .attr('class', 'viewfield-marker-path')
37362               .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')
37363               .attr('fill', 'none')
37364               .attr('stroke', '#fff')
37365               .attr('stroke-width', '0.5px')
37366               .attr('stroke-opacity', '0.75');
37367
37368           // add patterns
37369           var patterns = defs.selectAll('pattern')
37370               .data([
37371                   // pattern name, pattern image name
37372                   ['beach', 'dots'],
37373                   ['construction', 'construction'],
37374                   ['cemetery', 'cemetery'],
37375                   ['cemetery_christian', 'cemetery_christian'],
37376                   ['cemetery_buddhist', 'cemetery_buddhist'],
37377                   ['cemetery_muslim', 'cemetery_muslim'],
37378                   ['cemetery_jewish', 'cemetery_jewish'],
37379                   ['farmland', 'farmland'],
37380                   ['farmyard', 'farmyard'],
37381                   ['forest', 'forest'],
37382                   ['forest_broadleaved', 'forest_broadleaved'],
37383                   ['forest_needleleaved', 'forest_needleleaved'],
37384                   ['forest_leafless', 'forest_leafless'],
37385                   ['grass', 'grass'],
37386                   ['landfill', 'landfill'],
37387                   ['meadow', 'grass'],
37388                   ['orchard', 'orchard'],
37389                   ['pond', 'pond'],
37390                   ['quarry', 'quarry'],
37391                   ['scrub', 'bushes'],
37392                   ['vineyard', 'vineyard'],
37393                   ['water_standing', 'lines'],
37394                   ['waves', 'waves'],
37395                   ['wetland', 'wetland'],
37396                   ['wetland_marsh', 'wetland_marsh'],
37397                   ['wetland_swamp', 'wetland_swamp'],
37398                   ['wetland_bog', 'wetland_bog'],
37399                   ['wetland_reedbed', 'wetland_reedbed']
37400               ])
37401               .enter()
37402               .append('pattern')
37403               .attr('id', function (d) { return 'pattern-' + d[0]; })
37404               .attr('width', 32)
37405               .attr('height', 32)
37406               .attr('patternUnits', 'userSpaceOnUse');
37407
37408           patterns
37409               .append('rect')
37410               .attr('x', 0)
37411               .attr('y', 0)
37412               .attr('width', 32)
37413               .attr('height', 32)
37414               .attr('class', function (d) { return 'pattern-color-' + d[0]; });
37415
37416           patterns
37417               .append('image')
37418               .attr('x', 0)
37419               .attr('y', 0)
37420               .attr('width', 32)
37421               .attr('height', 32)
37422               .attr('xlink:href', function (d) {
37423                   return context.imagePath('pattern/' + d[1] + '.png');
37424               });
37425
37426           // add clip paths
37427           defs.selectAll('clipPath')
37428               .data([12, 18, 20, 32, 45])
37429               .enter()
37430               .append('clipPath')
37431               .attr('id', function (d) { return 'clip-square-' + d; })
37432               .append('rect')
37433               .attr('x', 0)
37434               .attr('y', 0)
37435               .attr('width', function (d) { return d; })
37436               .attr('height', function (d) { return d; });
37437
37438           // add symbol spritesheets
37439           defs
37440               .call(drawDefs.addSprites, [
37441                   'iD-sprite', 'maki-sprite', 'temaki-sprite', 'fa-sprite', 'community-sprite'
37442               ], true);
37443       }
37444
37445
37446       drawDefs.addSprites = function(selection, ids, overrideColors) {
37447           var spritesheets = selection.selectAll('.spritesheet');
37448           var currData = spritesheets.data();
37449           var data = uniq(currData.concat(ids));
37450
37451           spritesheets
37452               .data(data)
37453               .enter()
37454               .append('g')
37455               .attr('class', function(d) { return 'spritesheet spritesheet-' + d; })
37456               .each(function(d) {
37457                   var url = context.imagePath(d + '.svg');
37458                   var node = select(this).node();
37459                   request(url)
37460                       .mimeType('image/svg+xml')
37461                       .response(function(xhr) { return xhr.responseXML; })
37462                       .get(function(err, svg) {
37463                           if (err) return;
37464                           node.appendChild(
37465                               select(svg.documentElement).attr('id', d).node()
37466                           );
37467                           if (overrideColors && d !== 'iD-sprite') {   // allow icon colors to be overridden..
37468                               select(node).selectAll('path')
37469                                   .attr('fill', 'currentColor');
37470                           }
37471                       });
37472               });
37473       };
37474
37475
37476       return drawDefs;
37477   }
37478
37479   var _keepRightEnabled = false;
37480   var _keepRightService;
37481
37482
37483   function svgKeepRight(projection, context, dispatch) {
37484       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
37485       var minZoom = 12;
37486       var touchLayer = select(null);
37487       var drawLayer = select(null);
37488       var _keepRightVisible = false;
37489
37490
37491       function markerPath(selection, klass) {
37492           selection
37493               .attr('class', klass)
37494               .attr('transform', 'translate(-4, -24)')
37495               .attr('d', 'M11.6,6.2H7.1l1.4-5.1C8.6,0.6,8.1,0,7.5,0H2.2C1.7,0,1.3,0.3,1.3,0.8L0,10.2c-0.1,0.6,0.4,1.1,0.9,1.1h4.6l-1.8,7.6C3.6,19.4,4.1,20,4.7,20c0.3,0,0.6-0.2,0.8-0.5l6.9-11.9C12.7,7,12.3,6.2,11.6,6.2z');
37496       }
37497
37498
37499       // Loosely-coupled keepRight service for fetching errors.
37500       function getService() {
37501           if (services.keepRight && !_keepRightService) {
37502               _keepRightService = services.keepRight;
37503               _keepRightService.on('loaded', throttledRedraw);
37504           } else if (!services.keepRight && _keepRightService) {
37505               _keepRightService = null;
37506           }
37507
37508           return _keepRightService;
37509       }
37510
37511
37512       // Show the errors
37513       function editOn() {
37514           if (!_keepRightVisible) {
37515               _keepRightVisible = true;
37516               drawLayer
37517                   .style('display', 'block');
37518           }
37519       }
37520
37521
37522       // Immediately remove the errors and their touch targets
37523       function editOff() {
37524           if (_keepRightVisible) {
37525               _keepRightVisible = false;
37526               drawLayer
37527                   .style('display', 'none');
37528               drawLayer.selectAll('.qa_error.keepRight')
37529                   .remove();
37530               touchLayer.selectAll('.qa_error.keepRight')
37531                   .remove();
37532           }
37533       }
37534
37535
37536       // Enable the layer.  This shows the errors and transitions them to visible.
37537       function layerOn() {
37538           editOn();
37539
37540           drawLayer
37541               .style('opacity', 0)
37542               .transition()
37543               .duration(250)
37544               .style('opacity', 1)
37545               .on('end interrupt', function () {
37546                   dispatch.call('change');
37547               });
37548       }
37549
37550
37551       // Disable the layer.  This transitions the layer invisible and then hides the errors.
37552       function layerOff() {
37553           throttledRedraw.cancel();
37554           drawLayer.interrupt();
37555           touchLayer.selectAll('.qa_error.keepRight')
37556               .remove();
37557
37558           drawLayer
37559               .transition()
37560               .duration(250)
37561               .style('opacity', 0)
37562               .on('end interrupt', function () {
37563                   editOff();
37564                   dispatch.call('change');
37565               });
37566       }
37567
37568
37569       // Update the error markers
37570       function updateMarkers() {
37571           if (!_keepRightVisible || !_keepRightEnabled) return;
37572
37573           var service = getService();
37574           var selectedID = context.selectedErrorID();
37575           var data = (service ? service.getErrors(projection) : []);
37576           var getTransform = svgPointTransform(projection);
37577
37578           // Draw markers..
37579           var markers = drawLayer.selectAll('.qa_error.keepRight')
37580               .data(data, function(d) { return d.id; });
37581
37582           // exit
37583           markers.exit()
37584               .remove();
37585
37586           // enter
37587           var markersEnter = markers.enter()
37588               .append('g')
37589               .attr('class', function(d) {
37590                   return [
37591                       'qa_error',
37592                       d.service,
37593                       'error_id-' + d.id,
37594                       'error_type-' + d.parent_error_type
37595                   ].join(' ');
37596               });
37597
37598           markersEnter
37599               .append('ellipse')
37600               .attr('cx', 0.5)
37601               .attr('cy', 1)
37602               .attr('rx', 6.5)
37603               .attr('ry', 3)
37604               .attr('class', 'stroke');
37605
37606           markersEnter
37607               .append('path')
37608               .call(markerPath, 'shadow');
37609
37610           markersEnter
37611               .append('use')
37612               .attr('class', 'qa_error-fill')
37613               .attr('width', '20px')
37614               .attr('height', '20px')
37615               .attr('x', '-8px')
37616               .attr('y', '-22px')
37617               .attr('xlink:href', '#iD-icon-bolt');
37618
37619           // update
37620           markers
37621               .merge(markersEnter)
37622               .sort(sortY)
37623               .classed('selected', function(d) { return d.id === selectedID; })
37624               .attr('transform', getTransform);
37625
37626
37627           // Draw targets..
37628           if (touchLayer.empty()) return;
37629           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
37630
37631           var targets = touchLayer.selectAll('.qa_error.keepRight')
37632               .data(data, function(d) { return d.id; });
37633
37634           // exit
37635           targets.exit()
37636               .remove();
37637
37638           // enter/update
37639           targets.enter()
37640               .append('rect')
37641               .attr('width', '20px')
37642               .attr('height', '20px')
37643               .attr('x', '-8px')
37644               .attr('y', '-22px')
37645               .merge(targets)
37646               .sort(sortY)
37647               .attr('class', function(d) {
37648                   return 'qa_error ' + d.service + ' target error_id-' + d.id + ' ' + fillClass;
37649               })
37650               .attr('transform', getTransform);
37651
37652
37653           function sortY(a, b) {
37654               return (a.id === selectedID) ? 1
37655                   : (b.id === selectedID) ? -1
37656                   : (a.severity === 'error' && b.severity !== 'error') ? 1
37657                   : (b.severity === 'error' && a.severity !== 'error') ? -1
37658                   : b.loc[1] - a.loc[1];
37659           }
37660       }
37661
37662
37663       // Draw the keepRight layer and schedule loading errors and updating markers.
37664       function drawKeepRight(selection) {
37665           var service = getService();
37666
37667           var surface = context.surface();
37668           if (surface && !surface.empty()) {
37669               touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
37670           }
37671
37672           drawLayer = selection.selectAll('.layer-keepRight')
37673               .data(service ? [0] : []);
37674
37675           drawLayer.exit()
37676               .remove();
37677
37678           drawLayer = drawLayer.enter()
37679               .append('g')
37680               .attr('class', 'layer-keepRight')
37681               .style('display', _keepRightEnabled ? 'block' : 'none')
37682               .merge(drawLayer);
37683
37684           if (_keepRightEnabled) {
37685               if (service && ~~context.map().zoom() >= minZoom) {
37686                   editOn();
37687                   service.loadErrors(projection);
37688                   updateMarkers();
37689               } else {
37690                   editOff();
37691               }
37692           }
37693       }
37694
37695
37696       // Toggles the layer on and off
37697       drawKeepRight.enabled = function(val) {
37698           if (!arguments.length) return _keepRightEnabled;
37699
37700           _keepRightEnabled = val;
37701           if (_keepRightEnabled) {
37702               layerOn();
37703           } else {
37704               layerOff();
37705               if (context.selectedErrorID()) {
37706                   context.enter(modeBrowse(context));
37707               }
37708           }
37709
37710           dispatch.call('change');
37711           return this;
37712       };
37713
37714
37715       drawKeepRight.supported = function() {
37716           return !!getService();
37717       };
37718
37719
37720       return drawKeepRight;
37721   }
37722
37723   function svgIcon(name, svgklass, useklass) {
37724       return function drawIcon(selection) {
37725           selection.selectAll('svg.icon')
37726               .data([0])
37727               .enter()
37728               .append('svg')
37729               .attr('class', 'icon ' + (svgklass || ''))
37730               .append('use')
37731               .attr('xlink:href', name)
37732               .attr('class', useklass);
37733       };
37734   }
37735
37736   // Touch targets control which other vertices we can drag a vertex onto.
37737   //
37738   // - the activeID - nope
37739   // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
37740   // - 2 away from the activeID - nope (would create a self intersecting segment)
37741   // - all others on a linear way - yes
37742   // - all others on a closed way - nope (would create a self intersecting polygon)
37743   //
37744   // returns
37745   // 0 = active vertex - no touch/connect
37746   // 1 = passive vertex - yes touch/connect
37747   // 2 = adjacent vertex - yes but pay attention segmenting a line here
37748   //
37749   function svgPassiveVertex(node, graph, activeID) {
37750       if (!activeID) return 1;
37751       if (activeID === node.id) return 0;
37752
37753       var parents = graph.parentWays(node);
37754
37755       for (var i = 0; i < parents.length; i++) {
37756           var nodes = parents[i].nodes;
37757           var isClosed = parents[i].isClosed();
37758           for (var j = 0; j < nodes.length; j++) {   // find this vertex, look nearby
37759               if (nodes[j] === node.id) {
37760                   var ix1 = j - 2;
37761                   var ix2 = j - 1;
37762                   var ix3 = j + 1;
37763                   var ix4 = j + 2;
37764
37765                   if (isClosed) {  // wraparound if needed
37766                       var max = nodes.length - 1;
37767                       if (ix1 < 0)   ix1 = max + ix1;
37768                       if (ix2 < 0)   ix2 = max + ix2;
37769                       if (ix3 > max) ix3 = ix3 - max;
37770                       if (ix4 > max) ix4 = ix4 - max;
37771                   }
37772
37773                   if (nodes[ix1] === activeID) return 0;        // no - prevent self intersect
37774                   else if (nodes[ix2] === activeID) return 2;   // ok - adjacent
37775                   else if (nodes[ix3] === activeID) return 2;   // ok - adjacent
37776                   else if (nodes[ix4] === activeID) return 0;   // no - prevent self intersect
37777                   else if (isClosed && nodes.indexOf(activeID) !== -1) return 0;  // no - prevent self intersect
37778               }
37779           }
37780       }
37781
37782       return 1;   // ok
37783   }
37784
37785
37786   function svgMarkerSegments(projection, graph, dt,
37787                                     shouldReverse,
37788                                     bothDirections) {
37789       return function(entity) {
37790           var i = 0;
37791           var offset = dt;
37792           var segments = [];
37793           var clip = d3_geoIdentity().clipExtent(projection.clipExtent()).stream;
37794           var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
37795           var a, b;
37796
37797           if (shouldReverse(entity)) {
37798               coordinates.reverse();
37799           }
37800
37801           geoStream({
37802               type: 'LineString',
37803               coordinates: coordinates
37804           }, projection.stream(clip({
37805               lineStart: function() {},
37806               lineEnd: function() { a = null; },
37807               point: function(x, y) {
37808                   b = [x, y];
37809
37810                   if (a) {
37811                       var span = geoVecLength(a, b) - offset;
37812
37813                       if (span >= 0) {
37814                           var heading = geoVecAngle(a, b);
37815                           var dx = dt * Math.cos(heading);
37816                           var dy = dt * Math.sin(heading);
37817                           var p = [
37818                               a[0] + offset * Math.cos(heading),
37819                               a[1] + offset * Math.sin(heading)
37820                           ];
37821
37822                           // gather coordinates
37823                           var coord = [a, p];
37824                           for (span -= dt; span >= 0; span -= dt) {
37825                               p = geoVecAdd(p, [dx, dy]);
37826                               coord.push(p);
37827                           }
37828                           coord.push(b);
37829
37830                           // generate svg paths
37831                           var segment = '';
37832                           var j;
37833
37834                           for (j = 0; j < coord.length; j++) {
37835                               segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
37836                           }
37837                           segments.push({ id: entity.id, index: i++, d: segment });
37838
37839                           if (bothDirections(entity)) {
37840                               segment = '';
37841                               for (j = coord.length - 1; j >= 0; j--) {
37842                                   segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
37843                               }
37844                               segments.push({ id: entity.id, index: i++, d: segment });
37845                           }
37846                       }
37847
37848                       offset = -span;
37849                   }
37850
37851                   a = b;
37852               }
37853           })));
37854
37855           return segments;
37856       };
37857   }
37858
37859
37860   function svgPath(projection, graph, isArea) {
37861
37862       // Explanation of magic numbers:
37863       // "padding" here allows space for strokes to extend beyond the viewport,
37864       // so that the stroke isn't drawn along the edge of the viewport when
37865       // the shape is clipped.
37866       //
37867       // When drawing lines, pad viewport by 5px.
37868       // When drawing areas, pad viewport by 65px in each direction to allow
37869       // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
37870
37871       var cache = {};
37872       var padding = isArea ? 65 : 5;
37873       var viewport = projection.clipExtent();
37874       var paddedExtent = [
37875           [viewport[0][0] - padding, viewport[0][1] - padding],
37876           [viewport[1][0] + padding, viewport[1][1] + padding]
37877       ];
37878       var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
37879       var project = projection.stream;
37880       var path = d3_geoPath()
37881           .projection({stream: function(output) { return project(clip(output)); }});
37882
37883       var svgpath = function(entity) {
37884           if (entity.id in cache) {
37885               return cache[entity.id];
37886           } else {
37887               return cache[entity.id] = path(entity.asGeoJSON(graph));
37888           }
37889       };
37890
37891       svgpath.geojson = function(d) {
37892           if (d.__featurehash__ !== undefined) {
37893               if (d.__featurehash__ in cache) {
37894                   return cache[d.__featurehash__];
37895               } else {
37896                   return cache[d.__featurehash__] = path(d);
37897               }
37898           } else {
37899               return path(d);
37900           }
37901       };
37902
37903       return svgpath;
37904   }
37905
37906
37907   function svgPointTransform(projection) {
37908       var svgpoint = function(entity) {
37909           // http://jsperf.com/short-array-join
37910           var pt = projection(entity.loc);
37911           return 'translate(' + pt[0] + ',' + pt[1] + ')';
37912       };
37913
37914       svgpoint.geojson = function(d) {
37915           return svgpoint(d.properties.entity);
37916       };
37917
37918       return svgpoint;
37919   }
37920
37921
37922   function svgRelationMemberTags(graph) {
37923       return function(entity) {
37924           var tags = entity.tags;
37925           graph.parentRelations(entity).forEach(function(relation) {
37926               var type = relation.tags.type;
37927               if (type === 'multipolygon' || type === 'boundary') {
37928                   tags = assignIn({}, relation.tags, tags);
37929               }
37930           });
37931           return tags;
37932       };
37933   }
37934
37935
37936   function svgSegmentWay(way, graph, activeID) {
37937       // When there is no activeID, we can memoize this expensive computation
37938       if (activeID === undefined) {
37939           return graph.transient(way, 'waySegments', getWaySegments);
37940       } else {
37941           return getWaySegments();
37942       }
37943
37944       function getWaySegments() {
37945           var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
37946           var features = { passive: [], active: [] };
37947           var start = {};
37948           var end = {};
37949           var node, type;
37950
37951           for (var i = 0; i < way.nodes.length; i++) {
37952               node = graph.entity(way.nodes[i]);
37953               type = svgPassiveVertex(node, graph, activeID);
37954               end = { node: node, type: type };
37955
37956               if (start.type !== undefined) {
37957                   if (start.node.id === activeID || end.node.id === activeID) ; else if (isActiveWay && (start.type === 2 || end.type === 2)) {   // one adjacent vertex
37958                       pushActive(start, end, i);
37959                   } else if (start.type === 0 && end.type === 0) {   // both active vertices
37960                       pushActive(start, end, i);
37961                   } else {
37962                       pushPassive(start, end, i);
37963                   }
37964               }
37965
37966               start = end;
37967           }
37968
37969           return features;
37970
37971           function pushActive(start, end, index) {
37972               features.active.push({
37973                   type: 'Feature',
37974                   id: way.id + '-' + index + '-nope',
37975                   properties: {
37976                       nope: true,
37977                       target: true,
37978                       entity: way,
37979                       nodes: [start.node, end.node],
37980                       index: index
37981                   },
37982                   geometry: {
37983                       type: 'LineString',
37984                       coordinates: [start.node.loc, end.node.loc]
37985                   }
37986               });
37987           }
37988
37989           function pushPassive(start, end, index) {
37990               features.passive.push({
37991                   type: 'Feature',
37992                   id: way.id + '-' + index,
37993                   properties: {
37994                       target: true,
37995                       entity: way,
37996                       nodes: [start.node, end.node],
37997                       index: index
37998                   },
37999                   geometry: {
38000                       type: 'LineString',
38001                       coordinates: [start.node.loc, end.node.loc]
38002                   }
38003               });
38004           }
38005       }
38006   }
38007
38008   function svgGeolocate(projection) {
38009       var layer = select(null);
38010       var _position;
38011
38012
38013       function init() {
38014           if (svgGeolocate.initialized) return;  // run once
38015           svgGeolocate.enabled = false;
38016           svgGeolocate.initialized = true;
38017       }
38018
38019       function showLayer() {
38020           layer.style('display', 'block');
38021       }
38022
38023
38024       function hideLayer() {
38025           layer
38026               .transition()
38027               .duration(250)
38028               .style('opacity', 0);
38029       }
38030
38031       function layerOn() {
38032           layer
38033               .style('opacity', 0)
38034               .transition()
38035               .duration(250)
38036               .style('opacity', 1);
38037
38038       }
38039
38040       function layerOff() {
38041           layer.style('display', 'none');
38042       }
38043
38044       function transform(d) {
38045           return svgPointTransform(projection)(d);
38046       }
38047
38048       function accuracy(accuracy, loc) { // converts accuracy to pixels...
38049           var degreesRadius = geoMetersToLat(accuracy),
38050               tangentLoc = [loc[0], loc[1] + degreesRadius],
38051               projectedTangent = projection(tangentLoc),
38052               projectedLoc = projection([loc[0], loc[1]]);
38053
38054           // southern most point will have higher pixel value...
38055          return Math.round(projectedLoc[1] - projectedTangent[1]).toString();
38056       }
38057
38058       function update() {
38059           var geolocation = { loc: [_position.coords.longitude, _position.coords.latitude] };
38060
38061           var groups = layer.selectAll('.geolocations').selectAll('.geolocation')
38062               .data([geolocation]);
38063
38064           groups.exit()
38065               .remove();
38066
38067           var pointsEnter = groups.enter()
38068               .append('g')
38069               .attr('class', 'geolocation');
38070
38071           pointsEnter
38072               .append('circle')
38073               .attr('id', 'geolocate-radius')
38074               .attr('dx', '0')
38075               .attr('dy', '0')
38076               .attr('fill', 'rgb(15,128,225)')
38077               .attr('fill-opacity', '0.3')
38078               .attr('r', '0');
38079
38080           pointsEnter
38081               .append('circle')
38082               .attr('dx', '0')
38083               .attr('dy', '0')
38084               .attr('fill', 'rgb(15,128,225)')
38085               .attr('stroke', 'white')
38086               .attr('stroke-width', '1.5')
38087               .attr('r', '6');
38088
38089           groups.merge(pointsEnter)
38090               .attr('transform', transform);
38091
38092           select('#geolocate-radius').attr('r', accuracy(_position.coords.accuracy, geolocation.loc));
38093       }
38094
38095       function drawLocation(selection) {
38096           var enabled = svgGeolocate.enabled;
38097
38098           layer = selection.selectAll('.layer-geolocate')
38099               .data([0]);
38100
38101           layer.exit()
38102               .remove();
38103
38104           var layerEnter = layer.enter()
38105               .append('g')
38106               .attr('class', 'layer-geolocate')
38107               .style('display', enabled ? 'block' : 'none');
38108
38109           layerEnter
38110               .append('g')
38111               .attr('class', 'geolocations');
38112
38113           layer = layerEnter
38114               .merge(layer);
38115
38116           if (enabled) {
38117               update();
38118           } else {
38119               layerOff();
38120           }
38121       }
38122
38123       drawLocation.enabled = function (position, enabled) {
38124           if (!arguments.length) return svgGeolocate.enabled;
38125           _position = position;
38126           svgGeolocate.enabled = enabled;
38127           if (svgGeolocate.enabled) {
38128               showLayer();
38129               layerOn();
38130           } else {
38131               hideLayer();
38132           }
38133           return this;
38134       };
38135
38136       init();
38137       return drawLocation;
38138   }
38139
38140   function svgLabels(projection, context) {
38141       var path = d3_geoPath(projection);
38142       var detected = utilDetect();
38143       var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
38144       var _rdrawn = rbush_1();
38145       var _rskipped = rbush_1();
38146       var _textWidthCache = {};
38147       var _entitybboxes = {};
38148
38149       // Listed from highest to lowest priority
38150       var labelStack = [
38151           ['line', 'aeroway', '*', 12],
38152           ['line', 'highway', 'motorway', 12],
38153           ['line', 'highway', 'trunk', 12],
38154           ['line', 'highway', 'primary', 12],
38155           ['line', 'highway', 'secondary', 12],
38156           ['line', 'highway', 'tertiary', 12],
38157           ['line', 'highway', '*', 12],
38158           ['line', 'railway', '*', 12],
38159           ['line', 'waterway', '*', 12],
38160           ['area', 'aeroway', '*', 12],
38161           ['area', 'amenity', '*', 12],
38162           ['area', 'building', '*', 12],
38163           ['area', 'historic', '*', 12],
38164           ['area', 'leisure', '*', 12],
38165           ['area', 'man_made', '*', 12],
38166           ['area', 'natural', '*', 12],
38167           ['area', 'shop', '*', 12],
38168           ['area', 'tourism', '*', 12],
38169           ['area', 'camp_site', '*', 12],
38170           ['point', 'aeroway', '*', 10],
38171           ['point', 'amenity', '*', 10],
38172           ['point', 'building', '*', 10],
38173           ['point', 'historic', '*', 10],
38174           ['point', 'leisure', '*', 10],
38175           ['point', 'man_made', '*', 10],
38176           ['point', 'natural', '*', 10],
38177           ['point', 'shop', '*', 10],
38178           ['point', 'tourism', '*', 10],
38179           ['point', 'camp_site', '*', 10],
38180           ['line', 'name', '*', 12],
38181           ['area', 'name', '*', 12],
38182           ['point', 'name', '*', 10]
38183       ];
38184
38185
38186       function blacklisted(preset) {
38187           var noIcons = ['building', 'landuse', 'natural'];
38188           return some(noIcons, function(s) {
38189               return preset.id.indexOf(s) >= 0;
38190           });
38191       }
38192
38193
38194       function get(array, prop) {
38195           return function(d, i) { return array[i][prop]; };
38196       }
38197
38198
38199       function textWidth(text, size, elem) {
38200           var c = _textWidthCache[size];
38201           if (!c) c = _textWidthCache[size] = {};
38202
38203           if (c[text]) {
38204               return c[text];
38205
38206           } else if (elem) {
38207               c[text] = elem.getComputedTextLength();
38208               return c[text];
38209
38210           } else {
38211               var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
38212               if (str === null) {
38213                   return size / 3 * 2 * text.length;
38214               } else {
38215                   return size / 3 * (2 * text.length + str.length);
38216               }
38217           }
38218       }
38219
38220
38221       function drawLinePaths(selection, entities, filter, classes, labels) {
38222           var paths = selection.selectAll('path')
38223               .filter(filter)
38224               .data(entities, osmEntity.key);
38225
38226           // exit
38227           paths.exit()
38228               .remove();
38229
38230           // enter/update
38231           paths.enter()
38232               .append('path')
38233               .style('stroke-width', get(labels, 'font-size'))
38234               .attr('id', function(d) { return 'labelpath-' + d.id; })
38235               .attr('class', classes)
38236               .merge(paths)
38237               .attr('d', get(labels, 'lineString'));
38238       }
38239
38240
38241       function drawLineLabels(selection, entities, filter, classes, labels) {
38242           var texts = selection.selectAll('text.' + classes)
38243               .filter(filter)
38244               .data(entities, osmEntity.key);
38245
38246           // exit
38247           texts.exit()
38248               .remove();
38249
38250           // enter
38251           texts.enter()
38252               .append('text')
38253               .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
38254               .attr('dy', baselineHack ? '0.35em' : null)
38255               .append('textPath')
38256               .attr('class', 'textpath');
38257
38258           // update
38259           selection.selectAll('text.' + classes).selectAll('.textpath')
38260               .filter(filter)
38261               .data(entities, osmEntity.key)
38262               .attr('startOffset', '50%')
38263               .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
38264               .text(utilDisplayNameForPath);
38265       }
38266
38267
38268       function drawPointLabels(selection, entities, filter, classes, labels) {
38269           var texts = selection.selectAll('text.' + classes)
38270               .filter(filter)
38271               .data(entities, osmEntity.key);
38272
38273           // exit
38274           texts.exit()
38275               .remove();
38276
38277           // enter/update
38278           texts.enter()
38279               .append('text')
38280               .attr('class', function(d, i) {
38281                   return classes + ' ' + labels[i].classes + ' ' + d.id;
38282               })
38283               .merge(texts)
38284               .attr('x', get(labels, 'x'))
38285               .attr('y', get(labels, 'y'))
38286               .style('text-anchor', get(labels, 'textAnchor'))
38287               .text(utilDisplayName)
38288               .each(function(d, i) {
38289                   textWidth(utilDisplayName(d), labels[i].height, this);
38290               });
38291       }
38292
38293
38294       function drawAreaLabels(selection, entities, filter, classes, labels) {
38295           entities = entities.filter(hasText);
38296           labels = labels.filter(hasText);
38297           drawPointLabels(selection, entities, filter, classes, labels);
38298
38299           function hasText(d, i) {
38300               return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
38301           }
38302       }
38303
38304
38305       function drawAreaIcons(selection, entities, filter, classes, labels) {
38306           var icons = selection.selectAll('use.' + classes)
38307               .filter(filter)
38308               .data(entities, osmEntity.key);
38309
38310           // exit
38311           icons.exit()
38312               .remove();
38313
38314           // enter/update
38315           icons.enter()
38316               .append('use')
38317               .attr('class', 'icon ' + classes)
38318               .attr('width', '17px')
38319               .attr('height', '17px')
38320               .merge(icons)
38321               .attr('transform', get(labels, 'transform'))
38322               .attr('xlink:href', function(d) {
38323                   var preset = context.presets().match(d, context.graph());
38324                   var picon = preset && preset.icon;
38325
38326                   if (!picon) {
38327                       return '';
38328                   } else {
38329                       var isMaki = /^maki-/.test(picon);
38330                       return '#' + picon + (isMaki ? '-15' : '');
38331                   }
38332               });
38333       }
38334
38335
38336       function drawCollisionBoxes(selection, rtree, which) {
38337           var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
38338
38339           var gj = [];
38340           if (context.getDebug('collision')) {
38341               gj = rtree.all().map(function(d) {
38342                   return { type: 'Polygon', coordinates: [[
38343                       [d.minX, d.minY],
38344                       [d.maxX, d.minY],
38345                       [d.maxX, d.maxY],
38346                       [d.minX, d.maxY],
38347                       [d.minX, d.minY]
38348                   ]]};
38349               });
38350           }
38351
38352           var boxes = selection.selectAll('.' + which)
38353               .data(gj);
38354
38355           // exit
38356           boxes.exit()
38357               .remove();
38358
38359           // enter/update
38360           boxes.enter()
38361               .append('path')
38362               .attr('class', classes)
38363               .merge(boxes)
38364               .attr('d', d3_geoPath());
38365       }
38366
38367
38368       function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
38369           var wireframe = context.surface().classed('fill-wireframe');
38370           var zoom = geoScaleToZoom(projection.scale());
38371
38372           var labelable = [];
38373           var renderNodeAs = {};
38374           var i, j, k, entity, geometry;
38375
38376           for (i = 0; i < labelStack.length; i++) {
38377               labelable.push([]);
38378           }
38379
38380           if (fullRedraw) {
38381               _rdrawn.clear();
38382               _rskipped.clear();
38383               _entitybboxes = {};
38384
38385           } else {
38386               for (i = 0; i < entities.length; i++) {
38387                   entity = entities[i];
38388                   var toRemove = []
38389                       .concat(_entitybboxes[entity.id] || [])
38390                       .concat(_entitybboxes[entity.id + 'I'] || []);
38391
38392                   for (j = 0; j < toRemove.length; j++) {
38393                       _rdrawn.remove(toRemove[j]);
38394                       _rskipped.remove(toRemove[j]);
38395                   }
38396               }
38397           }
38398
38399           // Loop through all the entities to do some preprocessing
38400           for (i = 0; i < entities.length; i++) {
38401               entity = entities[i];
38402               geometry = entity.geometry(graph);
38403
38404               // Insert collision boxes around interesting points/vertices
38405               if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
38406                   var hasDirections = entity.directions(graph, projection).length;
38407                   var markerPadding;
38408
38409                   if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
38410                       renderNodeAs[entity.id] = 'point';
38411                       markerPadding = 20;   // extra y for marker height
38412                   } else {
38413                       renderNodeAs[entity.id] = 'vertex';
38414                       markerPadding = 0;
38415                   }
38416
38417                   var coord = projection(entity.loc);
38418                   var nodePadding = 10;
38419                   var bbox = {
38420                       minX: coord[0] - nodePadding,
38421                       minY: coord[1] - nodePadding - markerPadding,
38422                       maxX: coord[0] + nodePadding,
38423                       maxY: coord[1] + nodePadding
38424                   };
38425
38426                   doInsert(bbox, entity.id + 'P');
38427               }
38428
38429               // From here on, treat vertices like points
38430               if (geometry === 'vertex') {
38431                   geometry = 'point';
38432               }
38433
38434               // Determine which entities are label-able
38435               var preset = geometry === 'area' && context.presets().match(entity, graph);
38436               var icon = preset && !blacklisted(preset) && preset.icon;
38437
38438               if (!icon && !utilDisplayName(entity))
38439                   continue;
38440
38441               for (k = 0; k < labelStack.length; k++) {
38442                   var matchGeom = labelStack[k][0];
38443                   var matchKey = labelStack[k][1];
38444                   var matchVal = labelStack[k][2];
38445                   var hasVal = entity.tags[matchKey];
38446
38447                   if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
38448                       labelable[k].push(entity);
38449                       break;
38450                   }
38451               }
38452           }
38453
38454           var positions = {
38455               point: [],
38456               line: [],
38457               area: []
38458           };
38459
38460           var labelled = {
38461               point: [],
38462               line: [],
38463               area: []
38464           };
38465
38466           // Try and find a valid label for labellable entities
38467           for (k = 0; k < labelable.length; k++) {
38468               var fontSize = labelStack[k][3];
38469
38470               for (i = 0; i < labelable[k].length; i++) {
38471                   entity = labelable[k][i];
38472                   geometry = entity.geometry(graph);
38473
38474                   var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
38475                   var name = getName(entity);
38476                   var width = name && textWidth(name, fontSize);
38477                   var p = null;
38478
38479                   if (geometry === 'point' || geometry === 'vertex') {
38480                       // no point or vertex labels in wireframe mode
38481                       // no vertex labels at low zooms (vertices have no icons)
38482                       if (wireframe) continue;
38483                       var renderAs = renderNodeAs[entity.id];
38484                       if (renderAs === 'vertex' && zoom < 17) continue;
38485
38486                       p = getPointLabel(entity, width, fontSize, renderAs);
38487
38488                   } else if (geometry === 'line') {
38489                       p = getLineLabel(entity, width, fontSize);
38490
38491                   } else if (geometry === 'area') {
38492                       p = getAreaLabel(entity, width, fontSize);
38493                   }
38494
38495                   if (p) {
38496                       if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
38497                       p.classes = geometry + ' tag-' + labelStack[k][1];
38498                       positions[geometry].push(p);
38499                       labelled[geometry].push(entity);
38500                   }
38501               }
38502           }
38503
38504
38505           function isInterestingVertex(entity) {
38506               var selectedIDs = context.selectedIDs();
38507
38508               return entity.hasInterestingTags() ||
38509                   entity.isEndpoint(graph) ||
38510                   entity.isConnected(graph) ||
38511                   selectedIDs.indexOf(entity.id) !== -1 ||
38512                   some(graph.parentWays(entity), function(parent) {
38513                       return selectedIDs.indexOf(parent.id) !== -1;
38514                   });
38515           }
38516
38517
38518           function getPointLabel(entity, width, height, geometry) {
38519               var y = (geometry === 'point' ? -12 : 0);
38520               var pointOffsets = {
38521                   ltr: [15, y, 'start'],
38522                   rtl: [-15, y, 'end']
38523               };
38524
38525               var coord = projection(entity.loc);
38526               var textPadding = 2;
38527               var offset = pointOffsets[textDirection];
38528               var p = {
38529                   height: height,
38530                   width: width,
38531                   x: coord[0] + offset[0],
38532                   y: coord[1] + offset[1],
38533                   textAnchor: offset[2]
38534               };
38535
38536               // insert a collision box for the text label..
38537               var bbox;
38538               if (textDirection === 'rtl') {
38539                   bbox = {
38540                       minX: p.x - width - textPadding,
38541                       minY: p.y - (height / 2) - textPadding,
38542                       maxX: p.x + textPadding,
38543                       maxY: p.y + (height / 2) + textPadding
38544                   };
38545               } else {
38546                   bbox = {
38547                       minX: p.x - textPadding,
38548                       minY: p.y - (height / 2) - textPadding,
38549                       maxX: p.x + width + textPadding,
38550                       maxY: p.y + (height / 2) + textPadding
38551                   };
38552               }
38553
38554               if (tryInsert([bbox], entity.id, true)) {
38555                   return p;
38556               }
38557           }
38558
38559
38560           function getLineLabel(entity, width, height) {
38561               var viewport = geoExtent(context.projection.clipExtent()).polygon();
38562               var points = map$3(graph.childNodes(entity), 'loc').map(projection);
38563               var length = geoPathLength(points);
38564
38565               if (length < width + 20) return;
38566
38567               // todo: properly clip points to viewport
38568
38569               // % along the line to attempt to place the label
38570               var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
38571                                  25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
38572               var padding = 3;
38573
38574               for (var i = 0; i < lineOffsets.length; i++) {
38575                   var offset = lineOffsets[i];
38576                   var middle = offset / 100 * length;
38577                   var start = middle - width / 2;
38578
38579                   if (start < 0 || start + width > length) continue;
38580
38581                   // generate subpath and ignore paths that are invalid or don't cross viewport.
38582                   var sub = subpath(points, start, start + width);
38583                   if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
38584                       continue;
38585                   }
38586
38587                   var isReverse = reverse(sub);
38588                   if (isReverse) {
38589                       sub = sub.reverse();
38590                   }
38591
38592                   var bboxes = [];
38593                   var boxsize = (height + 2) / 2;
38594
38595                   for (var j = 0; j < sub.length - 1; j++) {
38596                       var a = sub[j];
38597                       var b = sub[j + 1];
38598
38599                       // split up the text into small collision boxes
38600                       var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
38601
38602                       for (var box = 0; box < num; box++) {
38603                           var p = geoVecInterp(a, b, box / num);
38604                           var x0 = p[0] - boxsize - padding;
38605                           var y0 = p[1] - boxsize - padding;
38606                           var x1 = p[0] + boxsize + padding;
38607                           var y1 = p[1] + boxsize + padding;
38608
38609                           bboxes.push({
38610                               minX: Math.min(x0, x1),
38611                               minY: Math.min(y0, y1),
38612                               maxX: Math.max(x0, x1),
38613                               maxY: Math.max(y0, y1)
38614                           });
38615                       }
38616                   }
38617
38618                   if (tryInsert(bboxes, entity.id, false)) {   // accept this one
38619                       return {
38620                           'font-size': height + 2,
38621                           lineString: lineString(sub),
38622                           startOffset: offset + '%'
38623                       };
38624                   }
38625               }
38626
38627               function reverse(p) {
38628                   var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
38629                   return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
38630               }
38631
38632               function lineString(points) {
38633                   return 'M' + points.join('L');
38634               }
38635
38636               function subpath(points, from, to) {
38637                   var sofar = 0;
38638                   var start, end, i0, i1;
38639
38640                   for (var i = 0; i < points.length - 1; i++) {
38641                       var a = points[i];
38642                       var b = points[i + 1];
38643                       var current = geoVecLength(a, b);
38644                       var portion;
38645                       if (!start && sofar + current >= from) {
38646                           portion = (from - sofar) / current;
38647                           start = [
38648                               a[0] + portion * (b[0] - a[0]),
38649                               a[1] + portion * (b[1] - a[1])
38650                           ];
38651                           i0 = i + 1;
38652                       }
38653                       if (!end && sofar + current >= to) {
38654                           portion = (to - sofar) / current;
38655                           end = [
38656                               a[0] + portion * (b[0] - a[0]),
38657                               a[1] + portion * (b[1] - a[1])
38658                           ];
38659                           i1 = i + 1;
38660                       }
38661                       sofar += current;
38662                   }
38663
38664                   var result = points.slice(i0, i1);
38665                   result.unshift(start);
38666                   result.push(end);
38667                   return result;
38668               }
38669           }
38670
38671
38672           function getAreaLabel(entity, width, height) {
38673               var centroid = path.centroid(entity.asGeoJSON(graph, true));
38674               var extent = entity.extent(graph);
38675               var areaWidth = projection(extent[1])[0] - projection(extent[0])[0];
38676
38677               if (isNaN(centroid[0]) || areaWidth < 20) return;
38678
38679               var preset = context.presets().match(entity, context.graph());
38680               var picon = preset && preset.icon;
38681               var iconSize = 17;
38682               var padding = 2;
38683               var p = {};
38684
38685               if (picon) {  // icon and label..
38686                   if (addIcon()) {
38687                       addLabel(iconSize + padding);
38688                       return p;
38689                   }
38690               } else {   // label only..
38691                   if (addLabel(0)) {
38692                       return p;
38693                   }
38694               }
38695
38696
38697               function addIcon() {
38698                   var iconX = centroid[0] - (iconSize / 2);
38699                   var iconY = centroid[1] - (iconSize / 2);
38700                   var bbox = {
38701                       minX: iconX,
38702                       minY: iconY,
38703                       maxX: iconX + iconSize,
38704                       maxY: iconY + iconSize
38705                   };
38706
38707                   if (tryInsert([bbox], entity.id + 'I', true)) {
38708                       p.transform = 'translate(' + iconX + ',' + iconY + ')';
38709                       return true;
38710                   }
38711                   return false;
38712               }
38713
38714               function addLabel(yOffset) {
38715                   if (width && areaWidth >= width + 20) {
38716                       var labelX = centroid[0];
38717                       var labelY = centroid[1] + yOffset;
38718                       var bbox = {
38719                           minX: labelX - (width / 2) - padding,
38720                           minY: labelY - (height / 2) - padding,
38721                           maxX: labelX + (width / 2) + padding,
38722                           maxY: labelY + (height / 2) + padding
38723                       };
38724
38725                       if (tryInsert([bbox], entity.id, true)) {
38726                           p.x = labelX;
38727                           p.y = labelY;
38728                           p.textAnchor = 'middle';
38729                           p.height = height;
38730                           return true;
38731                       }
38732                   }
38733                   return false;
38734               }
38735           }
38736
38737
38738           // force insert a singular bounding box
38739           // singular box only, no array, id better be unique
38740           function doInsert(bbox, id) {
38741               bbox.id = id;
38742
38743               var oldbox = _entitybboxes[id];
38744               if (oldbox) {
38745                   _rdrawn.remove(oldbox);
38746               }
38747               _entitybboxes[id] = bbox;
38748               _rdrawn.insert(bbox);
38749           }
38750
38751
38752           function tryInsert(bboxes, id, saveSkipped) {
38753               var skipped = false;
38754
38755               for (var i = 0; i < bboxes.length; i++) {
38756                   var bbox = bboxes[i];
38757                   bbox.id = id;
38758
38759                   // Check that label is visible
38760                   if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
38761                       skipped = true;
38762                       break;
38763                   }
38764                   if (_rdrawn.collides(bbox)) {
38765                       skipped = true;
38766                       break;
38767                   }
38768               }
38769
38770               _entitybboxes[id] = bboxes;
38771
38772               if (skipped) {
38773                   if (saveSkipped) {
38774                       _rskipped.load(bboxes);
38775                   }
38776               } else {
38777                   _rdrawn.load(bboxes);
38778               }
38779
38780               return !skipped;
38781           }
38782
38783
38784           var layer = selection.selectAll('.layer-osm.labels');
38785           layer.selectAll('.labels-group')
38786               .data(['halo', 'label', 'debug'])
38787               .enter()
38788               .append('g')
38789               .attr('class', function(d) { return 'labels-group ' + d; });
38790
38791           var halo = layer.selectAll('.labels-group.halo');
38792           var label = layer.selectAll('.labels-group.label');
38793           var debug = layer.selectAll('.labels-group.debug');
38794
38795           // points
38796           drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
38797           drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
38798
38799           // lines
38800           drawLinePaths(layer, labelled.line, filter, '', positions.line);
38801           drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
38802           drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
38803
38804           // areas
38805           drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
38806           drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
38807           drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
38808           drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
38809
38810           // debug
38811           drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
38812           drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
38813
38814           layer.call(filterLabels);
38815       }
38816
38817
38818       function filterLabels(selection) {
38819           var drawLayer = selection.selectAll('.layer-osm.labels');
38820           var layers = drawLayer.selectAll('.labels-group.halo, .labels-group.label');
38821
38822           layers.selectAll('.nolabel')
38823               .classed('nolabel', false);
38824
38825           var mouse = context.mouse();
38826           var graph = context.graph();
38827           var selectedIDs = context.selectedIDs();
38828           var ids = [];
38829           var pad, bbox;
38830
38831           // hide labels near the mouse
38832           if (mouse) {
38833               pad = 20;
38834               bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
38835               ids.push.apply(ids, map$3(_rdrawn.search(bbox), 'id'));
38836           }
38837
38838           // hide labels on selected nodes (they look weird when dragging / haloed)
38839           for (var i = 0; i < selectedIDs.length; i++) {
38840               var entity = graph.hasEntity(selectedIDs[i]);
38841               if (entity && entity.type === 'node') {
38842                   ids.push(selectedIDs[i]);
38843               }
38844           }
38845
38846           layers.selectAll(utilEntitySelector(ids))
38847               .classed('nolabel', true);
38848
38849
38850           // draw the mouse bbox if debugging is on..
38851           var debug = selection.selectAll('.labels-group.debug');
38852           var gj = [];
38853           if (context.getDebug('collision')) {
38854               gj = bbox ? [{
38855                   type: 'Polygon',
38856                   coordinates: [[
38857                       [bbox.minX, bbox.minY],
38858                       [bbox.maxX, bbox.minY],
38859                       [bbox.maxX, bbox.maxY],
38860                       [bbox.minX, bbox.maxY],
38861                       [bbox.minX, bbox.minY]
38862                   ]]
38863               }] : [];
38864           }
38865
38866           var box = debug.selectAll('.debug-mouse')
38867               .data(gj);
38868
38869           // exit
38870           box.exit()
38871               .remove();
38872
38873           // enter/update
38874           box.enter()
38875               .append('path')
38876               .attr('class', 'debug debug-mouse yellow')
38877               .merge(box)
38878               .attr('d', d3_geoPath());
38879       }
38880
38881
38882       var throttleFilterLabels = throttle(utilCallWhenIdle(filterLabels), 100);
38883
38884
38885       drawLabels.observe = function(selection) {
38886           var listener = function() { throttleFilterLabels(selection); };
38887           selection.on('mousemove.hidelabels', listener);
38888           context.on('enter.hidelabels', listener);
38889       };
38890
38891
38892       drawLabels.off = function(selection) {
38893           throttleFilterLabels.cancel();
38894           selection.on('mousemove.hidelabels', null);
38895           context.on('enter.hidelabels', null);
38896       };
38897
38898
38899       return drawLabels;
38900   }
38901
38902   var _improveOsmEnabled = false;
38903   var _errorService;
38904
38905
38906   function svgImproveOSM(projection, context, dispatch) {
38907       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
38908       var minZoom = 12;
38909       var touchLayer = select(null);
38910       var drawLayer = select(null);
38911       var _improveOsmVisible = false;
38912
38913       function markerPath(selection, klass) {
38914           selection
38915               .attr('class', klass)
38916               .attr('transform', 'translate(-10, -28)')
38917               .attr('points', '16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6');
38918       }
38919
38920
38921       // Loosely-coupled improveOSM service for fetching errors.
38922       function getService() {
38923           if (services.improveOSM && !_errorService) {
38924               _errorService = services.improveOSM;
38925               _errorService.on('loaded', throttledRedraw);
38926           } else if (!services.improveOSM && _errorService) {
38927               _errorService = null;
38928           }
38929
38930           return _errorService;
38931       }
38932
38933
38934       // Show the errors
38935       function editOn() {
38936           if (!_improveOsmVisible) {
38937               _improveOsmVisible = true;
38938               drawLayer
38939                   .style('display', 'block');
38940           }
38941       }
38942
38943
38944       // Immediately remove the errors and their touch targets
38945       function editOff() {
38946           if (_improveOsmVisible) {
38947               _improveOsmVisible = false;
38948               drawLayer
38949                   .style('display', 'none');
38950               drawLayer.selectAll('.qa_error.improveOSM')
38951                   .remove();
38952               touchLayer.selectAll('.qa_error.improveOSM')
38953                   .remove();
38954           }
38955       }
38956
38957
38958       // Enable the layer.  This shows the errors and transitions them to visible.
38959       function layerOn() {
38960           editOn();
38961
38962           drawLayer
38963               .style('opacity', 0)
38964               .transition()
38965               .duration(250)
38966               .style('opacity', 1)
38967               .on('end interrupt', function () {
38968                   dispatch.call('change');
38969               });
38970       }
38971
38972
38973       // Disable the layer.  This transitions the layer invisible and then hides the errors.
38974       function layerOff() {
38975           throttledRedraw.cancel();
38976           drawLayer.interrupt();
38977           touchLayer.selectAll('.qa_error.improveOSM')
38978               .remove();
38979
38980           drawLayer
38981               .transition()
38982               .duration(250)
38983               .style('opacity', 0)
38984               .on('end interrupt', function () {
38985                   editOff();
38986                   dispatch.call('change');
38987               });
38988       }
38989
38990
38991       // Update the error markers
38992       function updateMarkers() {
38993           if (!_improveOsmVisible || !_improveOsmEnabled) return;
38994
38995           var service = getService();
38996           var selectedID = context.selectedErrorID();
38997           var data = (service ? service.getErrors(projection) : []);
38998           var getTransform = svgPointTransform(projection);
38999
39000           // Draw markers..
39001           var markers = drawLayer.selectAll('.qa_error.improveOSM')
39002               .data(data, function(d) { return d.id; });
39003
39004           // exit
39005           markers.exit()
39006               .remove();
39007
39008           // enter
39009           var markersEnter = markers.enter()
39010               .append('g')
39011               .attr('class', function(d) {
39012                   return [
39013                       'qa_error',
39014                       d.service,
39015                       'error_id-' + d.id,
39016                       'error_type-' + d.error_type,
39017                       'category-' + d.category
39018                   ].join(' ');
39019               });
39020
39021           markersEnter
39022               .append('polygon')
39023               .call(markerPath, 'shadow');
39024
39025           markersEnter
39026               .append('ellipse')
39027               .attr('cx', 0)
39028               .attr('cy', 0)
39029               .attr('rx', 4.5)
39030               .attr('ry', 2)
39031               .attr('class', 'stroke');
39032
39033           markersEnter
39034               .append('polygon')
39035               .attr('fill', 'currentColor')
39036               .call(markerPath, 'qa_error-fill');
39037
39038           markersEnter
39039               .append('use')
39040               .attr('transform', 'translate(-5.5, -21)')
39041               .attr('class', 'icon-annotation')
39042               .attr('width', '11px')
39043               .attr('height', '11px')
39044               .attr('xlink:href', function(d) {
39045                   var picon = d.icon;
39046
39047                   if (!picon) {
39048                       return '';
39049                   } else {
39050                       var isMaki = /^maki-/.test(picon);
39051                       return '#' + picon + (isMaki ? '-11' : '');
39052                   }
39053               });
39054
39055           // update
39056           markers
39057               .merge(markersEnter)
39058               .sort(sortY)
39059               .classed('selected', function(d) { return d.id === selectedID; })
39060               .attr('transform', getTransform);
39061
39062
39063           // Draw targets..
39064           if (touchLayer.empty()) return;
39065           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
39066
39067           var targets = touchLayer.selectAll('.qa_error.improveOSM')
39068               .data(data, function(d) { return d.id; });
39069
39070           // exit
39071           targets.exit()
39072               .remove();
39073
39074           // enter/update
39075           targets.enter()
39076               .append('rect')
39077               .attr('width', '20px')
39078               .attr('height', '30px')
39079               .attr('x', '-10px')
39080               .attr('y', '-28px')
39081               .merge(targets)
39082               .sort(sortY)
39083               .attr('class', function(d) {
39084                   return 'qa_error ' + d.service + ' target error_id-' + d.id + ' ' + fillClass;
39085               })
39086               .attr('transform', getTransform);
39087
39088
39089           function sortY(a, b) {
39090               return (a.id === selectedID) ? 1
39091                   : (b.id === selectedID) ? -1
39092                   : b.loc[1] - a.loc[1];
39093           }
39094       }
39095
39096
39097       // Draw the ImproveOSM layer and schedule loading errors and updating markers.
39098       function drawImproveOSM(selection) {
39099           var service = getService();
39100
39101           var surface = context.surface();
39102           if (surface && !surface.empty()) {
39103               touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
39104           }
39105
39106           drawLayer = selection.selectAll('.layer-improveOSM')
39107               .data(service ? [0] : []);
39108
39109           drawLayer.exit()
39110               .remove();
39111
39112           drawLayer = drawLayer.enter()
39113               .append('g')
39114               .attr('class', 'layer-improveOSM')
39115               .style('display', _improveOsmEnabled ? 'block' : 'none')
39116               .merge(drawLayer);
39117
39118           if (_improveOsmEnabled) {
39119               if (service && ~~context.map().zoom() >= minZoom) {
39120                   editOn();
39121                   service.loadErrors(projection);
39122                   updateMarkers();
39123               } else {
39124                   editOff();
39125               }
39126           }
39127       }
39128
39129
39130       // Toggles the layer on and off
39131       drawImproveOSM.enabled = function(val) {
39132           if (!arguments.length) return _improveOsmEnabled;
39133
39134           _improveOsmEnabled = val;
39135           if (_improveOsmEnabled) {
39136               layerOn();
39137           } else {
39138               layerOff();
39139               if (context.selectedErrorID()) {
39140                   context.enter(modeBrowse(context));
39141               }
39142           }
39143
39144           dispatch.call('change');
39145           return this;
39146       };
39147
39148
39149       drawImproveOSM.supported = function() {
39150           return !!getService();
39151       };
39152
39153
39154       return drawImproveOSM;
39155   }
39156
39157   function svgStreetside(projection, context, dispatch) {
39158       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
39159       var minZoom = 14;
39160       var minMarkerZoom = 16;
39161       var minViewfieldZoom = 18;
39162       var layer = select(null);
39163       var _viewerYaw = 0;
39164       var _selectedSequence = null;
39165       var _streetside;
39166
39167       /**
39168        * init().
39169        */
39170       function init() {
39171           if (svgStreetside.initialized) return;  // run once
39172           svgStreetside.enabled = false;
39173           svgStreetside.initialized = true;
39174       }
39175
39176       /**
39177        * getService().
39178        */
39179       function getService() {
39180           if (services.streetside && !_streetside) {
39181               _streetside = services.streetside;
39182               _streetside.event
39183                   .on('viewerChanged', viewerChanged)
39184                   .on('loadedBubbles', throttledRedraw);
39185           } else if (!services.streetside && _streetside) {
39186               _streetside = null;
39187           }
39188
39189           return _streetside;
39190       }
39191
39192       /**
39193        * showLayer().
39194        */
39195       function showLayer() {
39196           var service = getService();
39197           if (!service) return;
39198
39199           service.loadViewer(context);
39200           editOn();
39201
39202           layer
39203               .style('opacity', 0)
39204               .transition()
39205               .duration(250)
39206               .style('opacity', 1)
39207               .on('end', function () { dispatch.call('change'); });
39208       }
39209
39210       /**
39211        * hideLayer().
39212        */
39213       function hideLayer() {
39214           throttledRedraw.cancel();
39215
39216           layer
39217               .transition()
39218               .duration(250)
39219               .style('opacity', 0)
39220               .on('end', editOff);
39221       }
39222
39223       /**
39224        * editOn().
39225        */
39226       function editOn() {
39227           layer.style('display', 'block');
39228       }
39229
39230       /**
39231        * editOff().
39232        */
39233       function editOff() {
39234           layer.selectAll('.viewfield-group').remove();
39235           layer.style('display', 'none');
39236       }
39237
39238       /**
39239        * click() Handles 'bubble' point click event.
39240        */
39241       function click(d) {
39242           var service = getService();
39243           if (!service) return;
39244
39245           // try to preserve the viewer rotation when staying on the same sequence
39246           if (d.sequenceKey !== _selectedSequence) {
39247               _viewerYaw = 0;  // reset
39248           }
39249           _selectedSequence = d.sequenceKey;
39250
39251           service
39252               .selectImage(d)
39253               .then(function(r) {
39254                   if (r.status === 'ok'){
39255                       service.showViewer(_viewerYaw);
39256                   }
39257               });
39258
39259
39260           context.map().centerEase(d.loc);
39261       }
39262
39263       /**
39264        * mouseover().
39265        */
39266       function mouseover(d) {
39267           var service = getService();
39268           if (service) service.setStyles(d);
39269       }
39270
39271       /**
39272        * mouseout().
39273        */
39274       function mouseout() {
39275           var service = getService();
39276           if (service) service.setStyles(null);
39277       }
39278
39279       /**
39280        * transform().
39281        */
39282       function transform(d) {
39283           var t = svgPointTransform(projection)(d);
39284           var rot = d.ca + _viewerYaw;
39285           if (rot) {
39286               t += ' rotate(' + Math.floor(rot) + ',0,0)';
39287           }
39288           return t;
39289       }
39290
39291
39292       function viewerChanged() {
39293           var service = getService();
39294           if (!service) return;
39295
39296           var viewer = service.viewer();
39297           if (!viewer) return;
39298
39299           // update viewfield rotation
39300           _viewerYaw = viewer.getYaw();
39301
39302           // avoid updating if the map is currently transformed
39303           // e.g. during drags or easing.
39304           if (context.map().isTransformed()) return;
39305
39306           layer.selectAll('.viewfield-group.currentView')
39307               .attr('transform', transform);
39308       }
39309
39310
39311       /**
39312        * update().
39313        */
39314       function update() {
39315           var viewer = select('#photoviewer');
39316           var selected = viewer.empty() ? undefined : viewer.datum();
39317           var z = ~~context.map().zoom();
39318           var showMarkers = (z >= minMarkerZoom);
39319           var showViewfields = (z >= minViewfieldZoom);
39320           var service = getService();
39321
39322           var sequences = (service ? service.sequences(projection) : []);
39323           var bubbles = (service && showMarkers ? service.bubbles(projection) : []);
39324
39325           var traces = layer.selectAll('.sequences').selectAll('.sequence')
39326               .data(sequences, function(d) { return d.properties.key; });
39327
39328           // exit
39329           traces.exit()
39330               .remove();
39331
39332           // enter/update
39333           traces = traces.enter()
39334               .append('path')
39335               .attr('class', 'sequence')
39336               .merge(traces)
39337               .attr('d', svgPath(projection).geojson);
39338
39339
39340           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
39341               .data(bubbles, function(d) {
39342                   // force reenter once bubbles are attached to a sequence
39343                   return d.key + (d.sequenceKey ? 'v1' : 'v0');
39344               });
39345
39346           // exit
39347           groups.exit()
39348               .remove();
39349
39350           // enter
39351           var groupsEnter = groups.enter()
39352               .append('g')
39353               .attr('class', 'viewfield-group')
39354               .on('mouseenter', mouseover)
39355               .on('mouseleave', mouseout)
39356               .on('click', click);
39357
39358           groupsEnter
39359               .append('g')
39360               .attr('class', 'viewfield-scale');
39361
39362           // update
39363           var markers = groups
39364               .merge(groupsEnter)
39365               .sort(function(a, b) {
39366                   return (a === selected) ? 1
39367                       : (b === selected) ? -1
39368                       : b.loc[1] - a.loc[1];
39369               })
39370               .attr('transform', transform)
39371               .select('.viewfield-scale');
39372
39373
39374           markers.selectAll('circle')
39375               .data([0])
39376               .enter()
39377               .append('circle')
39378               .attr('dx', '0')
39379               .attr('dy', '0')
39380               .attr('r', '6');
39381
39382           var viewfields = markers.selectAll('.viewfield')
39383               .data(showViewfields ? [0] : []);
39384
39385           viewfields.exit()
39386               .remove();
39387
39388           // viewfields may or may not be drawn...
39389           // but if they are, draw below the circles
39390           viewfields.enter()
39391               .insert('path', 'circle')
39392               .attr('class', 'viewfield')
39393               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
39394               .attr('d', viewfieldPath);
39395
39396           function viewfieldPath() {
39397               var d = this.parentNode.__data__;
39398               if (d.pano) {
39399                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
39400               } else {
39401                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
39402               }
39403           }
39404
39405       }
39406
39407       /**
39408        * drawImages()
39409        * drawImages is the method that is returned (and that runs) everytime 'svgStreetside()' is called.
39410        * 'svgStreetside()' is called from index.js
39411        */
39412       function drawImages(selection) {
39413           var enabled = svgStreetside.enabled;
39414           var service = getService();
39415
39416           layer = selection.selectAll('.layer-streetside-images')
39417               .data(service ? [0] : []);
39418
39419           layer.exit()
39420               .remove();
39421
39422           var layerEnter = layer.enter()
39423               .append('g')
39424               .attr('class', 'layer-streetside-images')
39425               .style('display', enabled ? 'block' : 'none');
39426
39427           layerEnter
39428               .append('g')
39429               .attr('class', 'sequences');
39430
39431           layerEnter
39432               .append('g')
39433               .attr('class', 'markers');
39434
39435           layer = layerEnter
39436               .merge(layer);
39437
39438           if (enabled) {
39439               if (service && ~~context.map().zoom() >= minZoom) {
39440                   editOn();
39441                   update();
39442                   service.loadBubbles(projection);
39443               } else {
39444                   editOff();
39445               }
39446           }
39447       }
39448
39449
39450       /**
39451        * drawImages.enabled().
39452        */
39453       drawImages.enabled = function(_) {
39454           if (!arguments.length) return svgStreetside.enabled;
39455           svgStreetside.enabled = _;
39456           if (svgStreetside.enabled) {
39457               showLayer();
39458           } else {
39459               hideLayer();
39460           }
39461           dispatch.call('change');
39462           return this;
39463       };
39464
39465       /**
39466        * drawImages.supported().
39467        */
39468       drawImages.supported = function() {
39469           return !!getService();
39470       };
39471
39472       init();
39473
39474       return drawImages;
39475   }
39476
39477   function svgMapillaryImages(projection, context, dispatch) {
39478       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
39479       var minZoom = 12;
39480       var minMarkerZoom = 16;
39481       var minViewfieldZoom = 18;
39482       var layer = select(null);
39483       var _mapillary;
39484       var viewerCompassAngle;
39485
39486
39487       function init() {
39488           if (svgMapillaryImages.initialized) return;  // run once
39489           svgMapillaryImages.enabled = false;
39490           svgMapillaryImages.initialized = true;
39491       }
39492
39493
39494       function getService() {
39495           if (services.mapillary && !_mapillary) {
39496               _mapillary = services.mapillary;
39497               _mapillary.event.on('loadedImages', throttledRedraw);
39498               _mapillary.event.on('bearingChanged', function(e) {
39499                   viewerCompassAngle = e;
39500
39501                   // avoid updating if the map is currently transformed
39502                   // e.g. during drags or easing.
39503                   if (context.map().isTransformed()) return;
39504
39505                   layer.selectAll('.viewfield-group.currentView')
39506                       .filter(function(d) {
39507                           return d.pano;
39508                       })
39509                       .attr('transform', transform);
39510               });
39511           } else if (!services.mapillary && _mapillary) {
39512               _mapillary = null;
39513           }
39514
39515           return _mapillary;
39516       }
39517
39518
39519       function showLayer() {
39520           var service = getService();
39521           if (!service) return;
39522
39523           service.loadViewer(context);
39524           editOn();
39525
39526           layer
39527               .style('opacity', 0)
39528               .transition()
39529               .duration(250)
39530               .style('opacity', 1)
39531               .on('end', function () { dispatch.call('change'); });
39532       }
39533
39534
39535       function hideLayer() {
39536           throttledRedraw.cancel();
39537
39538           layer
39539               .transition()
39540               .duration(250)
39541               .style('opacity', 0)
39542               .on('end', editOff);
39543       }
39544
39545
39546       function editOn() {
39547           layer.style('display', 'block');
39548       }
39549
39550
39551       function editOff() {
39552           layer.selectAll('.viewfield-group').remove();
39553           layer.style('display', 'none');
39554       }
39555
39556
39557       function click(d) {
39558           var service = getService();
39559           if (!service) return;
39560
39561           service
39562               .selectImage(d)
39563               .updateViewer(d.key, context)
39564               .showViewer();
39565
39566           context.map().centerEase(d.loc);
39567       }
39568
39569
39570       function mouseover(d) {
39571           var service = getService();
39572           if (service) service.setStyles(d);
39573       }
39574
39575
39576       function mouseout() {
39577           var service = getService();
39578           if (service) service.setStyles(null);
39579       }
39580
39581
39582       function transform(d) {
39583           var t = svgPointTransform(projection)(d);
39584           if (d.pano && isNumber(viewerCompassAngle)) {
39585               t += ' rotate(' + Math.floor(viewerCompassAngle) + ',0,0)';
39586           } else if (d.ca) {
39587               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
39588           }
39589           return t;
39590       }
39591
39592
39593       function update() {
39594           var viewer = select('#photoviewer');
39595           var selected = viewer.empty() ? undefined : viewer.datum();
39596
39597           var z = ~~context.map().zoom();
39598           var showMarkers = (z >= minMarkerZoom);
39599           var showViewfields = (z >= minViewfieldZoom);
39600
39601           var service = getService();
39602           var sequences = (service ? service.sequences(projection) : []);
39603           var images = (service && showMarkers ? service.images(projection) : []);
39604
39605           var traces = layer.selectAll('.sequences').selectAll('.sequence')
39606               .data(sequences, function(d) { return d.properties.key; });
39607
39608           // exit
39609           traces.exit()
39610               .remove();
39611
39612           // enter/update
39613           traces = traces.enter()
39614               .append('path')
39615               .attr('class', 'sequence')
39616               .merge(traces)
39617               .attr('d', svgPath(projection).geojson);
39618
39619
39620           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
39621               .data(images, function(d) { return d.key; });
39622
39623           // exit
39624           groups.exit()
39625               .remove();
39626
39627           // enter
39628           var groupsEnter = groups.enter()
39629               .append('g')
39630               .attr('class', 'viewfield-group')
39631               .on('mouseenter', mouseover)
39632               .on('mouseleave', mouseout)
39633               .on('click', click);
39634
39635           groupsEnter
39636               .append('g')
39637               .attr('class', 'viewfield-scale');
39638
39639           // update
39640           var markers = groups
39641               .merge(groupsEnter)
39642               .sort(function(a, b) {
39643                   return (a === selected) ? 1
39644                       : (b === selected) ? -1
39645                       : b.loc[1] - a.loc[1];  // sort Y
39646               })
39647               .attr('transform', transform)
39648               .select('.viewfield-scale');
39649
39650
39651           markers.selectAll('circle')
39652               .data([0])
39653               .enter()
39654               .append('circle')
39655               .attr('dx', '0')
39656               .attr('dy', '0')
39657               .attr('r', '6');
39658
39659           var viewfields = markers.selectAll('.viewfield')
39660               .data(showViewfields ? [0] : []);
39661
39662           viewfields.exit()
39663               .remove();
39664
39665           viewfields.enter()               // viewfields may or may not be drawn...
39666               .insert('path', 'circle')    // but if they are, draw below the circles
39667               .attr('class', 'viewfield')
39668               .classed('pano', function() { return this.parentNode.__data__.pano; })
39669               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
39670               .attr('d', viewfieldPath);
39671
39672           function viewfieldPath() {
39673               var d = this.parentNode.__data__;
39674               if (d.pano) {
39675                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
39676               } else {
39677                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
39678               }
39679           }
39680       }
39681
39682
39683       function drawImages(selection) {
39684           var enabled = svgMapillaryImages.enabled;
39685           var service = getService();
39686
39687           layer = selection.selectAll('.layer-mapillary-images')
39688               .data(service ? [0] : []);
39689
39690           layer.exit()
39691               .remove();
39692
39693           var layerEnter = layer.enter()
39694               .append('g')
39695               .attr('class', 'layer-mapillary-images')
39696               .style('display', enabled ? 'block' : 'none');
39697
39698           layerEnter
39699               .append('g')
39700               .attr('class', 'sequences');
39701
39702           layerEnter
39703               .append('g')
39704               .attr('class', 'markers');
39705
39706           layer = layerEnter
39707               .merge(layer);
39708
39709           if (enabled) {
39710               if (service && ~~context.map().zoom() >= minZoom) {
39711                   editOn();
39712                   update();
39713                   service.loadImages(projection);
39714               } else {
39715                   editOff();
39716               }
39717           }
39718       }
39719
39720
39721       drawImages.enabled = function(_) {
39722           if (!arguments.length) return svgMapillaryImages.enabled;
39723           svgMapillaryImages.enabled = _;
39724           if (svgMapillaryImages.enabled) {
39725               showLayer();
39726           } else {
39727               hideLayer();
39728           }
39729           dispatch.call('change');
39730           return this;
39731       };
39732
39733
39734       drawImages.supported = function() {
39735           return !!getService();
39736       };
39737
39738
39739       init();
39740       return drawImages;
39741   }
39742
39743   function svgMapillarySigns(projection, context, dispatch) {
39744       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
39745       var minZoom = 12;
39746       var layer = select(null);
39747       var _mapillary;
39748
39749
39750       function init() {
39751           if (svgMapillarySigns.initialized) return;  // run once
39752           svgMapillarySigns.enabled = false;
39753           svgMapillarySigns.initialized = true;
39754       }
39755
39756
39757       function getService() {
39758           if (services.mapillary && !_mapillary) {
39759               _mapillary = services.mapillary;
39760               _mapillary.event.on('loadedSigns', throttledRedraw);
39761           } else if (!services.mapillary && _mapillary) {
39762               _mapillary = null;
39763           }
39764           return _mapillary;
39765       }
39766
39767
39768       function showLayer() {
39769           var service = getService();
39770           if (!service) return;
39771
39772           service.loadViewer(context);
39773           editOn();
39774       }
39775
39776
39777       function hideLayer() {
39778           throttledRedraw.cancel();
39779           editOff();
39780       }
39781
39782
39783       function editOn() {
39784           layer.style('display', 'block');
39785       }
39786
39787
39788       function editOff() {
39789           layer.selectAll('.icon-sign').remove();
39790           layer.style('display', 'none');
39791       }
39792
39793
39794       function click(d) {
39795           var service = getService();
39796           if (!service) return;
39797
39798           context.map().centerEase(d.loc);
39799
39800           var selected = service.getSelectedImage();
39801           var selectedImageKey = selected && selected.key;
39802           var imageKey;
39803
39804           // Pick one of the images the sign was detected in,
39805           // preference given to an image already selected.
39806           d.detections.forEach(function(detection) {
39807               if (!imageKey || selectedImageKey === detection.image_key) {
39808                   imageKey = detection.image_key;
39809               }
39810           });
39811
39812           service
39813               .selectImage(null, imageKey)
39814               .updateViewer(imageKey, context)
39815               .showViewer();
39816       }
39817
39818
39819       function update() {
39820           var service = getService();
39821           var data = (service ? service.signs(projection) : []);
39822           var viewer = select('#photoviewer');
39823           var selected = viewer.empty() ? undefined : viewer.datum();
39824           var selectedImageKey = selected && selected.key;
39825           var transform = svgPointTransform(projection);
39826
39827           var signs = layer.selectAll('.icon-sign')
39828               .data(data, function(d) { return d.key; });
39829
39830           // exit
39831           signs.exit()
39832               .remove();
39833
39834           // enter
39835           var enter = signs.enter()
39836               .append('use')
39837               .attr('class', 'icon-sign')
39838               .attr('width', '24px')
39839               .attr('height', '24px')
39840               .attr('x', '-12px')
39841               .attr('y', '-12px')
39842               .attr('xlink:href', function(d) { return '#' + d.value; })
39843               .classed('currentView', function(d) {
39844                   return some(d.detections, function(detection) {
39845                       return detection.image_key === selectedImageKey;
39846                   });
39847               })
39848               .on('click', click);
39849
39850           // update
39851           signs
39852               .merge(enter)
39853               .sort(function(a, b) {
39854                   return (a === selected) ? 1
39855                       : (b === selected) ? -1
39856                       : b.loc[1] - a.loc[1];  // sort Y
39857               })
39858               .attr('transform', transform);
39859       }
39860
39861
39862       function drawSigns(selection) {
39863           var enabled = svgMapillarySigns.enabled;
39864           var service = getService();
39865
39866           layer = selection.selectAll('.layer-mapillary-signs')
39867               .data(service ? [0] : []);
39868
39869           layer.exit()
39870               .remove();
39871
39872           layer = layer.enter()
39873               .append('g')
39874               .attr('class', 'layer-mapillary-signs')
39875               .style('display', enabled ? 'block' : 'none')
39876               .merge(layer);
39877
39878           if (enabled) {
39879               if (service && ~~context.map().zoom() >= minZoom) {
39880                   editOn();
39881                   update();
39882                   service.loadSigns(context, projection);
39883               } else {
39884                   editOff();
39885               }
39886           }
39887       }
39888
39889
39890       drawSigns.enabled = function(_) {
39891           if (!arguments.length) return svgMapillarySigns.enabled;
39892           svgMapillarySigns.enabled = _;
39893           if (svgMapillarySigns.enabled) {
39894               showLayer();
39895           } else {
39896               hideLayer();
39897           }
39898           dispatch.call('change');
39899           return this;
39900       };
39901
39902
39903       drawSigns.supported = function() {
39904           return !!getService();
39905       };
39906
39907
39908       init();
39909       return drawSigns;
39910   }
39911
39912   function svgOpenstreetcamImages(projection, context, dispatch) {
39913       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
39914       var minZoom = 12;
39915       var minMarkerZoom = 16;
39916       var minViewfieldZoom = 18;
39917       var layer = select(null);
39918       var _openstreetcam;
39919
39920
39921       function init() {
39922           if (svgOpenstreetcamImages.initialized) return;  // run once
39923           svgOpenstreetcamImages.enabled = false;
39924           svgOpenstreetcamImages.initialized = true;
39925       }
39926
39927
39928       function getService() {
39929           if (services.openstreetcam && !_openstreetcam) {
39930               _openstreetcam = services.openstreetcam;
39931               _openstreetcam.event.on('loadedImages', throttledRedraw);
39932           } else if (!services.openstreetcam && _openstreetcam) {
39933               _openstreetcam = null;
39934           }
39935
39936           return _openstreetcam;
39937       }
39938
39939
39940       function showLayer() {
39941           var service = getService();
39942           if (!service) return;
39943
39944           service.loadViewer(context);
39945           editOn();
39946
39947           layer
39948               .style('opacity', 0)
39949               .transition()
39950               .duration(250)
39951               .style('opacity', 1)
39952               .on('end', function () { dispatch.call('change'); });
39953       }
39954
39955
39956       function hideLayer() {
39957           throttledRedraw.cancel();
39958
39959           layer
39960               .transition()
39961               .duration(250)
39962               .style('opacity', 0)
39963               .on('end', editOff);
39964       }
39965
39966
39967       function editOn() {
39968           layer.style('display', 'block');
39969       }
39970
39971
39972       function editOff() {
39973           layer.selectAll('.viewfield-group').remove();
39974           layer.style('display', 'none');
39975       }
39976
39977
39978       function click(d) {
39979           var service = getService();
39980           if (!service) return;
39981
39982           service
39983               .selectImage(d)
39984               .updateViewer(d)
39985               .showViewer();
39986
39987           context.map().centerEase(d.loc);
39988       }
39989
39990
39991       function mouseover(d) {
39992           var service = getService();
39993           if (service) service.setStyles(d);
39994       }
39995
39996
39997       function mouseout() {
39998           var service = getService();
39999           if (service) service.setStyles(null);
40000       }
40001
40002
40003       function transform(d) {
40004           var t = svgPointTransform(projection)(d);
40005           if (d.ca) {
40006               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
40007           }
40008           return t;
40009       }
40010
40011
40012       function update() {
40013           var viewer = select('#photoviewer');
40014           var selected = viewer.empty() ? undefined : viewer.datum();
40015
40016           var z = ~~context.map().zoom();
40017           var showMarkers = (z >= minMarkerZoom);
40018           var showViewfields = (z >= minViewfieldZoom);
40019
40020           var service = getService();
40021           var sequences = (service ? service.sequences(projection) : []);
40022           var images = (service && showMarkers ? service.images(projection) : []);
40023
40024           var traces = layer.selectAll('.sequences').selectAll('.sequence')
40025               .data(sequences, function(d) { return d.properties.key; });
40026
40027           // exit
40028           traces.exit()
40029               .remove();
40030
40031           // enter/update
40032           traces = traces.enter()
40033               .append('path')
40034               .attr('class', 'sequence')
40035               .merge(traces)
40036               .attr('d', svgPath(projection).geojson);
40037
40038
40039           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
40040               .data(images, function(d) { return d.key; });
40041
40042           // exit
40043           groups.exit()
40044               .remove();
40045
40046           // enter
40047           var groupsEnter = groups.enter()
40048               .append('g')
40049               .attr('class', 'viewfield-group')
40050               .on('mouseenter', mouseover)
40051               .on('mouseleave', mouseout)
40052               .on('click', click);
40053
40054           groupsEnter
40055               .append('g')
40056               .attr('class', 'viewfield-scale');
40057
40058           // update
40059           var markers = groups
40060               .merge(groupsEnter)
40061               .sort(function(a, b) {
40062                   return (a === selected) ? 1
40063                       : (b === selected) ? -1
40064                       : b.loc[1] - a.loc[1];  // sort Y
40065               })
40066               .attr('transform', transform)
40067               .select('.viewfield-scale');
40068
40069
40070           markers.selectAll('circle')
40071               .data([0])
40072               .enter()
40073               .append('circle')
40074               .attr('dx', '0')
40075               .attr('dy', '0')
40076               .attr('r', '6');
40077
40078           var viewfields = markers.selectAll('.viewfield')
40079               .data(showViewfields ? [0] : []);
40080
40081           viewfields.exit()
40082               .remove();
40083
40084           viewfields.enter()               // viewfields may or may not be drawn...
40085               .insert('path', 'circle')    // but if they are, draw below the circles
40086               .attr('class', 'viewfield')
40087               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
40088               .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');
40089       }
40090
40091
40092       function drawImages(selection) {
40093           var enabled = svgOpenstreetcamImages.enabled,
40094               service = getService();
40095
40096           layer = selection.selectAll('.layer-openstreetcam-images')
40097               .data(service ? [0] : []);
40098
40099           layer.exit()
40100               .remove();
40101
40102           var layerEnter = layer.enter()
40103               .append('g')
40104               .attr('class', 'layer-openstreetcam-images')
40105               .style('display', enabled ? 'block' : 'none');
40106
40107           layerEnter
40108               .append('g')
40109               .attr('class', 'sequences');
40110
40111           layerEnter
40112               .append('g')
40113               .attr('class', 'markers');
40114
40115           layer = layerEnter
40116               .merge(layer);
40117
40118           if (enabled) {
40119               if (service && ~~context.map().zoom() >= minZoom) {
40120                   editOn();
40121                   update();
40122                   service.loadImages(projection);
40123               } else {
40124                   editOff();
40125               }
40126           }
40127       }
40128
40129
40130       drawImages.enabled = function(_) {
40131           if (!arguments.length) return svgOpenstreetcamImages.enabled;
40132           svgOpenstreetcamImages.enabled = _;
40133           if (svgOpenstreetcamImages.enabled) {
40134               showLayer();
40135           } else {
40136               hideLayer();
40137           }
40138           dispatch.call('change');
40139           return this;
40140       };
40141
40142
40143       drawImages.supported = function() {
40144           return !!getService();
40145       };
40146
40147
40148       init();
40149       return drawImages;
40150   }
40151
40152   function svgOsm(projection, context, dispatch) {
40153       var enabled = true;
40154
40155
40156       function drawOsm(selection) {
40157           selection.selectAll('.layer-osm')
40158               .data(['covered', 'areas', 'lines', 'points', 'labels'])
40159               .enter()
40160               .append('g')
40161               .attr('class', function(d) { return 'layer-osm ' + d; });
40162
40163           selection.selectAll('.layer-osm.points').selectAll('.points-group')
40164               .data(['points', 'midpoints', 'vertices', 'turns'])
40165               .enter()
40166               .append('g')
40167               .attr('class', function(d) { return 'points-group ' + d; });
40168       }
40169
40170
40171       function showLayer() {
40172           var layer = context.surface().selectAll('.data-layer.osm');
40173           layer.interrupt();
40174
40175           layer
40176               .classed('disabled', false)
40177               .style('opacity', 0)
40178               .transition()
40179               .duration(250)
40180               .style('opacity', 1)
40181               .on('end interrupt', function () {
40182                   dispatch.call('change');
40183               });
40184       }
40185
40186
40187       function hideLayer() {
40188           var layer = context.surface().selectAll('.data-layer.osm');
40189           layer.interrupt();
40190
40191           layer
40192               .transition()
40193               .duration(250)
40194               .style('opacity', 0)
40195               .on('end interrupt', function () {
40196                   layer.classed('disabled', true);
40197                   dispatch.call('change');
40198               });
40199       }
40200
40201
40202       drawOsm.enabled = function(_) {
40203           if (!arguments.length) return enabled;
40204           enabled = _;
40205
40206           if (enabled) {
40207               showLayer();
40208           } else {
40209               hideLayer();
40210           }
40211
40212           dispatch.call('change');
40213           return this;
40214       };
40215
40216
40217       return drawOsm;
40218   }
40219
40220   var _notesEnabled = false;
40221   var _osmService;
40222
40223
40224   function svgNotes(projection, context, dispatch$1) {
40225       if (!dispatch$1) { dispatch$1 = dispatch('change'); }
40226       var throttledRedraw = throttle(function () { dispatch$1.call('change'); }, 1000);
40227       var minZoom = 12;
40228       var touchLayer = select(null);
40229       var drawLayer = select(null);
40230       var _notesVisible = false;
40231
40232
40233       function markerPath(selection, klass) {
40234           selection
40235               .attr('class', klass)
40236               .attr('transform', 'translate(-8, -22)')
40237               .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');
40238       }
40239
40240
40241       // Loosely-coupled osm service for fetching notes.
40242       function getService() {
40243           if (services.osm && !_osmService) {
40244               _osmService = services.osm;
40245               _osmService.on('loadedNotes', throttledRedraw);
40246           } else if (!services.osm && _osmService) {
40247               _osmService = null;
40248           }
40249
40250           return _osmService;
40251       }
40252
40253
40254       // Show the notes
40255       function editOn() {
40256           if (!_notesVisible) {
40257               _notesVisible = true;
40258               drawLayer
40259                   .style('display', 'block');
40260           }
40261       }
40262
40263
40264       // Immediately remove the notes and their touch targets
40265       function editOff() {
40266           if (_notesVisible) {
40267               _notesVisible = false;
40268               drawLayer
40269                   .style('display', 'none');
40270               drawLayer.selectAll('.note')
40271                   .remove();
40272               touchLayer.selectAll('.note')
40273                   .remove();
40274           }
40275       }
40276
40277
40278       // Enable the layer.  This shows the notes and transitions them to visible.
40279       function layerOn() {
40280           editOn();
40281
40282           drawLayer
40283               .style('opacity', 0)
40284               .transition()
40285               .duration(250)
40286               .style('opacity', 1)
40287               .on('end interrupt', function () {
40288                   dispatch$1.call('change');
40289               });
40290       }
40291
40292
40293       // Disable the layer.  This transitions the layer invisible and then hides the notes.
40294       function layerOff() {
40295           throttledRedraw.cancel();
40296           drawLayer.interrupt();
40297           touchLayer.selectAll('.note')
40298               .remove();
40299
40300           drawLayer
40301               .transition()
40302               .duration(250)
40303               .style('opacity', 0)
40304               .on('end interrupt', function () {
40305                   editOff();
40306                   dispatch$1.call('change');
40307               });
40308       }
40309
40310
40311       // Update the note markers
40312       function updateMarkers() {
40313           if (!_notesVisible || !_notesEnabled) return;
40314
40315           var service = getService();
40316           var selectedID = context.selectedNoteID();
40317           var data = (service ? service.notes(projection) : []);
40318           var getTransform = svgPointTransform(projection);
40319
40320           // Draw markers..
40321           var notes = drawLayer.selectAll('.note')
40322               .data(data, function(d) { return d.status + d.id; });
40323
40324           // exit
40325           notes.exit()
40326               .remove();
40327
40328           // enter
40329           var notesEnter = notes.enter()
40330               .append('g')
40331               .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; })
40332               .classed('new', function(d) { return d.id < 0; });
40333
40334           notesEnter
40335               .append('ellipse')
40336               .attr('cx', 0.5)
40337               .attr('cy', 1)
40338               .attr('rx', 6.5)
40339               .attr('ry', 3)
40340               .attr('class', 'stroke');
40341
40342           notesEnter
40343               .append('path')
40344               .call(markerPath, 'shadow');
40345
40346           notesEnter
40347               .append('use')
40348               .attr('class', 'note-fill')
40349               .attr('width', '20px')
40350               .attr('height', '20px')
40351               .attr('x', '-8px')
40352               .attr('y', '-22px')
40353               .attr('xlink:href', '#iD-icon-note');
40354
40355           notesEnter.selectAll('.icon-annotation')
40356               .data(function(d) { return [d]; })
40357               .enter()
40358               .append('use')
40359               .attr('class', 'icon-annotation')
40360               .attr('width', '10px')
40361               .attr('height', '10px')
40362               .attr('x', '-3px')
40363               .attr('y', '-19px')
40364               .attr('xlink:href', function(d) {
40365                   return '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
40366               });
40367
40368           // update
40369           notes
40370               .merge(notesEnter)
40371               .sort(sortY)
40372               .classed('selected', function(d) {
40373                   var mode = context.mode();
40374                   var isMoving = mode && mode.id === 'drag-note';  // no shadows when dragging
40375                   return !isMoving && d.id === selectedID;
40376               })
40377               .attr('transform', getTransform);
40378
40379
40380           // Draw targets..
40381           if (touchLayer.empty()) return;
40382           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
40383
40384           var targets = touchLayer.selectAll('.note')
40385               .data(data, function(d) { return d.id; });
40386
40387           // exit
40388           targets.exit()
40389               .remove();
40390
40391           // enter/update
40392           targets.enter()
40393               .append('rect')
40394               .attr('width', '20px')
40395               .attr('height', '20px')
40396               .attr('x', '-8px')
40397               .attr('y', '-22px')
40398               .merge(targets)
40399               .sort(sortY)
40400               .attr('class', function(d) {
40401                   var newClass = (d.id < 0 ? 'new' : '');
40402                   return 'note target note-' + d.id + ' ' + fillClass + newClass;
40403               })
40404               .attr('transform', getTransform);
40405
40406
40407           function sortY(a, b) {
40408               return (a.id === selectedID) ? 1 : (b.id === selectedID) ? -1 : b.loc[1] - a.loc[1];
40409           }
40410       }
40411
40412
40413       // Draw the notes layer and schedule loading notes and updating markers.
40414       function drawNotes(selection) {
40415           var service = getService();
40416
40417           var surface = context.surface();
40418           if (surface && !surface.empty()) {
40419               touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
40420           }
40421
40422           drawLayer = selection.selectAll('.layer-notes')
40423               .data(service ? [0] : []);
40424
40425           drawLayer.exit()
40426               .remove();
40427
40428           drawLayer = drawLayer.enter()
40429               .append('g')
40430               .attr('class', 'layer-notes')
40431               .style('display', _notesEnabled ? 'block' : 'none')
40432               .merge(drawLayer);
40433
40434           if (_notesEnabled) {
40435               if (service && ~~context.map().zoom() >= minZoom) {
40436                   editOn();
40437                   service.loadNotes(projection);
40438                   updateMarkers();
40439               } else {
40440                   editOff();
40441               }
40442           }
40443       }
40444
40445
40446       // Toggles the layer on and off
40447       drawNotes.enabled = function(val) {
40448           if (!arguments.length) return _notesEnabled;
40449
40450           _notesEnabled = val;
40451           if (_notesEnabled) {
40452               layerOn();
40453           } else {
40454               layerOff();
40455               if (context.selectedNoteID()) {
40456                   context.enter(modeBrowse(context));
40457               }
40458           }
40459
40460           dispatch$1.call('change');
40461           return this;
40462       };
40463
40464
40465       return drawNotes;
40466   }
40467
40468   function svgTouch() {
40469
40470       function drawTouch(selection) {
40471           selection.selectAll('.layer-touch')
40472               .data(['areas', 'lines', 'points', 'turns', 'markers'])
40473               .enter()
40474               .append('g')
40475               .attr('class', function(d) { return 'layer-touch ' + d; });
40476       }
40477
40478       return drawTouch;
40479   }
40480
40481   function svgLayers(projection, context) {
40482       var dispatch$1 = dispatch('change');
40483       var svg = select(null);
40484       var layers = [
40485           { id: 'osm', layer: svgOsm(projection, context, dispatch$1) },
40486           { id: 'notes', layer: svgNotes(projection, context, dispatch$1) },
40487           { id: 'data', layer: svgData(projection, context, dispatch$1) },
40488           { id: 'keepRight', layer: svgKeepRight(projection, context, dispatch$1) },
40489           { id: 'improveOSM', layer: svgImproveOSM(projection, context, dispatch$1) },
40490           { id: 'streetside', layer: svgStreetside(projection, context, dispatch$1)},
40491           { id: 'mapillary-images', layer: svgMapillaryImages(projection, context, dispatch$1) },
40492           { id: 'mapillary-signs',  layer: svgMapillarySigns(projection, context, dispatch$1) },
40493           { id: 'openstreetcam-images', layer: svgOpenstreetcamImages(projection, context, dispatch$1) },
40494           { id: 'debug', layer: svgDebug(projection, context, dispatch$1) },
40495           { id: 'geolocate', layer: svgGeolocate(projection, context, dispatch$1) },
40496           { id: 'touch', layer: svgTouch(projection, context, dispatch$1) }
40497       ];
40498
40499
40500       function drawLayers(selection) {
40501           svg = selection.selectAll('.surface')
40502               .data([0]);
40503
40504           svg = svg.enter()
40505               .append('svg')
40506               .attr('class', 'surface')
40507               .merge(svg);
40508
40509           var defs = svg.selectAll('.surface-defs')
40510               .data([0]);
40511
40512           defs.enter()
40513               .append('defs')
40514               .attr('class', 'surface-defs');
40515
40516           var groups = svg.selectAll('.data-layer')
40517               .data(layers);
40518
40519           groups.exit()
40520               .remove();
40521
40522           groups.enter()
40523               .append('g')
40524               .attr('class', function(d) { return 'data-layer ' + d.id; })
40525               .merge(groups)
40526               .each(function(d) { select(this).call(d.layer); });
40527       }
40528
40529
40530       drawLayers.all = function() {
40531           return layers;
40532       };
40533
40534
40535       drawLayers.layer = function(id) {
40536           var obj = find$1(layers, function(o) {return o.id === id;});
40537           return obj && obj.layer;
40538       };
40539
40540
40541       drawLayers.only = function(what) {
40542           var arr = [].concat(what);
40543           drawLayers.remove(difference(map$3(layers, 'id'), arr));
40544           return this;
40545       };
40546
40547
40548       drawLayers.remove = function(what) {
40549           var arr = [].concat(what);
40550           arr.forEach(function(id) {
40551               layers = reject(layers, function(o) {return o.id === id;});
40552           });
40553           dispatch$1.call('change');
40554           return this;
40555       };
40556
40557
40558       drawLayers.add = function(what) {
40559           var arr = [].concat(what);
40560           arr.forEach(function(obj) {
40561               if ('id' in obj && 'layer' in obj) {
40562                   layers.push(obj);
40563               }
40564           });
40565           dispatch$1.call('change');
40566           return this;
40567       };
40568
40569
40570       drawLayers.dimensions = function(_) {
40571           if (!arguments.length) return utilGetDimensions(svg);
40572           utilSetDimensions(svg, _);
40573           return this;
40574       };
40575
40576
40577       return utilRebind(drawLayers, dispatch$1, 'on');
40578   }
40579
40580   function svgLines(projection, context) {
40581       var detected = utilDetect();
40582
40583       var highway_stack = {
40584           motorway: 0,
40585           motorway_link: 1,
40586           trunk: 2,
40587           trunk_link: 3,
40588           primary: 4,
40589           primary_link: 5,
40590           secondary: 6,
40591           tertiary: 7,
40592           unclassified: 8,
40593           residential: 9,
40594           service: 10,
40595           footway: 11
40596       };
40597
40598
40599       function drawTargets(selection, graph, entities, filter) {
40600           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
40601           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
40602           var getPath = svgPath(projection).geojson;
40603           var activeID = context.activeID();
40604
40605           // The targets and nopes will be MultiLineString sub-segments of the ways
40606           var data = { targets: [], nopes: [] };
40607
40608           entities.forEach(function(way) {
40609               var features = svgSegmentWay(way, graph, activeID);
40610               data.targets.push.apply(data.targets, features.passive);
40611               data.nopes.push.apply(data.nopes, features.active);
40612           });
40613
40614
40615           // Targets allow hover and vertex snapping
40616           var targetData = data.targets.filter(getPath);
40617           var targets = selection.selectAll('.line.target-allowed')
40618               .filter(function(d) { return filter(d.properties.entity); })
40619               .data(targetData, function key(d) { return d.id; });
40620
40621           // exit
40622           targets.exit()
40623               .remove();
40624
40625           // enter/update
40626           targets.enter()
40627               .append('path')
40628               .merge(targets)
40629               .attr('d', getPath)
40630               .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
40631
40632
40633           // NOPE
40634           var nopeData = data.nopes.filter(getPath);
40635           var nopes = selection.selectAll('.line.target-nope')
40636               .filter(function(d) { return filter(d.properties.entity); })
40637               .data(nopeData, function key(d) { return d.id; });
40638
40639           // exit
40640           nopes.exit()
40641               .remove();
40642
40643           // enter/update
40644           nopes.enter()
40645               .append('path')
40646               .merge(nopes)
40647               .attr('d', getPath)
40648               .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
40649       }
40650
40651
40652       function drawLines(selection, graph, entities, filter$1) {
40653
40654           function waystack(a, b) {
40655               var selected = context.selectedIDs();
40656               var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
40657               var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
40658
40659               if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
40660               if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
40661               return scoreA - scoreB;
40662           }
40663
40664
40665           function drawLineGroup(selection, klass, isSelected) {
40666               // Note: Don't add `.selected` class in draw modes
40667               var mode = context.mode();
40668               var isDrawing = mode && /^draw/.test(mode.id);
40669               var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
40670
40671               var lines = selection
40672                   .selectAll('path')
40673                   .filter(filter$1)
40674                   .data(getPathData(isSelected), osmEntity.key);
40675
40676               lines.exit()
40677                   .remove();
40678
40679               // Optimization: Call expensive TagClasses only on enter selection. This
40680               // works because osmEntity.key is defined to include the entity v attribute.
40681               lines.enter()
40682                   .append('path')
40683                   .attr('class', function(d) {
40684                       var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
40685                       return 'way line ' + klass + ' ' + selectedClass + oldMPClass + d.id;
40686                   })
40687                   .call(svgTagClasses())
40688                   .merge(lines)
40689                   .sort(waystack)
40690                   .attr('d', getPath)
40691                   .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
40692
40693               return selection;
40694           }
40695
40696
40697           function getPathData(isSelected) {
40698               return function() {
40699                   var layer = this.parentNode.__data__;
40700                   var data = pathdata[layer] || [];
40701                   return data.filter(function(d) {
40702                       if (isSelected)
40703                           return context.selectedIDs().indexOf(d.id) !== -1;
40704                       else
40705                           return context.selectedIDs().indexOf(d.id) === -1;
40706                   });
40707               };
40708           }
40709
40710           function addMarkers(layergroup, pathclass, groupclass, groupdata, marker) {
40711               var markergroup = layergroup
40712                   .selectAll('g.' + groupclass)
40713                   .data([pathclass]);
40714
40715               markergroup = markergroup.enter()
40716                   .append('g')
40717                   .attr('class', groupclass)
40718                   .merge(markergroup);
40719
40720               var markers = markergroup
40721                   .selectAll('path')
40722                   .filter(filter$1)
40723                   .data(
40724                       function data() { return groupdata[this.parentNode.__data__] || []; },
40725                       function key(d) { return [d.id, d.index]; }
40726                   );
40727
40728               markers.exit()
40729                   .remove();
40730
40731               markers = markers.enter()
40732                   .append('path')
40733                   .attr('class', pathclass)
40734                   .attr('marker-mid', marker)
40735                   .merge(markers)
40736                   .attr('d', function(d) { return d.d; });
40737
40738               if (detected.ie) {
40739                   markers.each(function() { this.parentNode.insertBefore(this, this); });
40740               }
40741           }
40742
40743
40744           var getPath = svgPath(projection, graph);
40745           var ways = [];
40746           var pathdata = {};
40747           var onewaydata = {};
40748           var sideddata = {};
40749           var oldMultiPolygonOuters = {};
40750
40751           for (var i = 0; i < entities.length; i++) {
40752               var entity = entities[i];
40753               var outer = osmOldMultipolygonOuterMember(entity, graph);
40754               if (outer) {
40755                   ways.push(entity.mergeTags(outer.tags));
40756                   oldMultiPolygonOuters[outer.id] = true;
40757               } else if (entity.geometry(graph) === 'line') {
40758                   ways.push(entity);
40759               }
40760           }
40761
40762           ways = ways.filter(getPath);
40763           pathdata = groupBy(ways, function(way) { return way.layer(); });
40764
40765           forOwn(pathdata, function(v, k) {
40766               var onewayArr = filter(v, function(d) { return d.isOneWay(); });
40767               var onewaySegments = svgMarkerSegments(
40768                   projection, graph, 35,
40769                   function shouldReverse(entity) { return entity.tags.oneway === '-1'; },
40770                   function bothDirections(entity) {
40771                       return entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating';
40772                   }
40773               );
40774               onewaydata[k] = flatten(map$3(onewayArr, onewaySegments));
40775
40776               var sidedArr = filter(v, function(d) { return d.isSided(); });
40777               var sidedSegments = svgMarkerSegments(
40778                   projection, graph, 30,
40779                   function shouldReverse() { return false; },
40780                   function bothDirections() { return false; }
40781               );
40782               sideddata[k] = flatten(map$3(sidedArr, sidedSegments));
40783           });
40784
40785
40786           var covered = selection.selectAll('.layer-osm.covered');     // under areas
40787           var uncovered = selection.selectAll('.layer-osm.lines');     // over areas
40788           var touchLayer = selection.selectAll('.layer-touch.lines');
40789
40790           // Draw lines..
40791           [covered, uncovered].forEach(function(selection) {
40792               var range$1 = (selection === covered ? range(-10,0) : range(0,11));
40793               var layergroup = selection
40794                   .selectAll('g.layergroup')
40795                   .data(range$1);
40796
40797               layergroup = layergroup.enter()
40798                   .append('g')
40799                   .attr('class', function(d) { return 'layergroup layer' + String(d); })
40800                   .merge(layergroup);
40801
40802               layergroup
40803                   .selectAll('g.linegroup')
40804                   .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
40805                   .enter()
40806                   .append('g')
40807                   .attr('class', function(d) { return 'linegroup line-' + d; });
40808
40809               layergroup.selectAll('g.line-shadow')
40810                   .call(drawLineGroup, 'shadow', false);
40811               layergroup.selectAll('g.line-casing')
40812                   .call(drawLineGroup, 'casing', false);
40813               layergroup.selectAll('g.line-stroke')
40814                   .call(drawLineGroup, 'stroke', false);
40815
40816               layergroup.selectAll('g.line-shadow-highlighted')
40817                   .call(drawLineGroup, 'shadow', true);
40818               layergroup.selectAll('g.line-casing-highlighted')
40819                   .call(drawLineGroup, 'casing', true);
40820               layergroup.selectAll('g.line-stroke-highlighted')
40821                   .call(drawLineGroup, 'stroke', true);
40822
40823               addMarkers(layergroup, 'oneway', 'onewaygroup', onewaydata, 'url(#oneway-marker)');
40824               addMarkers(layergroup, 'sided', 'sidedgroup', sideddata,
40825                   function marker(d) {
40826                       var category = graph.entity(d.id).sidednessIdentifier();
40827                       return 'url(#sided-marker-' + category + ')';
40828                   }
40829               );
40830           });
40831
40832           // Draw touch targets..
40833           touchLayer
40834               .call(drawTargets, graph, ways, filter$1);
40835       }
40836
40837
40838       return drawLines;
40839   }
40840
40841   function svgMidpoints(projection, context) {
40842       var targetRadius = 8;
40843
40844       function drawTargets(selection, graph, entities, filter) {
40845           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
40846           var getTransform = svgPointTransform(projection).geojson;
40847
40848           var data = entities.map(function(midpoint) {
40849               return {
40850                   type: 'Feature',
40851                   id: midpoint.id,
40852                   properties: {
40853                       target: true,
40854                       entity: midpoint
40855                   },
40856                   geometry: {
40857                       type: 'Point',
40858                       coordinates: midpoint.loc
40859                   }
40860               };
40861           });
40862
40863           var targets = selection.selectAll('.midpoint.target')
40864               .filter(function(d) { return filter(d.properties.entity); })
40865               .data(data, function key(d) { return d.id; });
40866
40867           // exit
40868           targets.exit()
40869               .remove();
40870
40871           // enter/update
40872           targets.enter()
40873               .append('circle')
40874               .attr('r', targetRadius)
40875               .merge(targets)
40876               .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
40877               .attr('transform', getTransform);
40878       }
40879
40880
40881       function drawMidpoints(selection, graph, entities, filter, extent) {
40882           var drawLayer = selection.selectAll('.layer-osm.points .points-group.midpoints');
40883           var touchLayer = selection.selectAll('.layer-touch.points');
40884
40885           var mode = context.mode();
40886           if (mode && mode.id !== 'select') {
40887               drawLayer.selectAll('.midpoint').remove();
40888               touchLayer.selectAll('.midpoint.target').remove();
40889               return;
40890           }
40891
40892           var poly = extent.polygon();
40893           var midpoints = {};
40894
40895           for (var i = 0; i < entities.length; i++) {
40896               var entity = entities[i];
40897
40898               if (entity.type !== 'way') continue;
40899               if (!filter(entity)) continue;
40900               if (context.selectedIDs().indexOf(entity.id) < 0) continue;
40901
40902               var nodes = graph.childNodes(entity);
40903               for (var j = 0; j < nodes.length - 1; j++) {
40904                   var a = nodes[j];
40905                   var b = nodes[j + 1];
40906                   var id = [a.id, b.id].sort().join('-');
40907
40908                   if (midpoints[id]) {
40909                       midpoints[id].parents.push(entity);
40910                   } else if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
40911                       var point = geoVecInterp(a.loc, b.loc, 0.5);
40912                       var loc = null;
40913
40914                       if (extent.intersects(point)) {
40915                           loc = point;
40916                       } else {
40917                           for (var k = 0; k < 4; k++) {
40918                               point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
40919                               if (point &&
40920                                   geoVecLength(projection(a.loc), projection(point)) > 20 &&
40921                                   geoVecLength(projection(b.loc), projection(point)) > 20)
40922                               {
40923                                   loc = point;
40924                                   break;
40925                               }
40926                           }
40927                       }
40928
40929                       if (loc) {
40930                           midpoints[id] = {
40931                               type: 'midpoint',
40932                               id: id,
40933                               loc: loc,
40934                               edge: [a.id, b.id],
40935                               parents: [entity]
40936                           };
40937                       }
40938                   }
40939               }
40940           }
40941
40942
40943           function midpointFilter(d) {
40944               if (midpoints[d.id])
40945                   return true;
40946
40947               for (var i = 0; i < d.parents.length; i++) {
40948                   if (filter(d.parents[i])) {
40949                       return true;
40950                   }
40951               }
40952
40953               return false;
40954           }
40955
40956
40957           var groups = drawLayer.selectAll('.midpoint')
40958               .filter(midpointFilter)
40959               .data(values$1(midpoints), function(d) { return d.id; });
40960
40961           groups.exit()
40962               .remove();
40963
40964           var enter = groups.enter()
40965               .insert('g', ':first-child')
40966               .attr('class', 'midpoint');
40967
40968           enter
40969               .append('polygon')
40970               .attr('points', '-6,8 10,0 -6,-8')
40971               .attr('class', 'shadow');
40972
40973           enter
40974               .append('polygon')
40975               .attr('points', '-3,4 5,0 -3,-4')
40976               .attr('class', 'fill');
40977
40978           groups = groups
40979               .merge(enter)
40980               .attr('transform', function(d) {
40981                   var translate = svgPointTransform(projection);
40982                   var a = graph.entity(d.edge[0]);
40983                   var b = graph.entity(d.edge[1]);
40984                   var angle = geoAngle(a, b, projection) * (180 / Math.PI);
40985                   return translate(d) + ' rotate(' + angle + ')';
40986               })
40987               .call(svgTagClasses().tags(
40988                   function(d) { return d.parents[0].tags; }
40989               ));
40990
40991           // Propagate data bindings.
40992           groups.select('polygon.shadow');
40993           groups.select('polygon.fill');
40994
40995
40996           // Draw touch targets..
40997           touchLayer
40998               .call(drawTargets, graph, values$1(midpoints), midpointFilter);
40999       }
41000
41001       return drawMidpoints;
41002   }
41003
41004   function svgPoints(projection, context) {
41005
41006       function markerPath(selection, klass) {
41007           selection
41008               .attr('class', klass)
41009               .attr('transform', 'translate(-8, -23)')
41010               .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');
41011       }
41012
41013       function sortY(a, b) {
41014           return b.loc[1] - a.loc[1];
41015       }
41016
41017
41018       // Avoid exit/enter if we're just moving stuff around.
41019       // The node will get a new version but we only need to run the update selection.
41020       function fastEntityKey(d) {
41021           var mode = context.mode();
41022           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
41023           return isMoving ? d.id : osmEntity.key(d);
41024       }
41025
41026
41027       function drawTargets(selection, graph, entities, filter) {
41028           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
41029           var getTransform = svgPointTransform(projection).geojson;
41030           var activeID = context.activeID();
41031           var data = [];
41032
41033           entities.forEach(function(node) {
41034               if (activeID === node.id) return;   // draw no target on the activeID
41035
41036               data.push({
41037                   type: 'Feature',
41038                   id: node.id,
41039                   properties: {
41040                       target: true,
41041                       entity: node
41042                   },
41043                   geometry: node.asGeoJSON()
41044               });
41045           });
41046
41047           var targets = selection.selectAll('.point.target')
41048               .filter(function(d) { return filter(d.properties.entity); })
41049               .data(data, function key(d) { return d.id; });
41050
41051           // exit
41052           targets.exit()
41053               .remove();
41054
41055           // enter/update
41056           targets.enter()
41057               .append('rect')
41058               .attr('x', -10)
41059               .attr('y', -26)
41060               .attr('width', 20)
41061               .attr('height', 30)
41062               .merge(targets)
41063               .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
41064               .attr('transform', getTransform);
41065       }
41066
41067
41068       function drawPoints(selection, graph, entities, filter) {
41069           var wireframe = context.surface().classed('fill-wireframe');
41070           var zoom = geoScaleToZoom(projection.scale());
41071
41072           // Points with a direction will render as vertices at higher zooms..
41073           function renderAsPoint(entity) {
41074               return entity.geometry(graph) === 'point' &&
41075                   !(zoom >= 18 && entity.directions(graph, projection).length);
41076           }
41077
41078           // All points will render as vertices in wireframe mode too..
41079           var points = wireframe ? [] : entities.filter(renderAsPoint);
41080           points.sort(sortY);
41081
41082
41083           var drawLayer = selection.selectAll('.layer-osm.points .points-group.points');
41084           var touchLayer = selection.selectAll('.layer-touch.points');
41085
41086           // Draw points..
41087           var groups = drawLayer.selectAll('g.point')
41088               .filter(filter)
41089               .data(points, fastEntityKey);
41090
41091           groups.exit()
41092               .remove();
41093
41094           var enter = groups.enter()
41095               .append('g')
41096               .attr('class', function(d) { return 'node point ' + d.id; })
41097               .order();
41098
41099           enter
41100               .append('path')
41101               .call(markerPath, 'shadow');
41102
41103           enter
41104               .append('ellipse')
41105               .attr('cx', 0.5)
41106               .attr('cy', 1)
41107               .attr('rx', 6.5)
41108               .attr('ry', 3)
41109               .attr('class', 'stroke');
41110
41111           enter
41112               .append('path')
41113               .call(markerPath, 'stroke');
41114
41115           enter
41116               .append('use')
41117               .attr('transform', 'translate(-5, -19)')
41118               .attr('class', 'icon')
41119               .attr('width', '11px')
41120               .attr('height', '11px');
41121
41122           groups = groups
41123               .merge(enter)
41124               .attr('transform', svgPointTransform(projection))
41125               .call(svgTagClasses());
41126
41127           // Selecting the following implicitly
41128           // sets the data (point entity) on the element
41129           groups.select('.shadow');
41130           groups.select('.stroke');
41131           groups.select('.icon')
41132               .attr('xlink:href', function(entity) {
41133                   var preset = context.presets().match(entity, graph);
41134                   var picon = preset && preset.icon;
41135
41136                   if (!picon) {
41137                       return '';
41138                   } else {
41139                       var isMaki = /^maki-/.test(picon);
41140                       return '#' + picon + (isMaki ? '-11' : '');
41141                   }
41142               });
41143
41144
41145           // Draw touch targets..
41146           touchLayer
41147               .call(drawTargets, graph, points, filter);
41148       }
41149
41150
41151       return drawPoints;
41152   }
41153
41154   function svgTagClasses() {
41155       var primaries = [
41156           'building', 'highway', 'railway', 'waterway', 'aeroway', 'aerialway',
41157           'piste:type', 'boundary', 'power', 'amenity', 'natural', 'landuse',
41158           'leisure', 'military', 'place', 'man_made', 'route', 'attraction'
41159       ];
41160       var statuses = [
41161           'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
41162           'razed', 'demolished', 'obliterated', 'intermittent'
41163       ];
41164       var secondaries = [
41165           'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
41166           'surface', 'tracktype', 'footway', 'crossing', 'service', 'sport',
41167           'public_transport', 'location', 'parking', 'golf', 'type'
41168       ];
41169       var _tags = function(entity) { return entity.tags; };
41170
41171
41172       var tagClasses = function(selection) {
41173           selection.each(function tagClassesEach(entity) {
41174               var value = this.className;
41175
41176               if (value.baseVal !== undefined) {
41177                   value = value.baseVal;
41178               }
41179
41180               var t = _tags(entity);
41181
41182               var computed = tagClasses.getClassesString(t, value, entity);
41183
41184               if (computed !== value) {
41185                   select(this).attr('class', computed);
41186               }
41187           });
41188       };
41189
41190
41191       tagClasses.getClassesString = function(t, value, entity) {
41192           var primary, status;
41193           var i, k, v;
41194
41195           // in some situations we want to render perimeter strokes a certain way
41196           var overrideGeometry;
41197           if (/\bstroke\b/.test(value)) {
41198               if (!!t.barrier && t.barrier !== 'no') {
41199                   overrideGeometry = 'line';
41200               } else if (t.type === 'multipolygon' && !entity.hasInterestingTags()) {
41201                   overrideGeometry = 'area';
41202               }
41203           }
41204
41205           // preserve base classes (nothing with `tag-`)
41206           var classes = value.trim().split(/\s+/)
41207               .filter(function(klass) {
41208                   return klass.length && !/^tag-/.test(klass);
41209               })
41210               .map(function(klass) {  // special overrides for some perimeter strokes
41211                   return (klass === 'line' || klass === 'area') ? (overrideGeometry || klass) : klass;
41212               });
41213
41214           // pick at most one primary classification tag..
41215           for (i = 0; i < primaries.length; i++) {
41216               k = primaries[i];
41217               v = t[k];
41218               if (!v || v === 'no') continue;
41219
41220               if (k === 'piste:type') {  // avoid a ':' in the class name
41221                   k = 'piste';
41222               }
41223
41224               primary = k;
41225               if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
41226                   status = v;
41227                   classes.push('tag-' + k);
41228               } else {
41229                   classes.push('tag-' + k);
41230                   classes.push('tag-' + k + '-' + v);
41231               }
41232
41233               break;
41234           }
41235
41236           // add at most one status tag, only if relates to primary tag..
41237           if (!status) {
41238               for (i = 0; i < statuses.length; i++) {
41239                   k = statuses[i];
41240                   v = t[k];
41241                   if (!v || v === 'no') continue;
41242
41243                   if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
41244                       status = k;
41245                   }
41246                   else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
41247                       status = k;
41248                   } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
41249                       status = k;
41250                       primary = v;
41251                       classes.push('tag-' + v);
41252                   }  // else ignore e.g.  `highway=path + abandoned=railway`
41253
41254                   if (status) break;
41255               }
41256           }
41257
41258           if (status) {
41259               classes.push('tag-status');
41260               classes.push('tag-status-' + status);
41261           }
41262
41263           // add any secondary tags
41264           for (i = 0; i < secondaries.length; i++) {
41265               k = secondaries[i];
41266               v = t[k];
41267               if (!v || v === 'no') continue;
41268               classes.push('tag-' + k);
41269               classes.push('tag-' + k + '-' + v);
41270           }
41271
41272           // For highways, look for surface tagging..
41273           if (primary === 'highway' || primary === 'aeroway') {
41274               var paved = (t.highway !== 'track');
41275               for (k in t) {
41276                   v = t[k];
41277                   if (k in osmPavedTags) {
41278                       paved = !!osmPavedTags[k][v];
41279                       break;
41280                   }
41281               }
41282               if (!paved) {
41283                   classes.push('tag-unpaved');
41284               }
41285           }
41286
41287           return classes.join(' ').trim();
41288       };
41289
41290
41291       tagClasses.tags = function(val) {
41292           if (!arguments.length) return _tags;
41293           _tags = val;
41294           return tagClasses;
41295       };
41296
41297       return tagClasses;
41298   }
41299
41300   function svgTurns(projection, context) {
41301
41302       function icon(turn) {
41303           var u = turn.u ? '-u' : '';
41304           if (turn.no) return '#iD-turn-no' + u;
41305           if (turn.only) return '#iD-turn-only' + u;
41306           return '#iD-turn-yes' + u;
41307       }
41308
41309       function drawTurns(selection, graph, turns) {
41310
41311           function turnTransform(d) {
41312               var pxRadius = 50;
41313               var toWay = graph.entity(d.to.way);
41314               var toPoints = graph.childNodes(toWay)
41315                   .map(function (n) { return n.loc; })
41316                   .map(projection);
41317               var toLength = geoPathLength(toPoints);
41318               var mid = toLength / 2;    // midpoint of destination way
41319
41320               var toNode = graph.entity(d.to.node);
41321               var toVertex = graph.entity(d.to.vertex);
41322               var a = geoAngle(toVertex, toNode, projection);
41323               var o = projection(toVertex.loc);
41324               var r = d.u ? 0                  // u-turn: no radius
41325                   : !toWay.__via ? pxRadius    // leaf way: put marker at pxRadius
41326                   : Math.min(mid, pxRadius);   // via way: prefer pxRadius, fallback to mid for very short ways
41327
41328               return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
41329                   'rotate(' + a * 180 / Math.PI + ')';
41330           }
41331
41332
41333           var drawLayer = selection.selectAll('.layer-osm.points .points-group.turns');
41334           var touchLayer = selection.selectAll('.layer-touch.turns');
41335
41336           // Draw turns..
41337           var groups = drawLayer.selectAll('g.turn')
41338               .data(turns, function(d) { return d.key; });
41339
41340           // exit
41341           groups.exit()
41342               .remove();
41343
41344           // enter
41345           var groupsEnter = groups.enter()
41346               .append('g')
41347               .attr('class', function(d) { return 'turn ' + d.key; });
41348
41349           var turnsEnter = groupsEnter
41350               .filter(function(d) { return !d.u; });
41351
41352           turnsEnter.append('rect')
41353               .attr('transform', 'translate(-22, -12)')
41354               .attr('width', '44')
41355               .attr('height', '24');
41356
41357           turnsEnter.append('use')
41358               .attr('transform', 'translate(-22, -12)')
41359               .attr('width', '44')
41360               .attr('height', '24');
41361
41362           var uEnter = groupsEnter
41363               .filter(function(d) { return d.u; });
41364
41365           uEnter.append('circle')
41366               .attr('r', '16');
41367
41368           uEnter.append('use')
41369               .attr('transform', 'translate(-16, -16)')
41370               .attr('width', '32')
41371               .attr('height', '32');
41372
41373           // update
41374           groups = groups
41375               .merge(groupsEnter)
41376               .attr('opacity', function(d) { return d.direct === false ? '0.7' : null; })
41377               .attr('transform', turnTransform);
41378
41379           groups.select('use')
41380               .attr('xlink:href', icon);
41381
41382           groups.select('rect');      // propagate bound data
41383           groups.select('circle');    // propagate bound data
41384
41385
41386           // Draw touch targets..
41387           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
41388           groups = touchLayer.selectAll('g.turn')
41389               .data(turns, function(d) { return d.key; });
41390
41391           // exit
41392           groups.exit()
41393               .remove();
41394
41395           // enter
41396           groupsEnter = groups.enter()
41397               .append('g')
41398               .attr('class', function(d) { return 'turn ' + d.key; });
41399
41400           turnsEnter = groupsEnter
41401               .filter(function(d) { return !d.u; });
41402
41403           turnsEnter.append('rect')
41404               .attr('class', 'target ' + fillClass)
41405               .attr('transform', 'translate(-22, -12)')
41406               .attr('width', '44')
41407               .attr('height', '24');
41408
41409           uEnter = groupsEnter
41410               .filter(function(d) { return d.u; });
41411
41412           uEnter.append('circle')
41413               .attr('class', 'target ' + fillClass)
41414               .attr('r', '16');
41415
41416           // update
41417           groups = groups
41418               .merge(groupsEnter)
41419               .attr('transform', turnTransform);
41420
41421           groups.select('rect');      // propagate bound data
41422           groups.select('circle');    // propagate bound data
41423
41424
41425           return this;
41426       }
41427
41428       return drawTurns;
41429   }
41430
41431   function svgVertices(projection, context) {
41432       var radiuses = {
41433           //       z16-, z17,   z18+,  w/icon
41434           shadow: [6,    7.5,   7.5,   12],
41435           stroke: [2.5,  3.5,   3.5,   8],
41436           fill:   [1,    1.5,   1.5,   1.5]
41437       };
41438
41439       var _currHoverTarget;
41440       var _currPersistent = {};
41441       var _currHover = {};
41442       var _prevHover = {};
41443       var _currSelected = {};
41444       var _prevSelected = {};
41445       var _radii = {};
41446
41447
41448       function sortY(a, b) {
41449           return b.loc[1] - a.loc[1];
41450       }
41451
41452       // Avoid exit/enter if we're just moving stuff around.
41453       // The node will get a new version but we only need to run the update selection.
41454       function fastEntityKey(d) {
41455           var mode = context.mode();
41456           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
41457           return isMoving ? d.id : osmEntity.key(d);
41458       }
41459
41460
41461       function draw(selection, graph, vertices, sets, filter) {
41462           sets = sets || { selected: {}, important: {}, hovered: {} };
41463
41464           var icons = {};
41465           var directions = {};
41466           var wireframe = context.surface().classed('fill-wireframe');
41467           var zoom = geoScaleToZoom(projection.scale());
41468           var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
41469           var activeID = context.activeID();
41470
41471
41472           function getIcon(d) {
41473               // always check latest entity, as fastEntityKey avoids enter/exit now
41474               var entity = graph.entity(d.id);
41475               if (entity.id in icons) return icons[entity.id];
41476
41477               icons[entity.id] =
41478                   entity.hasInterestingTags() &&
41479                   context.presets().match(entity, graph).icon;
41480
41481               return icons[entity.id];
41482           }
41483
41484
41485           // memoize directions results, return false for empty arrays (for use in filter)
41486           function getDirections(entity) {
41487               if (entity.id in directions) return directions[entity.id];
41488
41489               var angles = entity.directions(graph, projection);
41490               directions[entity.id] = angles.length ? angles : false;
41491               return angles;
41492           }
41493
41494
41495           function updateAttributes(selection) {
41496               ['shadow', 'stroke', 'fill'].forEach(function(klass) {
41497                   var rads = radiuses[klass];
41498                   selection.selectAll('.' + klass)
41499                       .each(function(entity) {
41500                           var i = z && getIcon(entity);
41501                           var r = rads[i ? 3 : z];
41502
41503                           // slightly increase the size of unconnected endpoints #3775
41504                           if (entity.id !== activeID && entity.isEndpoint(graph) && !entity.isConnected(graph)) {
41505                               r += 1.5;
41506                           }
41507
41508                           if (klass === 'shadow') {   // remember this value, so we don't need to
41509                               _radii[entity.id] = r;  // recompute it when we draw the touch targets
41510                           }
41511
41512                           select(this)
41513                               .attr('r', r)
41514                               .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
41515                       });
41516               });
41517           }
41518
41519           vertices.sort(sortY);
41520
41521           var groups = selection.selectAll('g.vertex')
41522               .filter(filter)
41523               .data(vertices, fastEntityKey);
41524
41525           // exit
41526           groups.exit()
41527               .remove();
41528
41529           // enter
41530           var enter = groups.enter()
41531               .append('g')
41532               .attr('class', function(d) { return 'node vertex ' + d.id; })
41533               .order();
41534
41535           enter
41536               .append('circle')
41537               .attr('class', 'shadow');
41538
41539           enter
41540               .append('circle')
41541               .attr('class', 'stroke');
41542
41543           // Vertices with tags get a fill.
41544           enter.filter(function(d) { return d.hasInterestingTags(); })
41545               .append('circle')
41546               .attr('class', 'fill');
41547
41548           // update
41549           groups = groups
41550               .merge(enter)
41551               .attr('transform', svgPointTransform(projection))
41552               .classed('sibling', function(d) { return d.id in sets.selected; })
41553               .classed('shared', function(d) { return graph.isShared(d); })
41554               .classed('endpoint', function(d) { return d.isEndpoint(graph); })
41555               .call(updateAttributes);
41556
41557
41558           // Vertices with icons get a `use`.
41559           var iconUse = groups
41560               .selectAll('.icon')
41561               .data(function data(d) { return zoom >= 17 && getIcon(d) ? [d] : []; }, fastEntityKey);
41562
41563           // exit
41564           iconUse.exit()
41565               .remove();
41566
41567           // enter
41568           iconUse.enter()
41569               .append('use')
41570               .attr('class', 'icon')
41571               .attr('width', '11px')
41572               .attr('height', '11px')
41573               .attr('transform', 'translate(-5.5, -5.5)')
41574               .attr('xlink:href', function(d) {
41575                   var picon = getIcon(d);
41576                   var isMaki = /^maki-/.test(picon);
41577                   return '#' + picon + (isMaki ? '-11' : '');
41578               });
41579
41580
41581           // Vertices with directions get viewfields
41582           var dgroups = groups
41583               .selectAll('.viewfieldgroup')
41584               .data(function data(d) { return zoom >= 18 && getDirections(d) ? [d] : []; }, fastEntityKey);
41585
41586           // exit
41587           dgroups.exit()
41588               .remove();
41589
41590           // enter/update
41591           dgroups = dgroups.enter()
41592               .insert('g', '.shadow')
41593               .attr('class', 'viewfieldgroup')
41594               .merge(dgroups);
41595
41596           var viewfields = dgroups.selectAll('.viewfield')
41597               .data(getDirections, function key(d) { return osmEntity.key(d); });
41598
41599           // exit
41600           viewfields.exit()
41601               .remove();
41602
41603           // enter/update
41604           viewfields.enter()
41605               .append('path')
41606               .attr('class', 'viewfield')
41607               .attr('d', 'M0,0H0')
41608               .merge(viewfields)
41609               .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
41610               .attr('transform', function(d) { return 'rotate(' + d + ')'; });
41611       }
41612
41613
41614       function drawTargets(selection, graph, entities, filter) {
41615           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
41616           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
41617           var getTransform = svgPointTransform(projection).geojson;
41618           var activeID = context.activeID();
41619           var data = { targets: [], nopes: [] };
41620
41621           entities.forEach(function(node) {
41622               if (activeID === node.id) return;   // draw no target on the activeID
41623
41624               var vertexType = svgPassiveVertex(node, graph, activeID);
41625               if (vertexType !== 0) {     // passive or adjacent - allow to connect
41626                   data.targets.push({
41627                       type: 'Feature',
41628                       id: node.id,
41629                       properties: {
41630                           target: true,
41631                           entity: node
41632                       },
41633                       geometry: node.asGeoJSON()
41634                   });
41635               } else {
41636                   data.nopes.push({
41637                       type: 'Feature',
41638                       id: node.id + '-nope',
41639                       properties: {
41640                           nope: true,
41641                           target: true,
41642                           entity: node
41643                       },
41644                       geometry: node.asGeoJSON()
41645                   });
41646               }
41647           });
41648
41649
41650           // Targets allow hover and vertex snapping
41651           var targets = selection.selectAll('.vertex.target-allowed')
41652               .filter(function(d) { return filter(d.properties.entity); })
41653               .data(data.targets, function key(d) { return d.id; });
41654
41655           // exit
41656           targets.exit()
41657               .remove();
41658
41659           // enter/update
41660           targets.enter()
41661               .append('circle')
41662               .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
41663               .merge(targets)
41664               .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
41665               .attr('transform', getTransform);
41666
41667
41668           // NOPE
41669           var nopes = selection.selectAll('.vertex.target-nope')
41670               .filter(function(d) { return filter(d.properties.entity); })
41671               .data(data.nopes, function key(d) { return d.id; });
41672
41673           // exit
41674           nopes.exit()
41675               .remove();
41676
41677           // enter/update
41678           nopes.enter()
41679               .append('circle')
41680               .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
41681               .merge(nopes)
41682               .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
41683               .attr('transform', getTransform);
41684       }
41685
41686
41687       // Points can also render as vertices:
41688       // 1. in wireframe mode or
41689       // 2. at higher zooms if they have a direction
41690       function renderAsVertex(entity, graph, wireframe, zoom) {
41691           var geometry = entity.geometry(graph);
41692           return geometry === 'vertex' || (geometry === 'point' && (
41693               wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
41694           ));
41695       }
41696
41697
41698       function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
41699           var results = {};
41700
41701           function addChildVertices(entity) {
41702               var geometry = entity.geometry(graph);
41703               if (!context.features().isHiddenFeature(entity, graph, geometry)) {
41704                   var i;
41705                   if (entity.type === 'way') {
41706                       for (i = 0; i < entity.nodes.length; i++) {
41707                           var child = graph.hasEntity(entity.nodes[i]);
41708                           if (child) {
41709                               addChildVertices(child);
41710                           }
41711                       }
41712                   } else if (entity.type === 'relation') {
41713                       for (i = 0; i < entity.members.length; i++) {
41714                           var member = graph.hasEntity(entity.members[i].id);
41715                           if (member) {
41716                               addChildVertices(member);
41717                           }
41718                       }
41719                   } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
41720                       results[entity.id] = entity;
41721                   }
41722               }
41723           }
41724
41725           ids.forEach(function(id) {
41726               var entity = graph.hasEntity(id);
41727               if (!entity) return;
41728
41729               if (entity.type === 'node') {
41730                   if (renderAsVertex(entity, graph, wireframe, zoom)) {
41731                       results[entity.id] = entity;
41732                       graph.parentWays(entity).forEach(function(entity) {
41733                           addChildVertices(entity);
41734                       });
41735                   }
41736               } else {  // way, relation
41737                   addChildVertices(entity);
41738               }
41739           });
41740
41741           return results;
41742       }
41743
41744
41745       function drawVertices(selection, graph, entities, filter, extent, fullRedraw) {
41746           var wireframe = context.surface().classed('fill-wireframe');
41747           var zoom = geoScaleToZoom(projection.scale());
41748           var mode = context.mode();
41749           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
41750
41751           var drawLayer = selection.selectAll('.layer-osm.points .points-group.vertices');
41752           var touchLayer = selection.selectAll('.layer-touch.points');
41753
41754           if (fullRedraw) {
41755               _currPersistent = {};
41756               _radii = {};
41757           }
41758
41759           // Collect important vertices from the `entities` list..
41760           // (during a paritial redraw, it will not contain everything)
41761           for (var i = 0; i < entities.length; i++) {
41762               var entity = entities[i];
41763               var geometry = entity.geometry(graph);
41764               var keep = false;
41765
41766               // a point that looks like a vertex..
41767               if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
41768                   _currPersistent[entity.id] = entity;
41769                   keep = true;
41770
41771               // a vertex of some importance..
41772               } else if (geometry === 'vertex' &&
41773                   (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
41774                   _currPersistent[entity.id] = entity;
41775                   keep = true;
41776               }
41777
41778               // whatever this is, it's not a persistent vertex..
41779               if (!keep && !fullRedraw) {
41780                   delete _currPersistent[entity.id];
41781               }
41782           }
41783
41784           // 3 sets of vertices to consider:
41785           var sets = {
41786               persistent: _currPersistent,  // persistent = important vertices (render always)
41787               selected: _currSelected,      // selected + siblings of selected (render always)
41788               hovered: _currHover           // hovered + siblings of hovered (render only in draw modes)
41789           };
41790
41791           var all = assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
41792
41793           // Draw the vertices..
41794           // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
41795           // Adjust the filter function to expand the scope beyond whatever entities were passed in.
41796           var filterRendered = function(d) {
41797               return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
41798           };
41799           drawLayer
41800               .call(draw, graph, currentVisible(all), sets, filterRendered);
41801
41802           // Draw touch targets..
41803           // When drawing, render all targets (not just those affected by a partial redraw)
41804           var filterTouch = function(d) {
41805               return isMoving ? true : filterRendered(d);
41806           };
41807           touchLayer
41808               .call(drawTargets, graph, currentVisible(all), filterTouch);
41809
41810
41811           function currentVisible(which) {
41812               return Object.keys(which)
41813                   .map(graph.hasEntity, graph)     // the current version of this entity
41814                   .filter(function (entity) { return entity && entity.intersects(extent, graph); });
41815           }
41816       }
41817
41818
41819       // partial redraw - only update the selected items..
41820       drawVertices.drawSelected = function(selection, graph, extent) {
41821           var wireframe = context.surface().classed('fill-wireframe');
41822           var zoom = geoScaleToZoom(projection.scale());
41823
41824           _prevSelected = _currSelected || {};
41825           _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
41826
41827           // note that drawVertices will add `_currSelected` automatically if needed..
41828           var filter = function(d) { return d.id in _prevSelected; };
41829           drawVertices(selection, graph, values$1(_prevSelected), filter, extent, false);
41830       };
41831
41832
41833       // partial redraw - only update the hovered items..
41834       drawVertices.drawHover = function(selection, graph, target, extent) {
41835           if (target === _currHoverTarget) return;  // continue only if something changed
41836
41837           var wireframe = context.surface().classed('fill-wireframe');
41838           var zoom = geoScaleToZoom(projection.scale());
41839
41840           _prevHover = _currHover || {};
41841           _currHoverTarget = target;
41842           var entity = target && target.properties && target.properties.entity;
41843
41844           if (entity) {
41845               _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
41846           } else {
41847               _currHover = {};
41848           }
41849
41850           // note that drawVertices will add `_currHover` automatically if needed..
41851           var filter = function(d) { return d.id in _prevHover; };
41852           drawVertices(selection, graph, values$1(_prevHover), filter, extent, false);
41853       };
41854
41855       return drawVertices;
41856   }
41857
41858   /* global Mapillary:false */
41859
41860
41861   var apibase = 'https://a.mapillary.com/v3/';
41862   var viewercss = 'mapillary-js/mapillary.min.css';
41863   var viewerjs = 'mapillary-js/mapillary.min.js';
41864   var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
41865   var maxResults = 1000;
41866   var tileZoom = 14;
41867   var tiler$2 = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true);
41868   var dispatch$3 = dispatch('loadedImages', 'loadedSigns', 'bearingChanged');
41869   var _mlyFallback = false;
41870   var _mlyCache;
41871   var _mlyClicks;
41872   var _mlySelectedImage;
41873   var _mlyViewer;
41874
41875
41876   function abortRequest$2(i) {
41877       i.abort();
41878   }
41879
41880
41881   function maxPageAtZoom(z) {
41882       if (z < 15)   return 2;
41883       if (z === 15) return 5;
41884       if (z === 16) return 10;
41885       if (z === 17) return 20;
41886       if (z === 18) return 40;
41887       if (z > 18)   return 80;
41888   }
41889
41890
41891   function loadTiles(which, url, projection) {
41892       var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
41893       var tiles = tiler$2.getTiles(projection);
41894
41895       // abort inflight requests that are no longer needed
41896       var cache = _mlyCache[which];
41897       forEach(cache.inflight, function(v, k) {
41898           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
41899
41900           if (!wanted) {
41901               abortRequest$2(v);
41902               delete cache.inflight[k];
41903           }
41904       });
41905
41906       tiles.forEach(function(tile) {
41907           loadNextTilePage(which, currZoom, url, tile);
41908       });
41909   }
41910
41911
41912   function loadNextTilePage(which, currZoom, url, tile) {
41913       var cache = _mlyCache[which];
41914       var rect = tile.extent.rectangle();
41915       var maxPages = maxPageAtZoom(currZoom);
41916       var nextPage = cache.nextPage[tile.id] || 0;
41917       var nextURL = cache.nextURL[tile.id] || url +
41918           utilQsString({
41919               per_page: maxResults,
41920               page: nextPage,
41921               client_id: clientId,
41922               bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
41923           });
41924
41925       if (nextPage > maxPages) return;
41926
41927       var id = tile.id + ',' + String(nextPage);
41928       if (cache.loaded[id] || cache.inflight[id]) return;
41929       cache.inflight[id] = request(nextURL)
41930           .mimeType('application/json')
41931           .response(function(xhr) {
41932               var linkHeader = xhr.getResponseHeader('Link');
41933               if (linkHeader) {
41934                   var pagination = parsePagination(xhr.getResponseHeader('Link'));
41935                   if (pagination.next) {
41936                       cache.nextURL[tile.id] = pagination.next;
41937                   }
41938               }
41939               return JSON.parse(xhr.responseText);
41940           })
41941           .get(function(err, data) {
41942               cache.loaded[id] = true;
41943               delete cache.inflight[id];
41944               if (err || !data.features || !data.features.length) return;
41945
41946               var features = data.features.map(function(feature) {
41947                   var loc = feature.geometry.coordinates;
41948                   var d;
41949
41950                   // An image (shown as a green dot on the map) is a single street photo with extra
41951                   // information such as location, camera angle (CA), camera model, and so on.
41952                   // Each image feature is a GeoJSON Point
41953                   if (which === 'images') {
41954                       d = {
41955                           loc: loc,
41956                           key: feature.properties.key,
41957                           ca: feature.properties.ca,
41958                           captured_at: feature.properties.captured_at,
41959                           captured_by: feature.properties.username,
41960                           pano: feature.properties.pano
41961                       };
41962
41963                       cache.forImageKey[d.key] = d;     // cache imageKey -> image
41964
41965                   // Mapillary organizes images as sequences. A sequence of images are continuously captured
41966                   // by a user at a give time. Sequences are shown on the map as green lines.
41967                   // Each sequence feature is a GeoJSON LineString
41968                   } else if (which === 'sequences') {
41969                       var sequenceKey = feature.properties.key;
41970                       cache.lineString[sequenceKey] = feature;           // cache sequenceKey -> lineString
41971                       feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
41972                           cache.forImageKey[imageKey] = sequenceKey;     // cache imageKey -> sequenceKey
41973                       });
41974                       return false;    // because no `d` data worth loading into an rbush
41975
41976                   // An image detection is a semantic pixel area on an image. The area could indicate
41977                   // sky, trees, sidewalk in the image. A detection can be a polygon, a bounding box, or a point.
41978                   // Each image_detection feature is a GeoJSON Point (located where the image was taken)
41979                   } else if (which === 'image_detections') {
41980                       d = {
41981                           key: feature.properties.key,
41982                           image_key: feature.properties.image_key,
41983                           value: feature.properties.value,
41984                           package: feature.properties.package,
41985                           shape: feature.properties.shape
41986                       };
41987
41988                       // cache imageKey -> image_detections
41989                       if (!cache.forImageKey[d.image_key]) {
41990                           cache.forImageKey[d.image_key] = [];
41991                       }
41992                       cache.forImageKey[d.image_key].push(d);
41993                       return false;    // because no `d` data worth loading into an rbush
41994
41995
41996                   // A map feature is a real world object that can be shown on a map. It could be any object
41997                   // recognized from images, manually added in images, or added on the map.
41998                   // Each map feature is a GeoJSON Point (located where the feature is)
41999                   } else if (which === 'map_features') {
42000                       d = {
42001                           loc: loc,
42002                           key: feature.properties.key,
42003                           value: feature.properties.value,
42004                           package: feature.properties.package,
42005                           detections: feature.properties.detections
42006                       };
42007                   }
42008
42009                   return {
42010                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
42011                   };
42012
42013               }).filter(Boolean);
42014
42015               if (cache.rtree && features) {
42016                   cache.rtree.load(features);
42017               }
42018
42019               if (which === 'images' || which === 'sequences') {
42020                   dispatch$3.call('loadedImages');
42021               } else if (which === 'map_features') {
42022                   dispatch$3.call('loadedSigns');
42023               }
42024
42025               if (data.features.length === maxResults) {  // more pages to load
42026                   cache.nextPage[tile.id] = nextPage + 1;
42027                   loadNextTilePage(which, currZoom, url, tile);
42028               } else {
42029                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
42030               }
42031           });
42032   }
42033
42034   // extract links to pages of API results
42035   function parsePagination(links) {
42036       return links.split(',').map(function(rel) {
42037           var elements = rel.split(';');
42038           if (elements.length === 2) {
42039               return [
42040                   /<(.+)>/.exec(elements[0])[1],
42041                   /rel="(.+)"/.exec(elements[1])[1]
42042               ];
42043           } else {
42044               return ['',''];
42045           }
42046       }).reduce(function(pagination, val) {
42047           pagination[val[1]] = val[0];
42048           return pagination;
42049       }, {});
42050   }
42051
42052
42053   // partition viewport into higher zoom tiles
42054   function partitionViewport(projection) {
42055       var z = geoScaleToZoom(projection.scale());
42056       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
42057       var tiler = utilTiler().zoomExtent([z2, z2]);
42058
42059       return tiler.getTiles(projection)
42060           .map(function(tile) { return tile.extent; });
42061   }
42062
42063
42064   // no more than `limit` results per partition.
42065   function searchLimited(limit, projection, rtree) {
42066       limit = limit || 5;
42067
42068       return partitionViewport(projection)
42069           .reduce(function(result, extent) {
42070               var found = rtree.search(extent.bbox())
42071                   .slice(0, limit)
42072                   .map(function(d) { return d.data; });
42073
42074               return (found.length ? result.concat(found) : result);
42075           }, []);
42076   }
42077
42078
42079
42080   var serviceMapillary = {
42081
42082       init: function() {
42083           if (!_mlyCache) {
42084               this.reset();
42085           }
42086
42087           this.event = utilRebind(this, dispatch$3, 'on');
42088       },
42089
42090       reset: function() {
42091           var cache = _mlyCache;
42092
42093           if (cache) {
42094               if (cache.images && cache.images.inflight) {
42095                   forEach(cache.images.inflight, abortRequest$2);
42096               }
42097               if (cache.image_detections && cache.image_detections.inflight) {
42098                   forEach(cache.image_detections.inflight, abortRequest$2);
42099               }
42100               if (cache.map_features && cache.map_features.inflight) {
42101                   forEach(cache.map_features.inflight, abortRequest$2);
42102               }
42103               if (cache.sequences && cache.sequences.inflight) {
42104                   forEach(cache.sequences.inflight, abortRequest$2);
42105               }
42106           }
42107
42108           _mlyCache = {
42109               images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
42110               image_detections: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, forImageKey: {} },
42111               map_features: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
42112               sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} }
42113           };
42114
42115           _mlySelectedImage = null;
42116           _mlyClicks = [];
42117       },
42118
42119
42120       images: function(projection) {
42121           var limit = 5;
42122           return searchLimited(limit, projection, _mlyCache.images.rtree);
42123       },
42124
42125
42126       signs: function(projection) {
42127           var limit = 5;
42128           return searchLimited(limit, projection, _mlyCache.map_features.rtree);
42129       },
42130
42131
42132       sequences: function(projection) {
42133           var viewport = projection.clipExtent();
42134           var min = [viewport[0][0], viewport[1][1]];
42135           var max = [viewport[1][0], viewport[0][1]];
42136           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
42137           var sequenceKeys = {};
42138
42139           // all sequences for images in viewport
42140           _mlyCache.images.rtree.search(bbox)
42141               .forEach(function(d) {
42142                   var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
42143                   if (sequenceKey) {
42144                       sequenceKeys[sequenceKey] = true;
42145                   }
42146               });
42147
42148           // Return lineStrings for the sequences
42149           return Object.keys(sequenceKeys).map(function(sequenceKey) {
42150               return _mlyCache.sequences.lineString[sequenceKey];
42151           });
42152       },
42153
42154
42155       signsSupported: function() {
42156           return true;
42157       },
42158
42159
42160       loadImages: function(projection) {
42161           loadTiles('images', apibase + 'images?', projection);
42162           loadTiles('sequences', apibase + 'sequences?', projection);
42163       },
42164
42165
42166       loadSigns: function(context, projection) {
42167           // if we are looking at signs, we'll actually need to fetch images too
42168           loadTiles('images', apibase + 'images?', projection);
42169           loadTiles('map_features', apibase + 'map_features?layers=trafficsigns&min_nbr_image_detections=1&', projection);
42170           loadTiles('image_detections', apibase + 'image_detections?layers=trafficsigns&', projection);
42171       },
42172
42173
42174       loadViewer: function(context) {
42175           // add mly-wrapper
42176           var wrap = select('#photoviewer').selectAll('.mly-wrapper')
42177               .data([0]);
42178
42179           wrap.enter()
42180               .append('div')
42181               .attr('id', 'mly')
42182               .attr('class', 'photo-wrapper mly-wrapper')
42183               .classed('hide', true);
42184
42185           // load mapillary-viewercss
42186           select('head').selectAll('#mapillary-viewercss')
42187               .data([0])
42188               .enter()
42189               .append('link')
42190               .attr('id', 'mapillary-viewercss')
42191               .attr('rel', 'stylesheet')
42192               .attr('href', context.asset(viewercss));
42193
42194           // load mapillary-viewerjs
42195           select('head').selectAll('#mapillary-viewerjs')
42196               .data([0])
42197               .enter()
42198               .append('script')
42199               .attr('id', 'mapillary-viewerjs')
42200               .attr('src', context.asset(viewerjs));
42201
42202           // load mapillary signs sprite
42203           var defs = context.container().select('defs');
42204           defs.call(svgDefs(context).addSprites, ['mapillary-sprite'], false /* don't override colors */ );
42205
42206           // Register viewer resize handler
42207           context.ui().photoviewer.on('resize', function() {
42208               if (_mlyViewer) {
42209                   _mlyViewer.resize();
42210               }
42211           });
42212       },
42213
42214
42215       showViewer: function() {
42216           var wrap = select('#photoviewer')
42217               .classed('hide', false);
42218
42219           var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
42220
42221           if (isHidden && _mlyViewer) {
42222               wrap
42223                   .selectAll('.photo-wrapper:not(.mly-wrapper)')
42224                   .classed('hide', true);
42225
42226               wrap
42227                   .selectAll('.photo-wrapper.mly-wrapper')
42228                   .classed('hide', false);
42229
42230               _mlyViewer.resize();
42231           }
42232
42233           return this;
42234       },
42235
42236
42237       hideViewer: function() {
42238           _mlySelectedImage = null;
42239
42240           if (!_mlyFallback && _mlyViewer) {
42241               _mlyViewer.getComponent('sequence').stop();
42242           }
42243
42244           var viewer = select('#photoviewer');
42245           if (!viewer.empty()) viewer.datum(null);
42246
42247           viewer
42248               .classed('hide', true)
42249               .selectAll('.photo-wrapper')
42250               .classed('hide', true);
42251
42252           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
42253               .classed('currentView', false);
42254
42255           return this.setStyles(null, true);
42256       },
42257
42258
42259       parsePagination: parsePagination,
42260
42261
42262       updateViewer: function(imageKey, context) {
42263           if (!imageKey) return this;
42264
42265           if (!_mlyViewer) {
42266               this.initViewer(imageKey, context);
42267           } else {
42268               _mlyViewer.moveToKey(imageKey)
42269                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
42270           }
42271
42272           return this;
42273       },
42274
42275
42276       initViewer: function(imageKey, context) {
42277           var that = this;
42278           if (window.Mapillary && imageKey) {
42279               var opts = {
42280                   baseImageSize: 320,
42281                   component: {
42282                       cover: false,
42283                       keyboard: false,
42284                       tag: true
42285                   }
42286               };
42287
42288               // Disable components requiring WebGL support
42289               if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
42290                   _mlyFallback = true;
42291                   opts.component = {
42292                       cover: false,
42293                       direction: false,
42294                       imagePlane: false,
42295                       keyboard: false,
42296                       mouse: false,
42297                       sequence: false,
42298                       tag: false,
42299                       image: true,        // fallback
42300                       navigation: true    // fallback
42301                   };
42302               }
42303
42304               _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
42305               _mlyViewer.on('nodechanged', nodeChanged);
42306               _mlyViewer.on('bearingchanged', bearingChanged);
42307               _mlyViewer.moveToKey(imageKey)
42308                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
42309           }
42310
42311           // nodeChanged: called after the viewer has changed images and is ready.
42312           //
42313           // There is some logic here to batch up clicks into a _mlyClicks array
42314           // because the user might click on a lot of markers quickly and nodechanged
42315           // may be called out of order asychronously.
42316           //
42317           // Clicks are added to the array in `selectedImage` and removed here.
42318           //
42319           function nodeChanged(node) {
42320               if (!_mlyFallback) {
42321                   _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
42322               }
42323
42324               var clicks = _mlyClicks;
42325               var index = clicks.indexOf(node.key);
42326               var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
42327
42328               if (index > -1) {              // `nodechanged` initiated from clicking on a marker..
42329                   clicks.splice(index, 1);   // remove the click
42330                   // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
42331                   // one more time to update the detections and attribution..
42332                   if (node.key === selectedKey) {
42333                       that.selectImage(_mlySelectedImage, node.key, true);
42334                   }
42335               } else {             // `nodechanged` initiated from the Mapillary viewer controls..
42336                   var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
42337                   context.map().centerEase(loc);
42338                   that.selectImage(undefined, node.key, true);
42339               }
42340           }
42341
42342           function bearingChanged(e) {
42343               dispatch$3.call('bearingChanged', undefined, e);
42344           }
42345       },
42346
42347
42348       // Pass the image datum itself in `d` or the `imageKey` string.
42349       // This allows images to be selected from places that dont have access
42350       // to the full image datum (like the street signs layer or the js viewer)
42351       selectImage: function(d, imageKey, fromViewer) {
42352           if (!d && imageKey) {
42353               // If the user clicked on something that's not an image marker, we
42354               // might get in here.. Cache lookup can fail, e.g. if the user
42355               // clicked a streetsign, but images are loading slowly asynchronously.
42356               // We'll try to carry on anyway if there is no datum.  There just
42357               // might be a delay before user sees detections, captured_at, etc.
42358               d = _mlyCache.images.forImageKey[imageKey];
42359           }
42360
42361           _mlySelectedImage = d;
42362           var viewer = select('#photoviewer');
42363           if (!viewer.empty()) viewer.datum(d);
42364
42365           imageKey = (d && d.key) || imageKey;
42366           if (!fromViewer && imageKey) {
42367               _mlyClicks.push(imageKey);
42368           }
42369
42370           this.setStyles(null, true);
42371
42372           // if signs signs are shown, highlight the ones that appear in this image
42373           d3_selectAll('.layer-mapillary-signs .icon-sign')
42374               .classed('currentView', function(d) {
42375                   return some(d.detections, function(detection) {
42376                       return detection.image_key === imageKey;
42377                   });
42378               });
42379
42380           if (d) {
42381               this.updateDetections(d);
42382           }
42383
42384           return this;
42385       },
42386
42387
42388       getSelectedImage: function() {
42389           return _mlySelectedImage;
42390       },
42391
42392
42393       getSequenceKeyForImage: function(d) {
42394           var imageKey = d && d.key;
42395           return imageKey && _mlyCache.sequences.forImageKey[imageKey];
42396       },
42397
42398
42399       // Updates the currently highlighted sequence and selected bubble.
42400       // Reset is only necessary when interacting with the viewport because
42401       // this implicitly changes the currently selected bubble/sequence
42402       setStyles: function(hovered, reset) {
42403           if (reset) {  // reset all layers
42404               d3_selectAll('.viewfield-group')
42405                   .classed('highlighted', false)
42406                   .classed('hovered', false)
42407                   .classed('currentView', false);
42408
42409               d3_selectAll('.sequence')
42410                   .classed('highlighted', false)
42411                   .classed('currentView', false);
42412           }
42413
42414           var hoveredImageKey = hovered && hovered.key;
42415           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
42416           var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
42417           var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
42418
42419           var viewer = select('#photoviewer');
42420           var selected = viewer.empty() ? undefined : viewer.datum();
42421           var selectedImageKey = selected && selected.key;
42422           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
42423           var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
42424           var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
42425
42426           // highlight sibling viewfields on either the selected or the hovered sequences
42427           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
42428
42429           d3_selectAll('.layer-mapillary-images .viewfield-group')
42430               .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
42431               .classed('hovered', function(d) { return d.key === hoveredImageKey; })
42432               .classed('currentView', function(d) { return d.key === selectedImageKey; });
42433
42434           d3_selectAll('.layer-mapillary-images .sequence')
42435               .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
42436               .classed('currentView', function(d) { return d.properties.key === selectedSequenceKey; });
42437
42438           // update viewfields if needed
42439           d3_selectAll('.viewfield-group .viewfield')
42440               .attr('d', viewfieldPath);
42441
42442           function viewfieldPath() {
42443               var d = this.parentNode.__data__;
42444               if (d.pano && d.key !== selectedImageKey) {
42445                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
42446               } else {
42447                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
42448               }
42449           }
42450
42451           return this;
42452       },
42453
42454
42455       updateDetections: function(d) {
42456           if (!_mlyViewer || _mlyFallback) return;
42457
42458           var imageKey = d && d.key;
42459           if (!imageKey) return;
42460
42461           var detections = _mlyCache.image_detections.forImageKey[imageKey] || [];
42462           detections.forEach(function(data) {
42463               var tag = makeTag(data);
42464               if (tag) {
42465                   var tagComponent = _mlyViewer.getComponent('tag');
42466                   tagComponent.add([tag]);
42467               }
42468           });
42469
42470           function makeTag(data) {
42471               var valueParts = data.value.split('--');
42472               if (valueParts.length !== 3) return;
42473
42474               var text = valueParts[1].replace(/-/g, ' ');
42475               var tag;
42476
42477               // Currently only two shapes <Polygon|Point>
42478               if (data.shape.type === 'Polygon') {
42479                   var polygonGeometry = new Mapillary
42480                       .TagComponent
42481                       .PolygonGeometry(data.shape.coordinates[0]);
42482
42483                   tag = new Mapillary.TagComponent.OutlineTag(
42484                       data.key,
42485                       polygonGeometry,
42486                       {
42487                           text: text,
42488                           textColor: 0xffff00,
42489                           lineColor: 0xffff00,
42490                           lineWidth: 2,
42491                           fillColor: 0xffff00,
42492                           fillOpacity: 0.3,
42493                       }
42494                   );
42495
42496               } else if (data.shape.type === 'Point') {
42497                   var pointGeometry = new Mapillary
42498                       .TagComponent
42499                       .PointGeometry(data.shape.coordinates[0]);
42500
42501                   tag = new Mapillary.TagComponent.SpotTag(
42502                       data.key,
42503                       pointGeometry,
42504                       {
42505                           text: text,
42506                           color: 0xffff00,
42507                           textColor: 0xffff00
42508                       }
42509                   );
42510               }
42511
42512               return tag;
42513           }
42514       },
42515
42516
42517       cache: function() {
42518           return _mlyCache;
42519       }
42520
42521   };
42522
42523   /**
42524    * Performs a partial deep comparison between `object` and `source` to
42525    * determine if `object` contains equivalent property values.
42526    *
42527    * **Note:** This method is equivalent to `_.matches` when `source` is
42528    * partially applied.
42529    *
42530    * Partial comparisons will match empty array and empty object `source`
42531    * values against any array or object value, respectively. See `_.isEqual`
42532    * for a list of supported value comparisons.
42533    *
42534    * @static
42535    * @memberOf _
42536    * @since 3.0.0
42537    * @category Lang
42538    * @param {Object} object The object to inspect.
42539    * @param {Object} source The object of property values to match.
42540    * @returns {boolean} Returns `true` if `object` is a match, else `false`.
42541    * @example
42542    *
42543    * var object = { 'a': 1, 'b': 2 };
42544    *
42545    * _.isMatch(object, { 'b': 2 });
42546    * // => true
42547    *
42548    * _.isMatch(object, { 'b': 1 });
42549    * // => false
42550    */
42551   function isMatch(object, source) {
42552     return object === source || baseIsMatch(object, source, getMatchData(source));
42553   }
42554
42555   /* Built-in method references for those with the same name as other `lodash` methods. */
42556   var nativeMin$1 = Math.min;
42557
42558   /**
42559    * The base implementation of methods like `_.intersection`, without support
42560    * for iteratee shorthands, that accepts an array of arrays to inspect.
42561    *
42562    * @private
42563    * @param {Array} arrays The arrays to inspect.
42564    * @param {Function} [iteratee] The iteratee invoked per element.
42565    * @param {Function} [comparator] The comparator invoked per element.
42566    * @returns {Array} Returns the new array of shared values.
42567    */
42568   function baseIntersection(arrays, iteratee, comparator) {
42569     var includes = comparator ? arrayIncludesWith : arrayIncludes,
42570         length = arrays[0].length,
42571         othLength = arrays.length,
42572         othIndex = othLength,
42573         caches = Array(othLength),
42574         maxLength = Infinity,
42575         result = [];
42576
42577     while (othIndex--) {
42578       var array = arrays[othIndex];
42579       if (othIndex && iteratee) {
42580         array = arrayMap(array, baseUnary(iteratee));
42581       }
42582       maxLength = nativeMin$1(array.length, maxLength);
42583       caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
42584         ? new SetCache(othIndex && array)
42585         : undefined;
42586     }
42587     array = arrays[0];
42588
42589     var index = -1,
42590         seen = caches[0];
42591
42592     outer:
42593     while (++index < length && result.length < maxLength) {
42594       var value = array[index],
42595           computed = iteratee ? iteratee(value) : value;
42596
42597       value = (comparator || value !== 0) ? value : 0;
42598       if (!(seen
42599             ? cacheHas(seen, computed)
42600             : includes(result, computed, comparator)
42601           )) {
42602         othIndex = othLength;
42603         while (--othIndex) {
42604           var cache = caches[othIndex];
42605           if (!(cache
42606                 ? cacheHas(cache, computed)
42607                 : includes(arrays[othIndex], computed, comparator))
42608               ) {
42609             continue outer;
42610           }
42611         }
42612         if (seen) {
42613           seen.push(computed);
42614         }
42615         result.push(value);
42616       }
42617     }
42618     return result;
42619   }
42620
42621   /**
42622    * Casts `value` to an empty array if it's not an array like object.
42623    *
42624    * @private
42625    * @param {*} value The value to inspect.
42626    * @returns {Array|Object} Returns the cast array-like object.
42627    */
42628   function castArrayLikeObject(value) {
42629     return isArrayLikeObject(value) ? value : [];
42630   }
42631
42632   /**
42633    * Creates an array of unique values that are included in all given arrays
42634    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
42635    * for equality comparisons. The order and references of result values are
42636    * determined by the first array.
42637    *
42638    * @static
42639    * @memberOf _
42640    * @since 0.1.0
42641    * @category Array
42642    * @param {...Array} [arrays] The arrays to inspect.
42643    * @returns {Array} Returns the new array of intersecting values.
42644    * @example
42645    *
42646    * _.intersection([2, 1], [2, 3]);
42647    * // => [2]
42648    */
42649   var intersection = baseRest(function(arrays) {
42650     var mapped = arrayMap(arrays, castArrayLikeObject);
42651     return (mapped.length && mapped[0] === arrays[0])
42652       ? baseIntersection(mapped)
42653       : [];
42654   });
42655
42656   /** Used as references for various `Number` constants. */
42657   var INFINITY$4 = 1 / 0;
42658
42659   /**
42660    * Recursively flattens `array`.
42661    *
42662    * @static
42663    * @memberOf _
42664    * @since 3.0.0
42665    * @category Array
42666    * @param {Array} array The array to flatten.
42667    * @returns {Array} Returns the new flattened array.
42668    * @example
42669    *
42670    * _.flattenDeep([1, [2, [3, [4]], 5]]);
42671    * // => [1, 2, 3, 4, 5]
42672    */
42673   function flattenDeep(array) {
42674     var length = array == null ? 0 : array.length;
42675     return length ? baseFlatten(array, INFINITY$4) : [];
42676   }
42677
42678   /**
42679    * Look for roads that can be connected to other roads with a short extension
42680    */
42681   function validationAlmostJunction() {
42682       var type = 'almost_junction';
42683
42684
42685       function isHighway(entity) {
42686           return entity.type === 'way' &&
42687               entity.tags.highway &&
42688               entity.tags.highway !== 'no' &&
42689               entity.tags.highway !== 'proposed';
42690       }
42691
42692       function isNoexit(node) {
42693           return node.tags.noexit && node.tags.noexit === 'yes';
42694       }
42695
42696       function isExtendableCandidate(node, way, graph) {
42697           if (isNoexit(node) || graph.parentWays(node).length !== 1) {
42698               return false;
42699           }
42700           var occurences = 0;
42701           for (var index in way.nodes) {
42702               if (way.nodes[index] === node.id) {
42703                   occurences += 1;
42704                   if (occurences > 1) {
42705                       return false;
42706                   }
42707               }
42708           }
42709           return true;
42710       }
42711
42712       function findConnectableEndNodesByExtension(way, graph, tree) {
42713
42714           var results = [];
42715
42716           if (way.isClosed()) return results;
42717
42718           var nidFirst = way.nodes[0];
42719           var nidLast = way.nodes[way.nodes.length - 1];
42720           var nodeFirst = graph.entity(nidFirst);
42721           var nodeLast = graph.entity(nidLast);
42722
42723           var testNodes;
42724
42725           if (isExtendableCandidate(nodeFirst, way, graph)) {
42726               var connNearFirst = canConnectByExtend(way, 0, graph, tree);
42727               if (connNearFirst !== null) {
42728                   testNodes = cloneDeep(graph.childNodes(way));
42729                   testNodes[0].loc = connNearFirst.cross_loc;
42730                   // don't flag issue if connecting the ways would cause self-intersection
42731                   if (!geoHasSelfIntersections(testNodes, nodeFirst.id)) {
42732                       results.push({
42733                           node: nodeFirst,
42734                           wid: connNearFirst.wid,
42735                           edge: connNearFirst.edge,
42736                           cross_loc: connNearFirst.cross_loc
42737                       });
42738                   }
42739               }
42740           }
42741
42742           if (isExtendableCandidate(nodeLast, way, graph)) {
42743               var connNearLast = canConnectByExtend(way, way.nodes.length - 1, graph, tree);
42744               if (connNearLast !== null) {
42745                   testNodes = cloneDeep(graph.childNodes(way));
42746                   testNodes[testNodes.length-1].loc = connNearLast.cross_loc;
42747                   // don't flag issue if connecting the ways would cause self-intersection
42748                   if (!geoHasSelfIntersections(testNodes, nodeLast.id)) {
42749                       results.push({
42750                           node: nodeLast,
42751                           wid: connNearLast.wid,
42752                           edge: connNearLast.edge,
42753                           cross_loc: connNearLast.cross_loc
42754                       });
42755                   }
42756               }
42757           }
42758           return results;
42759       }
42760
42761
42762       function canConnectByExtend(way, endNodeIdx, graph, tree) {
42763           var EXTEND_TH_METERS = 5;
42764           var tipNid = way.nodes[endNodeIdx];  // the 'tip' node for extension point
42765           var midNid = endNodeIdx === 0 ? way.nodes[1] : way.nodes[way.nodes.length - 2];  // the other node of the edge
42766           var tipNode = graph.entity(tipNid);
42767           var midNode = graph.entity(midNid);
42768           var lon = tipNode.loc[0];
42769           var lat = tipNode.loc[1];
42770           var lon_range = geoMetersToLon(EXTEND_TH_METERS, lat) / 2;
42771           var lat_range = geoMetersToLat(EXTEND_TH_METERS) / 2;
42772           var queryExtent = geoExtent([
42773               [lon - lon_range, lat - lat_range],
42774               [lon + lon_range, lat + lat_range]
42775           ]);
42776
42777           // first, extend the edge of [midNode -> tipNode] by EXTEND_TH_METERS and find the "extended tip" location
42778           var edgeLen = geoSphericalDistance(midNode.loc, tipNode.loc);
42779           var t = EXTEND_TH_METERS / edgeLen + 1.0;
42780           var extTipLoc = geoVecInterp(midNode.loc, tipNode.loc, t);
42781
42782           // then, check if the extension part [tipNode.loc -> extTipLoc] intersects any other ways
42783           var intersected = tree.intersects(queryExtent, graph);
42784           for (var i = 0; i < intersected.length; i++) {
42785               if (!isHighway(intersected[i]) || intersected[i].id === way.id) continue;
42786
42787               var way2 = intersected[i];
42788               for (var j = 0; j < way2.nodes.length - 1; j++) {
42789                   var nA = graph.entity(way2.nodes[j]);
42790                   var nB = graph.entity(way2.nodes[j + 1]);
42791                   var crossLoc = geoLineIntersection([tipNode.loc, extTipLoc], [nA.loc, nB.loc]);
42792                   if (crossLoc !== null) {
42793                       return {
42794                           wid: way2.id,
42795                           edge: [nA.id, nB.id],
42796                           cross_loc: crossLoc
42797                       };
42798                   }
42799               }
42800           }
42801           return null;
42802       }
42803
42804
42805       var validation = function(endHighway, context) {
42806           if (!isHighway(endHighway)) return [];
42807
42808           var graph = context.graph();
42809           var tree = context.history().tree();
42810           var issues = [];
42811
42812           var extendableNodeInfos = findConnectableEndNodesByExtension(endHighway, graph, tree);
42813           extendableNodeInfos.forEach(function(extendableNodeInfo) {
42814               var node = extendableNodeInfo.node;
42815               var edgeHighway = graph.entity(extendableNodeInfo.wid);
42816
42817               var fixes = [new validationIssueFix({
42818                   icon: 'iD-icon-abutment',
42819                   title: t('issues.fix.connect_features.title'),
42820                   onClick: function() {
42821                       var endNode = this.issue.entities[1];
42822                       var targetEdge = this.issue.info.edge;
42823                       var crossLoc = this.issue.info.cross_loc;
42824                       var edgeNodes = [context.graph().entity(targetEdge[0]), context.graph().entity(targetEdge[1])];
42825                       var closestNodeInfo = geoSphericalClosestNode(edgeNodes, crossLoc);
42826
42827                       var annotation = t('issues.fix.connect_almost_junction.annotation');
42828                       // already a point nearby, just connect to that
42829                       if (closestNodeInfo.distance < 0.75) {
42830                           context.perform(
42831                               actionMergeNodes([closestNodeInfo.node.id, endNode.id], closestNodeInfo.node.loc),
42832                               annotation
42833                           );
42834                       // else add the end node to the edge way
42835                       } else {
42836                           context.perform(
42837                               actionAddMidpoint({loc: crossLoc, edge: targetEdge}, endNode),
42838                               annotation
42839                           );
42840                       }
42841                   }
42842               })];
42843
42844               if (Object.keys(node.tags).length === 0) {
42845                   // node has no tags, suggest noexit fix
42846                   fixes.push(new validationIssueFix({
42847                       icon: 'maki-barrier',
42848                       title: t('issues.fix.tag_as_disconnected.title'),
42849                       onClick: function() {
42850                           var nodeID = this.issue.entities[1].id;
42851                           context.perform(
42852                               actionChangeTags(nodeID, { noexit: 'yes' }),
42853                               t('issues.fix.tag_as_disconnected.annotation')
42854                           );
42855                       }
42856                   }));
42857               }
42858
42859               issues.push(new validationIssue({
42860                   type: type,
42861                   severity: 'warning',
42862                   message: t('issues.almost_junction.message', {
42863                       feature: utilDisplayLabel(endHighway, context),
42864                       feature2: utilDisplayLabel(edgeHighway, context)
42865                   }),
42866                   tooltip: t('issues.almost_junction.highway-highway.tip'),
42867                   entities: [endHighway, node, edgeHighway],
42868                   loc: extendableNodeInfo.node.loc,
42869                   info: {
42870                       edge: extendableNodeInfo.edge,
42871                       cross_loc: extendableNodeInfo.cross_loc
42872                   },
42873                   fixes: fixes
42874               }));
42875           });
42876
42877           return issues;
42878       };
42879
42880       validation.type = type;
42881
42882       return validation;
42883   }
42884
42885   function validationCrossingWays() {
42886       var type = 'crossing_ways';
42887
42888       /*
42889       Avoid duplicate work by cacheing issues. The same issues live under two paths.
42890       {
42891           w-123: {
42892               w-456: [{issue1}, {issue2}…]
42893           },
42894           w-456: {
42895               w-123: [{issue1}, {issue2}…]
42896           }
42897       }
42898       */
42899       var issueCache = {};
42900
42901       // returns the way or its parent relation, whichever has a useful feature type
42902       function getFeatureWithFeatureTypeTagsForWay(way, graph) {
42903           if (getFeatureTypeForTags(way.tags) === null) {
42904               // if the way doesn't match a feature type, check its parent relations
42905               var parentRels = graph.parentRelations(way);
42906               for (var i = 0; i < parentRels.length; i++) {
42907                   var rel = parentRels[i];
42908                   if (getFeatureTypeForTags(rel.tags) !== null) {
42909                       return rel;
42910                   }
42911               }
42912           }
42913           return way;
42914       }
42915
42916
42917       function hasTag(tags, key) {
42918           return tags[key] !== undefined && tags[key] !== 'no';
42919       }
42920
42921       function tagsImplyIndoors(tags) {
42922           return hasTag(tags, 'level') || tags.highway === 'corridor';
42923       }
42924
42925       function allowsStructures(featureType) {
42926           return allowsBridge(featureType) || allowsTunnel(featureType);
42927       }
42928       function allowsBridge(featureType) {
42929           return featureType === 'highway' || featureType === 'railway' || featureType === 'waterway';
42930       }
42931       function allowsTunnel(featureType) {
42932           return featureType === 'highway' || featureType === 'railway' || featureType === 'waterway';
42933       }
42934       function canCover(featureType) {
42935           return featureType === 'building';
42936       }
42937
42938
42939       function getFeatureTypeForCrossingCheck(way, graph) {
42940           var tags = getFeatureWithFeatureTypeTagsForWay(way, graph).tags;
42941           return getFeatureTypeForTags(tags);
42942       }
42943
42944
42945       // only validate certain waterway and railway features
42946       var waterways = ['canal', 'ditch', 'drain', 'river', 'stream'];
42947       var railways = ['rail', 'disused', 'tram', 'subway', 'narrow_gauge', 'light_rail',
42948                       'preserved', 'miniature', 'monorail', 'funicular'];
42949       // ignore certain highway and building features
42950       var ignoredHighways = ['rest_area', 'services', 'proposed', 'razed'];
42951       var ignoredBuildings = ['proposed', 'razed'];
42952
42953
42954       function getFeatureTypeForTags(tags) {
42955           if (hasTag(tags, 'building') && ignoredBuildings.indexOf(tags.building) === -1) return 'building';
42956
42957           // don't check non-building areas
42958           if (hasTag(tags, 'area')) return null;
42959
42960           if (hasTag(tags, 'highway') && ignoredHighways.indexOf(tags.highway) === -1) return 'highway';
42961           if (hasTag(tags, 'railway') && railways.indexOf(tags.railway) !== -1) return 'railway';
42962           if (hasTag(tags, 'waterway') && waterways.indexOf(tags.waterway) !== -1) return 'waterway';
42963
42964           return null;
42965       }
42966
42967
42968       function isLegitCrossing(way1, featureType1, way2, featureType2) {
42969           var tags1 = way1.tags;
42970           var tags2 = way2.tags;
42971
42972           // assume 0 by default
42973           var level1 = tags1.level || '0';
42974           var level2 = tags2.level || '0';
42975
42976           if (tagsImplyIndoors(tags1) && tagsImplyIndoors(tags2) && level1 !== level2) {
42977               // assume features don't interact if they're indoor on different levels
42978               return true;
42979           }
42980
42981           // assume 0 by default; don't use way.layer() since we account for structures here
42982           var layer1 = tags1.layer || '0';
42983           var layer2 = tags2.layer || '0';
42984
42985           if (allowsBridge(featureType1) && allowsBridge(featureType2)) {
42986               if (hasTag(tags1, 'bridge') && !hasTag(tags2, 'bridge')) return true;
42987               if (!hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge')) return true;
42988               // crossing bridges must use different layers
42989               if (hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge') && layer1 !== layer2) return true;
42990           } else if (allowsBridge(featureType1) && hasTag(tags1, 'bridge')) return true;
42991           else if (allowsBridge(featureType2) && hasTag(tags2, 'bridge')) return true;
42992
42993           if (allowsTunnel(featureType1) && allowsTunnel(featureType2)) {
42994               if (hasTag(tags1, 'tunnel') && !hasTag(tags2, 'tunnel')) return true;
42995               if (!hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel')) return true;
42996               // crossing tunnels must use different layers
42997               if (hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel') && layer1 !== layer2) return true;
42998           } else if (allowsTunnel(featureType1) && hasTag(tags1, 'tunnel')) return true;
42999           else if (allowsTunnel(featureType2) && hasTag(tags2, 'tunnel')) return true;
43000
43001           if (canCover(featureType1) && canCover(featureType2)) {
43002               if (hasTag(tags1, 'covered') && !hasTag(tags2, 'covered')) return true;
43003               if (!hasTag(tags1, 'covered') && hasTag(tags2, 'covered')) return true;
43004               // crossing covered features that can themselves cover must use different layers
43005               if (hasTag(tags1, 'covered') && hasTag(tags2, 'covered') && layer1 !== layer2) return true;
43006           } else if (canCover(featureType1) && hasTag(tags2, 'covered')) return true;
43007           else if (canCover(featureType2) && hasTag(tags1, 'covered')) return true;
43008
43009           if (!allowsStructures(featureType1) && !allowsStructures(featureType2)) {
43010               // if no structures are applicable, the layers must be different
43011               if (layer1 !== layer2) return true;
43012           }
43013           return false;
43014       }
43015
43016
43017       // highway values for which we shouldn't recommend connecting to waterways
43018       var highwaysDisallowingFords = [
43019           'motorway', 'motorway_link', 'trunk', 'trunk_link',
43020           'primary', 'primary_link', 'secondary', 'secondary_link'
43021       ];
43022       var pathHighways = [
43023           'path', 'footway', 'cycleway', 'bridleway', 'pedestrian', 'steps', 'corridor'
43024       ];
43025
43026       function tagsForConnectionNodeIfAllowed(entity1, entity2) {
43027           var featureType1 = getFeatureTypeForTags(entity1.tags);
43028           var featureType2 = getFeatureTypeForTags(entity2.tags);
43029           if (featureType1 === featureType2) {
43030               if (featureType1 === 'highway') {
43031                   var entity1IsPath = pathHighways.indexOf(entity1.tags.highway) !== -1;
43032                   var entity2IsPath = pathHighways.indexOf(entity2.tags.highway) !== -1;
43033                   if ((entity1IsPath || entity2IsPath) && entity1IsPath !== entity2IsPath) {
43034                       // one feature is a path but not both, use a crossing
43035
43036                       var pathFeature = entity1IsPath ? entity1 : entity2;
43037                       if (pathFeature.tags.highway === 'footway' &&
43038                           pathFeature.tags.footway === 'crossing' &&
43039                           ['marked', 'unmarked'].indexOf(pathFeature.tags.crossing) !== -1) {
43040                           // if the path is a crossing, match the crossing type
43041                           return { highway: 'crossing', crossing: pathFeature.tags.crossing };
43042                       }
43043                       return { highway: 'crossing' };
43044                   }
43045                   return {};
43046               }
43047               if (featureType1 === 'waterway') return {};
43048               if (featureType1 === 'railway') return {};
43049
43050           } else {
43051               var featureTypes = [featureType1, featureType2];
43052               if (featureTypes.indexOf('highway') !== -1) {
43053                   if (featureTypes.indexOf('railway') !== -1) {
43054                       if (pathHighways.indexOf(entity1.tags.highway) !== -1 ||
43055                           pathHighways.indexOf(entity2.tags.highway) !== -1) {
43056                           // path-rail connections use this tag
43057                           return { railway: 'crossing' };
43058                       } else {
43059                           // road-rail connections use this tag
43060                           return { railway: 'level_crossing' };
43061                       }
43062                   }
43063
43064                   if (featureTypes.indexOf('waterway') !== -1) {
43065                       // do not allow fords on structures
43066                       if (hasTag(entity1.tags, 'tunnel') && hasTag(entity2.tags, 'tunnel')) return null;
43067                       if (hasTag(entity1.tags, 'bridge') && hasTag(entity2.tags, 'bridge')) return null;
43068
43069                       if (highwaysDisallowingFords.indexOf(entity1.tags.highway) !== -1 ||
43070                           highwaysDisallowingFords.indexOf(entity2.tags.highway) !== -1) {
43071                           // do not allow fords on major highways
43072                           return null;
43073                       }
43074                       return { ford: 'yes' };
43075                   }
43076               }
43077           }
43078           return null;
43079       }
43080
43081
43082       function findCrossingsByWay(way1, graph, tree) {
43083
43084           var edgeCrossInfos = [];
43085           if (way1.type !== 'way') return edgeCrossInfos;
43086
43087           var way1FeatureType = getFeatureTypeForCrossingCheck(way1, graph);
43088           if (way1FeatureType === null) return edgeCrossInfos;
43089
43090           var checkedSingleCrossingWays = {};
43091
43092           // declare vars ahead of time to reduce garbage collection
43093           var i, j, nodeIndex;
43094           var extent;
43095           var n1, n2, nA, nB;
43096           var segment1, segment2;
43097           var oneOnly;
43098           var intersected, way2, way2FeatureType, way2Nodes;
43099           var way1Nodes = graph.childNodes(way1);
43100           var comparedWays = {};
43101           for (i = 0; i < way1Nodes.length - 1; i++) {
43102               n1 = way1Nodes[i];
43103               n2 = way1Nodes[i + 1];
43104               extent = geoExtent([
43105                   [
43106                       Math.min(n1.loc[0], n2.loc[0]),
43107                       Math.min(n1.loc[1], n2.loc[1])
43108                   ],
43109                   [
43110                       Math.max(n1.loc[0], n2.loc[0]),
43111                       Math.max(n1.loc[1], n2.loc[1])
43112                   ]
43113               ]);
43114
43115               intersected = tree.intersects(extent, graph);
43116               for (j = 0; j < intersected.length; j++) {
43117                   way2 = intersected[j];
43118
43119                   if (way2.type !== 'way') continue;
43120
43121                   // don't check for self-intersection in this validation
43122                   if (way2.id === way1.id) continue;
43123
43124                   // skip if this way was already checked and only one issue is needed
43125                   if (checkedSingleCrossingWays[way2.id]) continue;
43126
43127                   // don't re-check previously checked features
43128                   if (issueCache[way1.id] && issueCache[way1.id][way2.id]) continue;
43129
43130                   // mark this way as checked even if there are no crossings
43131                   comparedWays[way2.id] = true;
43132
43133                   // only check crossing highway, waterway, building, and railway
43134                   way2FeatureType = getFeatureTypeForCrossingCheck(way2, graph);
43135                   if (way2FeatureType === null ||
43136                       isLegitCrossing(way1, way1FeatureType, way2, way2FeatureType)) {
43137                       continue;
43138                   }
43139
43140                   // create only one issue for building crossings
43141                   oneOnly = way1FeatureType === 'building' || way2FeatureType === 'building';
43142                   segment1 = [n1.loc, n2.loc];
43143
43144                   way2Nodes = graph.childNodes(way2);
43145                   for (nodeIndex = 0; nodeIndex < way2Nodes.length - 1; nodeIndex++) {
43146                       nA = way2Nodes[nodeIndex];
43147                       nB = way2Nodes[nodeIndex + 1];
43148                       if (nA.id === n1.id || nA.id === n2.id ||
43149                           nB.id === n1.id || nB.id === n2.id) {
43150                           // n1 or n2 is a connection node; skip
43151                           continue;
43152                       }
43153                       segment2 = [nA.loc, nB.loc];
43154                       var point = geoLineIntersection(segment1, segment2);
43155                       if (point) {
43156                           edgeCrossInfos.push({
43157                               ways: [way1, way2],
43158                               featureTypes: [way1FeatureType, way2FeatureType],
43159                               edges: [[n1.id, n2.id], [nA.id, nB.id]],
43160                               crossPoint: point
43161                           });
43162                           if (oneOnly) {
43163                               checkedSingleCrossingWays[way2.id] = true;
43164                               break;
43165                           }
43166                       }
43167                   }
43168               }
43169           }
43170           for (var way2ID in comparedWays) {
43171               if (!issueCache[way1.id]) issueCache[way1.id] = {};
43172               if (!issueCache[way1.id][way2ID]) issueCache[way1.id][way2ID] = [];
43173               if (!issueCache[way2ID]) issueCache[way2ID] = {};
43174               if (!issueCache[way2ID][way1.id]) issueCache[way2ID][way1.id] = [];
43175           }
43176           return edgeCrossInfos;
43177       }
43178
43179
43180       function waysToCheck(entity, context) {
43181           if (!getFeatureTypeForTags(entity.tags)) {
43182               return [];
43183           }
43184           if (entity.type === 'way') {
43185               return [entity];
43186           } else if (entity.type === 'relation' &&
43187               entity.isMultipolygon() &&
43188               // only check multipolygons if they are buildings
43189               hasTag(entity.tags, 'building')) {
43190               return entity.members.reduce(function(array, member) {
43191                   if (member.type === 'way' &&
43192                       //(member.role === 'outer' || member.role === 'inner') &&
43193                       context.hasEntity(member.id)) {
43194                       var entity = context.entity(member.id);
43195                       array.push(entity);
43196                   }
43197                   return array;
43198               }, []);
43199           }
43200           return [];
43201       }
43202
43203       var validation = function(entity, context) {
43204           var graph = context.graph();
43205           var tree = context.history().tree();
43206
43207           var ways = waysToCheck(entity, context);
43208
43209           var issues = [];
43210           // declare these here to reduce garbage collection
43211           var wayIndex, crossingIndex, key, crossings, crossing, issue;
43212           for (wayIndex in ways) {
43213               var way = ways[wayIndex];
43214               crossings = findCrossingsByWay(way, graph, tree);
43215               for (crossingIndex in crossings) {
43216                   crossing = crossings[crossingIndex];
43217                   var way2 = crossing.ways[1];
43218                   issue = createIssue(crossing, context);
43219                   // cache the issues for each way
43220                   issueCache[way.id][way2.id].push(issue);
43221                   issueCache[way2.id][way.id].push(issue);
43222               }
43223               for (key in issueCache[way.id]) {
43224                   issues = issues.concat(issueCache[way.id][key]);
43225               }
43226           }
43227           return issues;
43228       };
43229
43230
43231       function createIssue(crossing, context) {
43232           var graph = context.graph();
43233
43234           // use the entities with the tags that define the feature type
43235           var entities = crossing.ways.sort(function(entity1, entity2) {
43236               var type1 = getFeatureTypeForCrossingCheck(entity1, graph);
43237               var type2 = getFeatureTypeForCrossingCheck(entity2, graph);
43238               if (type1 === type2) {
43239                   return utilDisplayLabel(entity1, context) > utilDisplayLabel(entity2, context);
43240               } else if (type1 === 'waterway') {
43241                   return true;
43242               } else if (type2 === 'waterway') {
43243                   return false;
43244               }
43245               return type1 < type2;
43246           });
43247           entities = entities.map(function(way) {
43248               return getFeatureWithFeatureTypeTagsForWay(way, graph);
43249           });
43250
43251           var connectionTags = tagsForConnectionNodeIfAllowed(entities[0], entities[1]);
43252
43253           var featureType1 = crossing.featureTypes[0];
43254           var featureType2 = crossing.featureTypes[1];
43255
43256           var isCrossingIndoors = tagsImplyIndoors(entities[0].tags) && tagsImplyIndoors(entities[1].tags);
43257           var isCrossingTunnels = allowsTunnel(featureType1) && hasTag(entities[0].tags, 'tunnel') &&
43258                                   allowsTunnel(featureType2) && hasTag(entities[1].tags, 'tunnel');
43259           var isCrossingBridges = allowsBridge(featureType1) && hasTag(entities[0].tags, 'bridge') &&
43260                                   allowsBridge(featureType2) && hasTag(entities[1].tags, 'bridge');
43261
43262           var crossingTypeID;
43263
43264           if (isCrossingIndoors) {
43265               crossingTypeID = 'indoor-indoor';
43266           } else if (isCrossingTunnels) {
43267               crossingTypeID = 'tunnel-tunnel';
43268           } else if (isCrossingBridges) {
43269               crossingTypeID = 'bridge-bridge';
43270           } else {
43271               crossingTypeID = crossing.featureTypes.sort().join('-');
43272           }
43273           if (connectionTags && (isCrossingIndoors || isCrossingTunnels || isCrossingBridges)) {
43274               crossingTypeID += '_connectable';
43275           }
43276
43277           var messageDict = {
43278               feature: utilDisplayLabel(entities[0], context),
43279               feature2: utilDisplayLabel(entities[1], context)
43280           };
43281
43282           var fixes = [];
43283           if (connectionTags) {
43284               fixes.push(new validationIssueFix({
43285                   icon: 'iD-icon-crossing',
43286                   title: t('issues.fix.connect_features.title'),
43287                   onClick: function() {
43288                       var loc = this.issue.loc;
43289                       var connectionTags = this.issue.info.connectionTags;
43290                       var edges = this.issue.info.edges;
43291
43292                       context.perform(
43293                           function actionConnectCrossingWays(graph) {
43294                               // create the new node for the points
43295                               var node = osmNode({ loc: loc, tags: connectionTags });
43296                               graph = graph.replace(node);
43297
43298                               var nodesToMerge = [node.id];
43299                               var mergeThresholdInMeters = 0.75;
43300
43301                               edges.forEach(function(edge) {
43302                                   var edgeNodes = [graph.entity(edge[0]), graph.entity(edge[1])];
43303                                   var closestNodeInfo = geoSphericalClosestNode(edgeNodes, loc);
43304                                   // if there is already a point nearby, use that
43305                                   if (closestNodeInfo.distance < mergeThresholdInMeters) {
43306                                       nodesToMerge.push(closestNodeInfo.node.id);
43307                                   // else add the new node to the way
43308                                   } else {
43309                                       graph = actionAddMidpoint({loc: loc, edge: edge}, node)(graph);
43310                                   }
43311                               });
43312
43313                               if (nodesToMerge.length > 1) {
43314                                   // if we're using nearby nodes, merge them with the new node
43315                                   graph = actionMergeNodes(nodesToMerge, loc)(graph);
43316                               }
43317
43318                               return graph;
43319                           },
43320                           t('issues.fix.connect_crossing_features.annotation')
43321                       );
43322                   }
43323               }));
43324           }
43325           var useFixIcon = 'iD-icon-layers';
43326           var useFixID;
43327           if (isCrossingIndoors) {
43328               useFixID = 'use_different_levels';
43329           } else if (isCrossingTunnels || isCrossingBridges) {
43330               useFixID = 'use_different_layers';
43331           // don't recommend bridges for waterways even though they're okay
43332           } else if ((allowsBridge(featureType1) && featureType1 !== 'waterway') ||
43333                   (allowsBridge(featureType2) && featureType2 !== 'waterway')) {
43334               useFixID = 'use_bridge_or_tunnel';
43335               useFixIcon = 'maki-bridge';
43336           } else if (allowsTunnel(featureType1) || allowsTunnel(featureType2)) {
43337               useFixID = 'use_tunnel';
43338           } else {
43339               useFixID = 'use_different_layers';
43340           }
43341           fixes.push(new validationIssueFix({
43342               icon: useFixIcon,
43343               title: t('issues.fix.' + useFixID + '.title')
43344           }));
43345           fixes.push(new validationIssueFix({
43346               icon: 'iD-operation-move',
43347               title: t('issues.fix.reposition_features.title')
43348           }));
43349           return new validationIssue({
43350               type: type,
43351               severity: 'warning',
43352               message: t('issues.crossing_ways.message', messageDict),
43353               tooltip: t('issues.crossing_ways.'+crossingTypeID+'.tip'),
43354               entities: entities,
43355               info: { edges: crossing.edges, connectionTags: connectionTags },
43356               loc: crossing.crossPoint,
43357               fixes: fixes
43358           });
43359       }
43360
43361       validation.reset = function() {
43362           issueCache = {};
43363       };
43364
43365       validation.type = type;
43366
43367       return validation;
43368   }
43369
43370   function validationDeprecatedTag() {
43371       var type = 'deprecated_tag';
43372
43373
43374       var validation = function(entity, context) {
43375           var issues = [];
43376           var deprecatedTagsArray = entity.deprecatedTags();
43377           if (deprecatedTagsArray.length > 0) {
43378               for (var deprecatedTagIndex in deprecatedTagsArray) {
43379                   var deprecatedTags = deprecatedTagsArray[deprecatedTagIndex];
43380                   var labelTags = clone(deprecatedTags.old);
43381                   for (var key in labelTags) {
43382                       if (labelTags[key] === '*') {
43383                           // show the user the actual tag, like color=red instead of color=*
43384                           labelTags[key] = entity.tags[key];
43385                       }
43386                   }
43387                   var tagsLabel = utilTagText({ tags: labelTags });
43388                   var featureLabel = utilDisplayLabel(entity, context);
43389                   var isCombo = Object.keys(deprecatedTags.old).length > 1;
43390                   var messageObj = { feature: featureLabel };
43391                   if (isCombo) {
43392                       messageObj.tags = tagsLabel;
43393                   } else {
43394                       messageObj.tag = tagsLabel;
43395                   }
43396                   var tagMessageID = isCombo ? 'combination' : 'single';
43397                   issues.push(new validationIssue({
43398                       type: type,
43399                       severity: 'warning',
43400                       message: t('issues.deprecated_tag.' + tagMessageID + '.message', messageObj),
43401                       tooltip: t('issues.deprecated_tag.tip'),
43402                       entities: [entity],
43403                       hash: tagsLabel,
43404                       info: {
43405                           oldTags: deprecatedTags.old,
43406                           replaceTags: deprecatedTags.replace
43407                       },
43408                       fixes: [
43409                           new validationIssueFix({
43410                               icon: 'iD-icon-up',
43411                               title: t('issues.fix.' + (isCombo ? 'upgrade_tag_combo' : 'upgrade_tag') + '.title'),
43412                               onClick: function() {
43413                                   var entity = this.issue.entities[0];
43414                                   var tags = clone(entity.tags);
43415                                   var replaceTags = this.issue.info.replaceTags;
43416                                   var oldTags = this.issue.info.oldTags;
43417                                   var fixTextID = Object.keys(oldTags).length > 1 ? 'upgrade_tag_combo' : 'upgrade_tag';
43418                                   var transferValue;
43419                                   for (var oldTagKey in oldTags) {
43420                                       if (oldTags[oldTagKey] === '*') {
43421                                           transferValue = tags[oldTagKey];
43422                                       }
43423                                       delete tags[oldTagKey];
43424                                   }
43425                                   for (var replaceKey in replaceTags) {
43426                                       var replaceValue = replaceTags[replaceKey];
43427                                       if (replaceValue === '*') {
43428                                           if (tags[replaceKey]) {
43429                                               // any value is okay and there already
43430                                               // is one, so don't update it
43431                                               continue;
43432                                           } else {
43433                                               // otherwise assume `yes` is okay
43434                                               tags[replaceKey] = 'yes';
43435                                           }
43436                                       } else if (replaceValue === '$1') {
43437                                           tags[replaceKey] = transferValue;
43438                                       } else {
43439                                           tags[replaceKey] = replaceValue;
43440                                       }
43441                                   }
43442                                   context.perform(
43443                                       actionChangeTags(entity.id, tags),
43444                                       t('issues.fix.' + fixTextID + '.annotation')
43445                                   );
43446                               }
43447                           }),
43448                           new validationIssueFix({
43449                               icon: 'iD-operation-delete',
43450                               title: t('issues.fix.' + (isCombo ? 'remove_tags' : 'remove_tag') + '.title'),
43451                               onClick: function() {
43452                                   var entity = this.issue.entities[0];
43453                                   var tags = clone(entity.tags);
43454                                   var oldTags = this.issue.info.oldTags;
43455                                   for (var key in oldTags) {
43456                                       delete tags[key];
43457                                   }
43458                                   var fixTextID = Object.keys(oldTags).length > 1 ? 'remove_deprecated_tag_combo' : 'remove_deprecated_tag';
43459                                   context.perform(
43460                                       actionChangeTags(entity.id, tags),
43461                                       t('issues.fix.' + fixTextID + '.annotation')
43462                                   );
43463                               }
43464                           })
43465                       ]
43466                   }));
43467               }
43468           }
43469
43470           return issues;
43471       };
43472
43473       validation.type = type;
43474
43475       return validation;
43476   }
43477
43478   function operationCircularize(selectedIDs, context) {
43479       var entityId = selectedIDs[0],
43480           entity = context.entity(entityId),
43481           extent = entity.extent(context.graph()),
43482           geometry = context.geometry(entityId),
43483           action = actionCircularize(entityId, context.projection);
43484
43485
43486       var operation = function() {
43487           context.perform(action, operation.annotation());
43488       };
43489
43490
43491       operation.available = function() {
43492           return selectedIDs.length === 1 &&
43493               entity.type === 'way' &&
43494               uniq(entity.nodes).length > 1;
43495       };
43496
43497
43498       operation.disabled = function() {
43499           var reason;
43500           if (extent.percentContainedIn(context.extent()) < 0.8) {
43501               reason = 'too_large';
43502           } else if (context.hasHiddenConnections(entityId)) {
43503               reason = 'connected_to_hidden';
43504           }
43505           return action.disabled(context.graph()) || reason;
43506       };
43507
43508
43509       operation.tooltip = function() {
43510           var disable = operation.disabled();
43511           return disable ?
43512               t('operations.circularize.' + disable) :
43513               t('operations.circularize.description.' + geometry);
43514       };
43515
43516
43517       operation.annotation = function() {
43518           return t('operations.circularize.annotation.' + geometry);
43519       };
43520
43521
43522       operation.id = 'circularize';
43523       operation.keys = [t('operations.circularize.key')];
43524       operation.title = t('operations.circularize.title');
43525       operation.behavior = behaviorOperation(context).which(operation);
43526
43527       return operation;
43528   }
43529
43530   function operationContinue(selectedIDs, context) {
43531       var graph = context.graph(),
43532           entities = selectedIDs.map(function(id) { return graph.entity(id); }),
43533           geometries = assignIn({ line: [], vertex: [] },
43534               groupBy(entities, function(entity) { return entity.geometry(graph); })),
43535           vertex = geometries.vertex[0];
43536
43537
43538       function candidateWays() {
43539           return graph.parentWays(vertex).filter(function(parent) {
43540               return parent.geometry(graph) === 'line' &&
43541                   !parent.isClosed() &&
43542                   parent.affix(vertex.id) &&
43543                   (geometries.line.length === 0 || geometries.line[0] === parent);
43544           });
43545       }
43546
43547
43548       var operation = function() {
43549           var candidate = candidateWays()[0];
43550           context.enter(
43551               modeDrawLine(context, candidate.id, context.graph(), context.graph(), candidate.affix(vertex.id), true)
43552           );
43553       };
43554
43555
43556       operation.available = function() {
43557           return geometries.vertex.length === 1 && geometries.line.length <= 1 &&
43558               !context.features().hasHiddenConnections(vertex, context.graph());
43559       };
43560
43561
43562       operation.disabled = function() {
43563           var candidates = candidateWays();
43564           if (candidates.length === 0)
43565               return 'not_eligible';
43566           if (candidates.length > 1)
43567               return 'multiple';
43568       };
43569
43570
43571       operation.tooltip = function() {
43572           var disable = operation.disabled();
43573           return disable ?
43574               t('operations.continue.' + disable) :
43575               t('operations.continue.description');
43576       };
43577
43578
43579       operation.annotation = function() {
43580           return t('operations.continue.annotation.line');
43581       };
43582
43583
43584       operation.id = 'continue';
43585       operation.keys = [t('operations.continue.key')];
43586       operation.title = t('operations.continue.title');
43587       operation.behavior = behaviorOperation(context).which(operation);
43588
43589       return operation;
43590   }
43591
43592   function operationDelete(selectedIDs, context) {
43593       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
43594           action = actionDeleteMultiple(selectedIDs),
43595           extent = selectedIDs.reduce(function(extent, id) {
43596                   return extent.extend(context.entity(id).extent(context.graph()));
43597               }, geoExtent());
43598
43599
43600       var operation = function() {
43601           var nextSelectedID;
43602           var nextSelectedLoc;
43603
43604           if (selectedIDs.length === 1) {
43605               var id = selectedIDs[0],
43606                   entity = context.entity(id),
43607                   geometry = context.geometry(id),
43608                   parents = context.graph().parentWays(entity),
43609                   parent = parents[0];
43610
43611               // Select the next closest node in the way.
43612               if (geometry === 'vertex') {
43613                   var nodes = parent.nodes,
43614                       i = nodes.indexOf(id);
43615
43616                   if (i === 0) {
43617                       i++;
43618                   } else if (i === nodes.length - 1) {
43619                       i--;
43620                   } else {
43621                       var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc),
43622                           b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
43623                       i = a < b ? i - 1 : i + 1;
43624                   }
43625
43626                   nextSelectedID = nodes[i];
43627                   nextSelectedLoc = context.entity(nextSelectedID).loc;
43628               }
43629           }
43630
43631           context.perform(action, operation.annotation());
43632
43633           if (nextSelectedID && nextSelectedLoc) {
43634               if (context.hasEntity(nextSelectedID)) {
43635                   context.enter(modeSelect(context, [nextSelectedID]).follow(true));
43636               } else {
43637                   context.map().centerEase(nextSelectedLoc);
43638                   context.enter(modeBrowse(context));
43639               }
43640           } else {
43641               context.enter(modeBrowse(context));
43642           }
43643
43644       };
43645
43646
43647       operation.available = function() {
43648           return true;
43649       };
43650
43651
43652       operation.disabled = function() {
43653           var reason;
43654           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
43655               reason = 'too_large';
43656           } else if (some(selectedIDs, context.hasHiddenConnections)) {
43657               reason = 'connected_to_hidden';
43658           } else if (some(selectedIDs, protectedMember)) {
43659               reason = 'part_of_relation';
43660           } else if (some(selectedIDs, incompleteRelation)) {
43661               reason = 'incomplete_relation';
43662           }
43663           return reason;
43664
43665           function incompleteRelation(id) {
43666               var entity = context.entity(id);
43667               return entity.type === 'relation' && !entity.isComplete(context.graph());
43668           }
43669
43670           function protectedMember(id) {
43671               var entity = context.entity(id);
43672               if (entity.type !== 'way') return false;
43673
43674               var parents = context.graph().parentRelations(entity);
43675               for (var i = 0; i < parents.length; i++) {
43676                   var parent = parents[i],
43677                       type = parent.tags.type,
43678                       role = parent.memberById(id).role || 'outer';
43679                   if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
43680                       return true;
43681                   }
43682               }
43683               return false;
43684           }
43685
43686       };
43687
43688
43689       operation.tooltip = function() {
43690           var disable = operation.disabled();
43691           return disable ?
43692               t('operations.delete.' + disable + '.' + multi) :
43693               t('operations.delete.description' + '.' + multi);
43694       };
43695
43696
43697       operation.annotation = function() {
43698           return selectedIDs.length === 1 ?
43699               t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
43700               t('operations.delete.annotation.multiple', { n: selectedIDs.length });
43701       };
43702
43703
43704       operation.id = 'delete';
43705       operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
43706       operation.title = t('operations.delete.title');
43707       operation.behavior = behaviorOperation(context).which(operation);
43708
43709       return operation;
43710   }
43711
43712   function operationDisconnect(selectedIDs, context) {
43713       var vertices = filter(selectedIDs, function(entityId) {
43714           return context.geometry(entityId) === 'vertex';
43715       });
43716
43717       var entityId = vertices[0],
43718           action = actionDisconnect(entityId);
43719
43720       if (selectedIDs.length > 1) {
43721           action.limitWays(without(selectedIDs, entityId));
43722       }
43723
43724
43725       var operation = function() {
43726           context.perform(action, operation.annotation());
43727       };
43728
43729
43730       operation.available = function() {
43731           return vertices.length === 1;
43732       };
43733
43734
43735       operation.disabled = function() {
43736           var reason;
43737           if (some(selectedIDs, context.hasHiddenConnections)) {
43738               reason = 'connected_to_hidden';
43739           }
43740           return action.disabled(context.graph()) || reason;
43741       };
43742
43743
43744       operation.tooltip = function() {
43745           var disable = operation.disabled();
43746           return disable ?
43747               t('operations.disconnect.' + disable) :
43748               t('operations.disconnect.description');
43749       };
43750
43751
43752       operation.annotation = function() {
43753           return t('operations.disconnect.annotation');
43754       };
43755
43756
43757       operation.id = 'disconnect';
43758       operation.keys = [t('operations.disconnect.key')];
43759       operation.title = t('operations.disconnect.title');
43760       operation.behavior = behaviorOperation(context).which(operation);
43761
43762       return operation;
43763   }
43764
43765   function operationMerge(selectedIDs, context) {
43766
43767       function updatePresetTags(newGraph, ids) {
43768           var id = ids[0];
43769           var newEntity = newGraph.hasEntity(id);
43770
43771           if (!newEntity) return;
43772           var newPreset = context.presets().match(newEntity, newGraph);
43773           context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
43774       }
43775
43776
43777       var join = actionJoin(selectedIDs);
43778       var merge = actionMerge(selectedIDs);
43779       var mergePolygon = actionMergePolygon(selectedIDs);
43780       var mergeNodes = actionMergeNodes(selectedIDs);
43781
43782
43783       var operation = function() {
43784           var doUpdateTags;
43785           var action;
43786
43787           if (!join.disabled(context.graph())) {
43788               doUpdateTags = false;
43789               action = join;
43790           } else if (!merge.disabled(context.graph())) {
43791               doUpdateTags = true;
43792               action = merge;
43793           } else if (!mergePolygon.disabled(context.graph())) {
43794               doUpdateTags = false;
43795               action = mergePolygon;
43796           } else {
43797               doUpdateTags = true;
43798               action = mergeNodes;
43799           }
43800
43801           context.perform(action, operation.annotation());
43802
43803           var ids = selectedIDs.filter(function(id) {
43804               var entity = context.hasEntity(id);
43805               return entity && entity.type !== 'node';
43806           });
43807
43808           // if we merged tags, rematch preset to update tags if necessary (#3851)
43809           if (doUpdateTags) {
43810               updatePresetTags(context.graph(), ids);
43811           }
43812
43813           context.enter(modeSelect(context, ids));
43814       };
43815
43816
43817       operation.available = function() {
43818           return selectedIDs.length >= 2;
43819       };
43820
43821
43822       operation.disabled = function() {
43823           return join.disabled(context.graph()) &&
43824               merge.disabled(context.graph()) &&
43825               mergePolygon.disabled(context.graph()) &&
43826               mergeNodes.disabled(context.graph());
43827       };
43828
43829
43830       operation.tooltip = function() {
43831           var j = join.disabled(context.graph());          // 'not_eligible', 'not_adjacent', 'restriction', 'conflicting_tags'
43832           var m = merge.disabled(context.graph());         // 'not_eligible'
43833           var p = mergePolygon.disabled(context.graph());  // 'not_eligible', 'incomplete_relation'
43834           var n = mergeNodes.disabled(context.graph());    // 'not_eligible', 'relation', 'restriction'
43835
43836           // disabled for one of various reasons
43837           if (j && m && p && n) {
43838               if (j === 'restriction' || n === 'restriction') {
43839                   return t('operations.merge.restriction',
43840                       { relation: context.presets().item('type/restriction').name() });
43841
43842               } else if (p === 'incomplete_relation') {
43843                   return t('operations.merge.incomplete_relation');
43844
43845               } else if (n === 'relation') {
43846                   return t('operations.merge.relation');
43847
43848               } else {
43849                   return t('operations.merge.' + j);
43850               }
43851
43852           } else {
43853               return t('operations.merge.description');
43854           }
43855       };
43856
43857
43858       operation.annotation = function() {
43859           return t('operations.merge.annotation', { n: selectedIDs.length });
43860       };
43861
43862
43863       operation.id = 'merge';
43864       operation.keys = [t('operations.merge.key')];
43865       operation.title = t('operations.merge.title');
43866       operation.behavior = behaviorOperation(context).which(operation);
43867
43868       return operation;
43869   }
43870
43871   function operationMove(selectedIDs, context) {
43872       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
43873       var extent = selectedIDs.reduce(function(extent, id) {
43874           return extent.extend(context.entity(id).extent(context.graph()));
43875       }, geoExtent());
43876
43877
43878       var operation = function() {
43879           context.enter(modeMove(context, selectedIDs));
43880       };
43881
43882
43883       operation.available = function() {
43884           return selectedIDs.length > 1 ||
43885               context.entity(selectedIDs[0]).type !== 'node';
43886       };
43887
43888
43889       operation.disabled = function() {
43890           var reason;
43891           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
43892               reason = 'too_large';
43893           } else if (some(selectedIDs, context.hasHiddenConnections)) {
43894               reason = 'connected_to_hidden';
43895           } else if (some(selectedIDs, incompleteRelation)) {
43896               reason = 'incomplete_relation';
43897           }
43898           return reason;
43899
43900           function incompleteRelation(id) {
43901               var entity = context.entity(id);
43902               return entity.type === 'relation' && !entity.isComplete(context.graph());
43903           }
43904       };
43905
43906
43907       operation.tooltip = function() {
43908           var disable = operation.disabled();
43909           return disable ?
43910               t('operations.move.' + disable + '.' + multi) :
43911               t('operations.move.description.' + multi);
43912       };
43913
43914
43915       operation.annotation = function() {
43916           return selectedIDs.length === 1 ?
43917               t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
43918               t('operations.move.annotation.multiple');
43919       };
43920
43921
43922       operation.id = 'move';
43923       operation.keys = [t('operations.move.key')];
43924       operation.title = t('operations.move.title');
43925       operation.behavior = behaviorOperation(context).which(operation);
43926
43927       return operation;
43928   }
43929
43930   function operationOrthogonalize(selectedIDs, context) {
43931       var entityId = selectedIDs[0],
43932           entity = context.entity(entityId),
43933           extent = entity.extent(context.graph()),
43934           geometry = context.geometry(entityId),
43935           action = actionOrthogonalize(entityId, context.projection);
43936
43937
43938       var operation = function() {
43939           context.perform(action, operation.annotation());
43940       };
43941
43942
43943       operation.available = function() {
43944           return selectedIDs.length === 1 &&
43945               entity.type === 'way' &&
43946               entity.isClosed() &&
43947               uniq(entity.nodes).length > 2;
43948       };
43949
43950
43951       operation.disabled = function() {
43952           var reason;
43953           if (extent.percentContainedIn(context.extent()) < 0.8) {
43954               reason = 'too_large';
43955           } else if (context.hasHiddenConnections(entityId)) {
43956               reason = 'connected_to_hidden';
43957           }
43958           return action.disabled(context.graph()) || reason;
43959       };
43960
43961
43962       operation.tooltip = function() {
43963           var disable = operation.disabled();
43964           return disable ?
43965               t('operations.orthogonalize.' + disable) :
43966               t('operations.orthogonalize.description.' + geometry);
43967       };
43968
43969
43970       operation.annotation = function() {
43971           return t('operations.orthogonalize.annotation.' + geometry);
43972       };
43973
43974
43975       operation.id = 'orthogonalize';
43976       operation.keys = [t('operations.orthogonalize.key')];
43977       operation.title = t('operations.orthogonalize.title');
43978       operation.behavior = behaviorOperation(context).which(operation);
43979
43980       return operation;
43981   }
43982
43983   /**
43984    * This method is like `_.uniq` except that it accepts `iteratee` which is
43985    * invoked for each element in `array` to generate the criterion by which
43986    * uniqueness is computed. The order of result values is determined by the
43987    * order they occur in the array. The iteratee is invoked with one argument:
43988    * (value).
43989    *
43990    * @static
43991    * @memberOf _
43992    * @since 4.0.0
43993    * @category Array
43994    * @param {Array} array The array to inspect.
43995    * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
43996    * @returns {Array} Returns the new duplicate free array.
43997    * @example
43998    *
43999    * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
44000    * // => [2.1, 1.2]
44001    *
44002    * // The `_.property` iteratee shorthand.
44003    * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
44004    * // => [{ 'x': 1 }, { 'x': 2 }]
44005    */
44006   function uniqBy(array, iteratee) {
44007     return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
44008   }
44009
44010   function operationReflectShort(selectedIDs, context) {
44011       return operationReflect(selectedIDs, context, 'short');
44012   }
44013
44014
44015   function operationReflectLong(selectedIDs, context) {
44016       return operationReflect(selectedIDs, context, 'long');
44017   }
44018
44019
44020   function operationReflect(selectedIDs, context, axis) {
44021       axis = axis || 'long';
44022       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
44023           extent = selectedIDs.reduce(function(extent, id) {
44024               return extent.extend(context.entity(id).extent(context.graph()));
44025           }, geoExtent());
44026
44027
44028       var operation = function() {
44029           var action = actionReflect(selectedIDs, context.projection)
44030               .useLongAxis(Boolean(axis === 'long'));
44031           context.perform(action, operation.annotation());
44032       };
44033
44034
44035       operation.available = function() {
44036           var nodes = utilGetAllNodes(selectedIDs, context.graph());
44037           return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
44038       };
44039
44040
44041       operation.disabled = function() {
44042           var reason;
44043           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
44044               reason = 'too_large';
44045           } else if (some(selectedIDs, context.hasHiddenConnections)) {
44046               reason = 'connected_to_hidden';
44047           } else if (some(selectedIDs, incompleteRelation)) {
44048               reason = 'incomplete_relation';
44049           }
44050           return reason;
44051
44052           function incompleteRelation(id) {
44053               var entity = context.entity(id);
44054               return entity.type === 'relation' && !entity.isComplete(context.graph());
44055           }
44056       };
44057
44058
44059       operation.tooltip = function() {
44060           var disable = operation.disabled();
44061           return disable ?
44062               t('operations.reflect.' + disable + '.' + multi) :
44063               t('operations.reflect.description.' + axis + '.' + multi);
44064       };
44065
44066
44067       operation.annotation = function() {
44068           return t('operations.reflect.annotation.' + axis + '.' + multi);
44069       };
44070
44071
44072       operation.id = 'reflect-' + axis;
44073       operation.keys = [t('operations.reflect.key.' + axis)];
44074       operation.title = t('operations.reflect.title.' + axis);
44075       operation.behavior = behaviorOperation(context).which(operation);
44076
44077       return operation;
44078   }
44079
44080   function operationReverse(selectedIDs, context) {
44081       var entityId = selectedIDs[0];
44082
44083       var operation = function() {
44084           context.perform(actionReverse(entityId), operation.annotation());
44085       };
44086
44087
44088       operation.available = function() {
44089           return selectedIDs.length === 1 && context.geometry(entityId) === 'line';
44090       };
44091
44092
44093       operation.disabled = function() {
44094           return false;
44095       };
44096
44097
44098       operation.tooltip = function() {
44099           return t('operations.reverse.description');
44100       };
44101
44102
44103       operation.annotation = function() {
44104           return t('operations.reverse.annotation');
44105       };
44106
44107
44108       operation.id = 'reverse';
44109       operation.keys = [t('operations.reverse.key')];
44110       operation.title = t('operations.reverse.title');
44111       operation.behavior = behaviorOperation(context).which(operation);
44112
44113       return operation;
44114   }
44115
44116   function operationRotate(selectedIDs, context) {
44117       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
44118           extent = selectedIDs.reduce(function(extent, id) {
44119               return extent.extend(context.entity(id).extent(context.graph()));
44120           }, geoExtent());
44121
44122
44123       var operation = function() {
44124           context.enter(modeRotate(context, selectedIDs));
44125       };
44126
44127
44128       operation.available = function() {
44129           var nodes = utilGetAllNodes(selectedIDs, context.graph());
44130           return uniqBy(nodes, function(n) { return n.loc; }).length >= 2;
44131       };
44132
44133
44134       operation.disabled = function() {
44135           var reason;
44136           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
44137               reason = 'too_large';
44138           } else if (some(selectedIDs, context.hasHiddenConnections)) {
44139               reason = 'connected_to_hidden';
44140           } else if (some(selectedIDs, incompleteRelation)) {
44141               reason = 'incomplete_relation';
44142           }
44143           return reason;
44144
44145           function incompleteRelation(id) {
44146               var entity = context.entity(id);
44147               return entity.type === 'relation' && !entity.isComplete(context.graph());
44148           }
44149       };
44150
44151
44152       operation.tooltip = function() {
44153           var disable = operation.disabled();
44154           return disable ?
44155               t('operations.rotate.' + disable + '.' + multi) :
44156               t('operations.rotate.description.' + multi);
44157       };
44158
44159
44160       operation.annotation = function() {
44161           return selectedIDs.length === 1 ?
44162               t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
44163               t('operations.rotate.annotation.multiple');
44164       };
44165
44166
44167       operation.id = 'rotate';
44168       operation.keys = [t('operations.rotate.key')];
44169       operation.title = t('operations.rotate.title');
44170       operation.behavior = behaviorOperation(context).which(operation);
44171
44172       return operation;
44173   }
44174
44175   function operationSplit(selectedIDs, context) {
44176       var vertices = filter(selectedIDs, function(entityId) {
44177           return context.geometry(entityId) === 'vertex';
44178       });
44179
44180       var entityId = vertices[0],
44181           action = actionSplit(entityId),
44182           ways = [];
44183
44184       if (vertices.length === 1) {
44185           if (selectedIDs.length > 1) {
44186               action.limitWays(without(selectedIDs, entityId));
44187           }
44188           ways = action.ways(context.graph());
44189       }
44190
44191
44192       var operation = function() {
44193           var difference = context.perform(action, operation.annotation());
44194           context.enter(modeSelect(context, difference.extantIDs()));
44195       };
44196
44197
44198       operation.available = function() {
44199           return vertices.length === 1;
44200       };
44201
44202
44203       operation.disabled = function() {
44204           var reason;
44205           if (some(selectedIDs, context.hasHiddenConnections)) {
44206               reason = 'connected_to_hidden';
44207           }
44208           return action.disabled(context.graph()) || reason;
44209       };
44210
44211
44212       operation.tooltip = function() {
44213           var disable = operation.disabled();
44214           if (disable) {
44215               return t('operations.split.' + disable);
44216           }
44217           if (ways.length === 1) {
44218               return t('operations.split.description.' + context.geometry(ways[0].id));
44219           } else {
44220               return t('operations.split.description.multiple');
44221           }
44222       };
44223
44224
44225       operation.annotation = function() {
44226           return ways.length === 1 ?
44227               t('operations.split.annotation.' + context.geometry(ways[0].id)) :
44228               t('operations.split.annotation.multiple', { n: ways.length });
44229       };
44230
44231
44232       operation.id = 'split';
44233       operation.keys = [t('operations.split.key')];
44234       operation.title = t('operations.split.title');
44235       operation.behavior = behaviorOperation(context).which(operation);
44236
44237       return operation;
44238   }
44239
44240   function operationStraighten(selectedIDs, context) {
44241       var entityId = selectedIDs[0],
44242           action = actionStraighten(entityId, context.projection);
44243
44244
44245       function operation() {
44246           context.perform(action, operation.annotation());
44247       }
44248
44249
44250       operation.available = function() {
44251           var entity = context.entity(entityId);
44252           return selectedIDs.length === 1 &&
44253               entity.type === 'way' &&
44254               !entity.isClosed() &&
44255               uniq(entity.nodes).length > 2;
44256       };
44257
44258
44259       operation.disabled = function() {
44260           var reason;
44261           if (context.hasHiddenConnections(entityId)) {
44262               reason = 'connected_to_hidden';
44263           }
44264           return action.disabled(context.graph()) || reason;
44265       };
44266
44267
44268       operation.tooltip = function() {
44269           var disable = operation.disabled();
44270           return disable ?
44271               t('operations.straighten.' + disable) :
44272               t('operations.straighten.description');
44273       };
44274
44275
44276       operation.annotation = function() {
44277           return t('operations.straighten.annotation');
44278       };
44279
44280
44281       operation.id = 'straighten';
44282       operation.keys = [t('operations.straighten.key')];
44283       operation.title = t('operations.straighten.title');
44284       operation.behavior = behaviorOperation(context).which(operation);
44285
44286       return operation;
44287   }
44288
44289   function operationDetachNode(selectedIDs, context) {
44290       var nodeID = selectedIDs.length && selectedIDs[0];
44291       var action = actionDetachNode(nodeID);
44292
44293       var operation = function () {
44294           context.perform(action);  // do the detach
44295
44296           var mouse = context.map().mouseCoordinates();
44297           if (mouse.some(isNaN)) {
44298               enterMoveMode();
44299
44300           } else {
44301               // move detached node to the mouse location (transitioned)
44302               context.perform(actionMoveNode(nodeID, mouse));
44303
44304               // after transition completes, put at final mouse location and enter move mode.
44305               window.setTimeout(function() {
44306                   mouse = context.map().mouseCoordinates();
44307                   context.replace(actionMoveNode(nodeID, mouse));
44308                   enterMoveMode();
44309               }, 150);
44310           }
44311
44312           function enterMoveMode() {
44313               var baseGraph = context.graph();
44314               context.enter(modeMove(context, [nodeID], baseGraph));
44315           }
44316       };
44317
44318
44319       operation.available = function () {
44320           if (selectedIDs.length !== 1) return false;
44321
44322           var graph = context.graph();
44323           var entity = graph.hasEntity(nodeID);
44324           if (!entity) return false;
44325
44326           return entity.type === 'node' &&
44327               entity.hasInterestingTags() &&
44328               graph.parentWays(entity).length > 0;
44329       };
44330
44331
44332       operation.disabled = function () {
44333           var reason;
44334           if (some(selectedIDs, context.hasHiddenConnections)) {
44335               reason = 'connected_to_hidden';
44336           }
44337           return action.disabled(context.graph()) || reason;
44338       };
44339
44340
44341       operation.tooltip = function () {
44342           var disableReason = operation.disabled();
44343           if (disableReason) {
44344               return t('operations.detach_node.' + disableReason,
44345                   { relation: context.presets().item('type/restriction').name() });
44346           } else {
44347               return t('operations.detach_node.description');
44348           }
44349       };
44350
44351
44352       operation.annotation = function () {
44353           return t('operations.detach_node.annotation');
44354       };
44355
44356
44357       operation.id = 'detach-node';
44358       operation.keys = [t('operations.detach_node.key')];
44359       operation.title = t('operations.detach_node.title');
44360       operation.behavior = behaviorOperation(context).which(operation);
44361
44362
44363       return operation;
44364   }
44365
44366
44367
44368   var Operations = /*#__PURE__*/Object.freeze({
44369     operationCircularize: operationCircularize,
44370     operationContinue: operationContinue,
44371     operationDelete: operationDelete,
44372     operationDisconnect: operationDisconnect,
44373     operationMerge: operationMerge,
44374     operationMove: operationMove,
44375     operationOrthogonalize: operationOrthogonalize,
44376     operationReflectShort: operationReflectShort,
44377     operationReflectLong: operationReflectLong,
44378     operationReverse: operationReverse,
44379     operationRotate: operationRotate,
44380     operationSplit: operationSplit,
44381     operationStraighten: operationStraighten,
44382     operationDetachNode: operationDetachNode
44383   });
44384
44385   function validationDisconnectedWay() {
44386       var type = 'disconnected_way';
44387
44388
44389       function isDisconnectedHighway(entity, graph) {
44390           if (!entity.tags.highway ||
44391               entity.tags.highway === 'no' ||
44392               entity.tags.highway === 'proposed') return false;
44393           if (entity.geometry(graph) !== 'line') return false;
44394
44395           return graph.childNodes(entity)
44396               .every(function(vertex) {
44397                   var parents = graph.parentWays(vertex);
44398                   if (parents.length === 1) {  // standalone vertex
44399                       return true;
44400                   } else {                     // shared vertex
44401                       return !vertex.tags.entrance &&
44402                           parents.filter(function(parent) {
44403                               return parent.tags.highway && parent !== entity;
44404                           }).length === 0;
44405                   }
44406               });
44407       }
44408
44409
44410       var validation = function(entity, context) {
44411           var issues = [];
44412           var graph = context.graph();
44413
44414           if (isDisconnectedHighway(entity, graph)) {
44415               var entityLabel = utilDisplayLabel(entity, context);
44416               var fixes = [];
44417
44418               if (!entity.isClosed()) {
44419                   var first = context.entity(entity.first());
44420                   if (first.tags.noexit !== 'yes') {
44421                       fixes.push(new validationIssueFix({
44422                           icon: 'iD-operation-continue-left',
44423                           title: t('issues.fix.continue_from_start.title'),
44424                           entityIds: [entity.first()],
44425                           onClick: function() {
44426                               var vertex = context.entity(entity.first());
44427                               continueDrawing(entity, vertex, context);
44428                           }
44429                       }));
44430                   }
44431                   var last = context.entity(entity.last());
44432                   if (last.tags.noexit !== 'yes') {
44433                       fixes.push(new validationIssueFix({
44434                           icon: 'iD-operation-continue',
44435                           title: t('issues.fix.continue_from_end.title'),
44436                           entityIds: [entity.last()],
44437                           onClick: function() {
44438                               var vertex = context.entity(entity.last());
44439                               continueDrawing(entity, vertex, context);
44440                           }
44441                       }));
44442                   }
44443               }
44444
44445               fixes.push(new validationIssueFix({
44446                   icon: 'iD-operation-delete',
44447                   title: t('issues.fix.delete_feature.title'),
44448                   entityIds: [entity.id],
44449                   onClick: function() {
44450                       var id = this.issue.entities[0].id;
44451                       operationDelete([id], context)();
44452                   }
44453               }));
44454
44455               issues.push(new validationIssue({
44456                   type: type,
44457                   severity: 'warning',
44458                   message: t('issues.disconnected_way.highway.message', { highway: entityLabel }),
44459                   tooltip: t('issues.disconnected_way.highway.tip'),
44460                   entities: [entity],
44461                   fixes: fixes
44462               }));
44463           }
44464
44465           return issues;
44466
44467
44468           function continueDrawing(way, vertex) {
44469               // make sure the vertex is actually visible and editable
44470               var map = context.map();
44471               if (!map.editable() || !map.trimmedExtent().contains(vertex.loc)) {
44472                   map.zoomToEase(vertex);
44473               }
44474
44475               context.enter(
44476                   modeDrawLine(context, way.id, context.graph(), context.graph(), way.affix(vertex.id), true)
44477               );
44478           }
44479       };
44480
44481
44482       validation.type = type;
44483
44484       return validation;
44485   }
44486
44487   var discardNames = ["\\(historical\\)","^[0-9]+$","^agencja pocztowa$","^änderungsschneiderei$","^apotek(a|et)$","^(adler|bahnhof|brunnen|burg|bären|engel|hirsch|hubertus|kur|linden|löwen)(-| )?apotheke$","^(marien|markt|neue|park|rathaus|rats|rosen|schloss|sonnen|stadt|stern)(-| )?apotheke$","^alte (apotheke|post)$","^apotheke(\\sam\\smarkt)?$","^apteka$","^аптека","^atelier de couture$","^atm$","^auto serwis$","^bank(| spółdzielczy)$","^bar$","^bar (centrale|kafe)$","^bazar$","^bäckerei$","^baguette$","^bakery$","^(the )?barber(ia|shop|\\sshop)?$","^berber$","^biletomat$","^bistro$","^blumen(laden)?$","^bodega$","^borracharia$","^bo(u)?tique$","^boucherie(\\scharcuterie)?$","^boulangerie(\\sp(a|â)tisserie)?$","^bread$","^briefkasten$","^budget inn$","^(bureau de |)change$","^bureau de poste$","^büfé$","^caf(e|é)(t(e|é)r(i|í)a)?( )?(central)?$","^caf(e|é) de(s)? (la )?(place|sports|gare)$","^carnicer(i|í)a$","^central$","^centro naturista$","^cine(ma)?$","^cleaners$","^coiff(eur|ure)$","^coffee$","^colmado$","^commercial hotel$","^correos$","^currency exchange$","^d(ö|o)ner(\\skebab)?$","^drinks$","^droguer(i|í)a$","^eczane$","^el árbol$","^estanco$","^eisdiele","^eiscaf(e|é)(\\s(dolomiti|venezia))?$","^exchange$","^euroshop$","^élelmiszer$","^élelmiszerbolt$","^farm(a|à|á)ci(a|à|á|e)$","^fagyizó$","^fast food$","^fish (and|&) chips$","^fleuriste$","^florărie$","^food court$","^fotocopias$","^fris(eu|ö)r$","^fri(t|z)erie$","^frituur$","^fryzjer$","^frutería$","^funeraria$","^ferreter(i|í)a$","^game$","^garage$","^gasoline(ra)?$","^gast(haus|hof)\\s(krone|(zur)\\s(linde|post))?$","^getränkemarkt$","^gimnasio$","^gomer(i|í)a$","^gym(nase|nasium)?$","^gyógyszertár$","^haar(genau|monie|scharf)$","^hair\\s(design|lounge|salon)$","^hardware$","^(hof|dorf)laden$","^hospedaje$","^(h|m)otel$","^h(o|ô)tel\\s(astoria|central|europa|krone|panorama|plaza|royal|victoria|(zur\\s)?post|de france)$","^(central|city|europa|grand|palace|park|royal)(\\s)?hotel$","^húsbolt$","^indipend\\.$","^((drummed|independent)\\s)?(cng|filling|fuel|gas|lpg|petrol)(\\s(station|pump))?$","^istanbul(\\skebab)?$","^imbiss$","^internet cafe$","^kaf(e|é)$","^kios(co|k|ko|que)?$","^kantine$","^kantor$","^kebab(ai|\\shouse)?$","^kitchen$","^kisbolt$","^księgarnia$","^kwiaciarnia$","^ladestation$","^lékárna$","^librer(i|í)a$","^librairie$","^libro$","^ljekarna$","^lombard$","^lot 1$","^lubricentro$","^macelleria$","^mailbox$","^maison$","^magazin","^market$","^máquina de tickets$","^mécanique$","^mercado$","^mini(\\s)?(abc|market|mart|mercado|pump)","municipal","^nails$","^obuwie$","^(okręgowa\\s)?stacja kontroli pojazdów$","^oplaadpunt$","^opti(c|k)a$","^optical center$","^padaria$","^panader(i|í)a$","^pancake house$","^panificio$","^panorama$","^papeler(i|í)a$","^pa(r|cz)komat$","^parafarmacia$","^parkscheinautomat$","^parquímetro$","^peluquer(i|í)a$","^pharmac(ie|y)$","^pho$","^piekarnia$","^pizz(eri)?a$","^piscine$","^poczta$","^po(s|š)t(a|e|o)$","^post(\\s)?(agentur|filiale|partner|office|stelle)?$","^punkt apteczny$","^pressing$","^rent a car$","^restaurant(e)?(\\suniversitário)?$","^rzeźnik$","^salle (omnisport|polyvalente)$","^(the\\s)?salo(o)?n( de coiffure| fryzjerski)?$","^second\\shand$","^shop$","^(coffee|pet|vulcanizing|gift)(\\sshop)?$","^sklep$","^(sklep\\s)?(spożywcz(y|o))(-przemysłowy)?$","^snack$","^souvenirs$","^stacja (benzynowa|paliw)$","^stadium$","^station service$","^steak house$","^stores?$","^(beer|convenience|corner|general|liquor|variety)(\\sstore)?$","^stromtankstelle$","^super ?america","^superm(arket|ercado)$","^sushi(\\s(bar|shop))?$","^tabaccher(i|í)a$","^taba(c|k)(os|chi)?(\\strafi(k|c))?$","^tacos$","^tankstelle$","^tattoo$","^taverna$","^tea stall$","^tienda(\\sde\\s(barrio|abarrotes))?$","^tokyo$","^trattoria$","^trafik(a)?$","^trinkhalle$","^ufficio postale$","^urząd pocztowy$","^vegyesbolt$","^venezia$","^večerka$","^virágbolt$","^vision\\splus$","^(clinica\\s)?veterinari(a|o)$","^(clinique\\s)?vétérinaire$","^warung$","^warzywniak$","^windmill$","^wok$","^wulkanizacja$","^zigarettenautomat$","^zöldséges$","^авто(рынок|ремонт|сервис|электрик|запчасти(ни)?)?$","^автома(г|газин|стерская)?$","^ателье$","^бистро$","^буфет$","^бассейн$","^ветеринарная клиника$","^ветлечебница$","^вулканизация$","^газ$","^газовая заправка$","^гостиница$","^главпочтамт$","^детский дом$","^ломбард$","^закусочная$","замена масла","^золото(й)?$","^зоо(магазин|товары)$","^канцтовары$","^касса$","^(летнее\\s)?кафе(терий)?$","^кофе(йня|\\sхауз)$","^книги$","^киоск$","^мебель$","^меблі$","^мороженое$","^оптика$","^овощи(\\sи\\s|-)фрукты$","^(спец|детская|женская)?(\\s)?одежда$","^(парикмахерская|персона|перукарня)$","^Пиццерия$","^почта$","^почтовое отделение$","^подарки$","^пресса$","^(Проездные\\s)?билет(ы)?$","^продукт(ы|и)?$","^промтовары$","^ресторан$","^ремонт\\sобуви$","^рыб(a|олов)$","^ритуал(ьные услуги)?$","^салон красоты$","^сувениры$","^супермаркет$","^столовая$","^стройматериалы$","^социальный участковый$","^спорт(зал|комплекс)$","^табак(ерка)?$","^товары для дома$","^Уют$","^универ(маг|сам)$","^φαρμακείο$","^фармация$","^химчистка$","^хоз(товары|яюшка)$","шиномонтаж","^ша(ве|у)рма$","^نانوایی$","^نانوایی بربری$","^حلاق$","^مخبز(ة)?$","^مقهى$","^محط(ه|ة) وقود$","^میوه فروشی$","^داروخانه$","^بانک$","^بقال(ة)?$","^پمپ (بنزین|گاز)$","^سوپر\\s?مارکت$","^صيدلية$","^اداره پست$","^رستوران$","^مطعم$","^მარკეტი\\s\\(Market\\)","^דלק$","^カフェ$","^ポスト$","^珈琲館$","^加油站$","^郵局$","^食堂$","^(自動販売機|自販機)$","^体育館$"];
44488
44489   function validationGenericName() {
44490       var type = 'generic_name';
44491
44492       // known list of generic names (e.g. "bar")
44493       var discardNamesRegexes = discardNames.map(function(discardName) {
44494           return new RegExp(discardName, 'i');
44495       });
44496
44497       var keysToTestForGenericValues = ['amenity', 'building', 'leisure', 'man_made', 'shop', 'tourism'];
44498
44499       function isGenericName(entity) {
44500           var name = entity.tags.name;
44501           if (!name) return false;
44502           name = name.toLowerCase();
44503
44504           var i, key, val;
44505
44506           // test if the name is just the key or tag value (e.g. "park")
44507           for (i = 0; i < keysToTestForGenericValues.length; i++) {
44508               key = keysToTestForGenericValues[i];
44509               val = entity.tags[key];
44510               if (val) {
44511                   val = val.toLowerCase();
44512                   if (key === name ||
44513                       val === name ||
44514                       key.replace(/\_/g, ' ') === name ||
44515                       val.replace(/\_/g, ' ') === name) {
44516                       return entity.tags.name;
44517                   }
44518               }
44519           }
44520
44521           // test if the name is otherwise generic
44522           for (i = 0; i < discardNamesRegexes.length; i++) {
44523               if (discardNamesRegexes[i].test(name)) {
44524                   return entity.tags.name;
44525               }
44526           }
44527
44528           return false;
44529       }
44530
44531
44532       var validation = function(entity, context) {
44533           var issues = [];
44534           var generic = isGenericName(entity);
44535           if (generic) {
44536               var preset = utilPreset(entity, context);
44537               issues.push(new validationIssue({
44538                   type: type,
44539                   severity: 'warning',
44540                   message: t('issues.generic_name.message', {feature: preset.name(), name: generic}),
44541                   tooltip: t('issues.generic_name.tip'),
44542                   entities: [entity],
44543                   fixes: [
44544                       new validationIssueFix({
44545                           icon: 'iD-operation-delete',
44546                           title: t('issues.fix.remove_generic_name.title'),
44547                           onClick: function() {
44548                               var entity = this.issue.entities[0];
44549                               var tags = clone(entity.tags);
44550                               delete tags.name;
44551                               context.perform(
44552                                   actionChangeTags(entity.id, tags),
44553                                   t('issues.fix.remove_generic_name.annotation')
44554                               );
44555                           }
44556                       })
44557                   ]
44558               }));
44559           }
44560
44561           return issues;
44562       };
44563
44564       validation.type = type;
44565
44566       return validation;
44567   }
44568
44569   function validationManyDeletions() {
44570       var totalOtherGeomThreshold = 50;
44571       var relationThreshold = 10;   // relations are less common so use a lower threshold
44572
44573       var type = 'many_deletions';
44574
44575       var validation = function(changes, context) {
44576           var issues = [];
44577           var points = 0, lines = 0, areas = 0, relations = 0;
44578           var base = context.history().base();
44579           var geometry;
44580
44581           changes.deleted.forEach(function(entity) {
44582               if (entity.type === 'node' && entity.geometry(base) === 'point') {
44583                   points++;
44584               } else if (entity.type === 'way') {
44585                   geometry = entity.geometry(base);
44586                   if (geometry === 'line') {
44587                       lines++;
44588                   } else if (geometry === 'area') {
44589                        areas++;
44590                   }
44591               } else if (entity.type === 'relation') {
44592                   relations++;
44593               }
44594           });
44595
44596           if (points + lines + areas >= totalOtherGeomThreshold || relations >= relationThreshold) {
44597               var totalFeatures = points + lines + areas + relations;
44598
44599               var messageType = 'points-lines-areas';
44600               if (relations > 0) {
44601                   messageType += '-relations';
44602               }
44603               issues.push(new validationIssue({
44604                   type: type,
44605                   severity: 'warning',
44606                   message: t(
44607                       'issues.many_deletions.'+messageType+'.message',
44608                       { n: totalFeatures, p: points, l: lines, a:areas, r: relations }
44609                   ),
44610                   tooltip: t('issues.many_deletions.tip'),
44611                   hash: [points, lines, areas, relations].join()
44612               }));
44613           }
44614
44615           return issues;
44616       };
44617
44618       validation.type = type;
44619       validation.inputType = 'changes';
44620
44621       return validation;
44622   }
44623
44624   function validationMaprules() {
44625       var type = 'maprules';
44626
44627
44628       var validation = function(entity, context) {
44629           if (!services.maprules) return [];
44630
44631           var graph = context.graph();
44632
44633           var rules = services.maprules.validationRules();
44634           var issues = [];
44635
44636           for (var i = 0; i < rules.length; i++) {
44637               var rule = rules[i];
44638               rule.findIssues(entity, graph, issues);
44639           }
44640
44641           return issues;
44642       };
44643
44644
44645       validation.type = type;
44646
44647
44648       return validation;
44649   }
44650
44651   function validationMissingTag() {
44652       var type = 'missing_tag';
44653
44654
44655       function hasDescriptiveTags(entity) {
44656           var keys = without(Object.keys(entity.tags), 'area', 'name').filter(osmIsInterestingTag);
44657           if (entity.type === 'relation' && keys.length === 1) {
44658               return entity.tags.type !== 'multipolygon';
44659           }
44660           return keys.length > 0;
44661       }
44662
44663
44664       var validation = function(entity, context) {
44665           var graph = context.graph();
44666
44667           // ignore vertex features and relation members
44668           if (entity.geometry(graph) === 'vertex' || entity.hasParentRelations(graph)) {
44669               return [];
44670           }
44671
44672           var mode = context.mode();
44673           if (entity.type === 'way' && mode &&
44674               (mode.id === 'draw-area' || (mode.id === 'draw-line' && !mode.isContinuing)) &&
44675               mode.wayID === entity.id) {
44676               // don't flag missing tag issues if drawing a new way
44677               return [];
44678           }
44679
44680           var messageObj = {};
44681           var missingTagType;
44682
44683           if (isEmpty(entity.tags)) {
44684               missingTagType = 'any';
44685           } else if (!hasDescriptiveTags(entity)) {
44686               missingTagType = 'descriptive';
44687           } else if (entity.type === 'relation' && !entity.tags.type) {
44688               missingTagType = 'specific';
44689               messageObj.tag = 'type';
44690           }
44691
44692           if (!missingTagType) {
44693               return [];
44694           }
44695
44696           messageObj.feature = utilDisplayLabel(entity, context);
44697
44698           var issues = [];
44699
44700           var deleteFixOnClick = function() {
44701               var id = this.issue.entities[0].id;
44702               operationDelete([id], context)();
44703           };
44704           var canDelete = true;
44705           
44706           if (entity.type === 'relation' &&
44707               !entity.members.every(function(member) { return context.hasEntity(member.id); })) {
44708               deleteFixOnClick = null;
44709               canDelete = false;
44710           }
44711
44712           issues.push(new validationIssue({
44713               type: type,
44714               // error if created or modified and is deletable, else warning
44715               severity: (!entity.version || entity.v) && canDelete  ? 'error' : 'warning',
44716               message: t('issues.missing_tag.' + missingTagType + '.message', messageObj),
44717               tooltip: t('issues.missing_tag.tip'),
44718               entities: [entity],
44719               fixes: [
44720                   new validationIssueFix({
44721                       icon: 'iD-icon-search',
44722                       title: t('issues.fix.select_preset.title'),
44723                       onClick: function() {
44724                           context.ui().sidebar.showPresetList();
44725                       }
44726                   }),
44727                   new validationIssueFix({
44728                       icon: 'iD-operation-delete',
44729                       title: t('issues.fix.delete_feature.title'),
44730                       onClick: deleteFixOnClick
44731                   })
44732               ]
44733           }));
44734
44735           return issues;
44736       };
44737
44738       validation.type = type;
44739
44740       return validation;
44741   }
44742
44743   function validationOldMultipolygon() {
44744       var type = 'old_multipolygon';
44745
44746
44747       var validation = function(entity, context) {
44748           var issues = [];
44749           var graph = context.graph();
44750
44751           var multipolygon, outerWay;
44752           if (entity.type === 'relation') {
44753               outerWay = osmOldMultipolygonOuterMemberOfRelation(entity, graph);
44754               multipolygon = entity;
44755           } else if (entity.type === 'way') {
44756               multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
44757               outerWay = entity;
44758           } else {
44759               return issues;
44760           }
44761
44762           if (multipolygon && outerWay) {
44763               var multipolygonLabel = utilDisplayLabel(multipolygon, context);
44764               issues.push(new validationIssue({
44765                   type: type,
44766                   severity: 'warning',
44767                   message: t('issues.old_multipolygon.message', { multipolygon: multipolygonLabel }),
44768                   tooltip: t('issues.old_multipolygon.tip'),
44769                   entities: [outerWay, multipolygon],
44770                   fixes: [
44771                       new validationIssueFix({
44772                           title: t('issues.fix.move_tags.title'),
44773                           onClick: function() {
44774                               var outerWay = this.issue.entities[0];
44775                               var multipolygon =  this.issue.entities[1];
44776                               context.perform(
44777                                   function(graph) {
44778                                       multipolygon = multipolygon.mergeTags(outerWay.tags);
44779                                       graph = graph.replace(multipolygon);
44780                                       graph = actionChangeTags(outerWay.id, {})(graph);
44781                                       return graph;
44782                                   },
44783                                   t('issues.fix.move_tags.annotation')
44784                               );
44785                           }
44786                       })
44787                   ]
44788               }));
44789           }
44790           return issues;
44791       };
44792
44793       validation.type = type;
44794
44795       return validation;
44796   }
44797
44798   function validationTagSuggestsArea() {
44799       var type = 'tag_suggests_area';
44800
44801
44802       var validation = function(entity, context) {
44803           if (entity.type !== 'way') return [];
44804
44805           var issues = [];
44806           var graph = context.graph();
44807           var tagSuggestingArea = entity.tagSuggestingArea();
44808           var tagSuggestsArea = !entity.isClosed() && tagSuggestingArea;
44809
44810           if (tagSuggestsArea) {
44811               var tagText = utilTagText({ tags: tagSuggestingArea });
44812               var fixes = [];
44813
44814               var connectEndpointsOnClick;
44815
44816               // must have at least three nodes to close this automatically
44817               if (entity.nodes.length >= 3) {
44818                   var nodes = graph.childNodes(entity), testNodes;
44819                   var firstToLastDistanceMeters = geoSphericalDistance(nodes[0].loc, nodes[nodes.length-1].loc);
44820
44821                   // if the distance is very small, attempt to merge the endpoints
44822                   if (firstToLastDistanceMeters < 0.75) {
44823                       testNodes = clone(nodes);
44824                       testNodes.pop();
44825                       testNodes.push(testNodes[0]);
44826                       // make sure this will not create a self-intersection
44827                       if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
44828                           connectEndpointsOnClick = function() {
44829                               var way = this.issue.entities[0];
44830                               context.perform(
44831                                   actionMergeNodes([way.nodes[0], way.nodes[way.nodes.length-1]], nodes[0].loc),
44832                                   t('issues.fix.connect_endpoints.annotation')
44833                               );
44834                           };
44835                       }
44836                   }
44837
44838                   if (!connectEndpointsOnClick) {
44839                       // if the points were not merged, attempt to close the way
44840                       testNodes = clone(nodes);
44841                       testNodes.push(testNodes[0]);
44842                       // make sure this will not create a self-intersection
44843                       if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
44844                           connectEndpointsOnClick = function() {
44845                               var way = this.issue.entities[0];
44846                               var nodeId = way.nodes[0];
44847                               var index = way.nodes.length;
44848                               context.perform(
44849                                   actionAddVertex(way.id, nodeId, index),
44850                                   t('issues.fix.connect_endpoints.annotation')
44851                               );
44852                           };
44853                       }
44854                   }
44855               }
44856
44857               fixes.push(new validationIssueFix({
44858                   title: t('issues.fix.connect_endpoints.title'),
44859                   onClick: connectEndpointsOnClick
44860               }));
44861
44862               fixes.push(new validationIssueFix({
44863                   icon: 'iD-operation-delete',
44864                   title: t('issues.fix.remove_tag.title'),
44865                   onClick: function() {
44866                       var entity = this.issue.entities[0];
44867                       var tags = clone(entity.tags);
44868                       for (var key in tagSuggestingArea) {
44869                           delete tags[key];
44870                       }
44871                       context.perform(
44872                           actionChangeTags(entity.id, tags),
44873                           t('issues.fix.remove_tag.annotation')
44874                       );
44875                   }
44876               }));
44877
44878               var featureLabel = utilDisplayLabel(entity, context);
44879               issues.push(new validationIssue({
44880                   type: type,
44881                   severity: 'warning',
44882                   message: t('issues.tag_suggests_area.message', { feature: featureLabel, tag: tagText }),
44883                   tooltip: t('issues.tag_suggests_area.tip'),
44884                   entities: [entity],
44885                   fixes: fixes
44886               }));
44887           }
44888
44889           return issues;
44890       };
44891
44892       validation.type = type;
44893
44894       return validation;
44895   }
44896
44897
44898
44899   var Validations = /*#__PURE__*/Object.freeze({
44900     validationAlmostJunction: validationAlmostJunction,
44901     validationCrossingWays: validationCrossingWays,
44902     validationDeprecatedTag: validationDeprecatedTag,
44903     validationDisconnectedWay: validationDisconnectedWay,
44904     validationGenericName: validationGenericName,
44905     validationManyDeletions: validationManyDeletions,
44906     validationMaprules: validationMaprules,
44907     validationMissingTag: validationMissingTag,
44908     validationOldMultipolygon: validationOldMultipolygon,
44909     validationTagSuggestsArea: validationTagSuggestsArea
44910   });
44911
44912   function coreValidator(context) {
44913       var dispatch$1 = dispatch('reload');
44914       var self = {};
44915       var _issues = [];
44916       var _issuesByEntityID = {};
44917
44918       var validations = filter(Validations, isFunction).reduce(function(obj, validation) {
44919           var func = validation();
44920           obj[func.type] = func;
44921           return obj;
44922       }, {});
44923
44924       var entityValidationIDs = [];
44925       var changesValidationIDs = [];
44926
44927       for (var key in validations) {
44928           var validation = validations[key];
44929           if (validation.inputType && validation.inputType === 'changes') {
44930               changesValidationIDs.push(key);
44931           } else {
44932               entityValidationIDs.push(key);
44933           }
44934       }
44935
44936       //self.featureApplicabilityOptions = ['edited', 'all'];
44937
44938       /*var featureApplicability = context.storage('issue-features') || 'edited';
44939
44940       self.getFeatureApplicability = function() {
44941           return featureApplicability;
44942       };
44943
44944       self.setFeatureApplicability = function(applicability) {
44945           featureApplicability = applicability;
44946           context.storage('issue-features', applicability);
44947       };*/
44948
44949       self.getIssues = function() {
44950           return _issues;
44951       };
44952
44953       self.getWarnings = function() {
44954           return _issues.filter(function(d) { return d.severity === 'warning'; });
44955       };
44956
44957       self.getErrors = function() {
44958           return _issues.filter(function(d) { return d.severity === 'error'; });
44959       };
44960
44961       self.getIssuesForEntityWithID = function(entityID) {
44962           if (!context.hasEntity(entityID)) return [];
44963           var entity = context.entity(entityID);
44964           var key = osmEntity.key(entity);
44965
44966           if (!_issuesByEntityID[key]) {
44967               _issuesByEntityID[key] = validateEntity(entity);
44968           }
44969           return _issuesByEntityID[key];
44970       };
44971
44972
44973       function validateEntity(entity) {
44974           var _issues = [];
44975           var ran = {};
44976
44977           // runs validation and appends resulting issues, returning true if validation passed
44978           function runValidation(which) {
44979               if (ran[which]) return true;
44980
44981               var fn = validations[which];
44982               var typeIssues = fn(entity, context);
44983               _issues = _issues.concat(typeIssues);
44984               ran[which] = true;   // mark this validation as having run
44985               return !typeIssues.length;
44986           }
44987
44988           if (entity.type === 'relation') {
44989               if (!runValidation('old_multipolygon')) {
44990                   // don't flag missing tags if they are on the outer way
44991                   ran.missing_tag = true;
44992               }
44993           }
44994
44995           // other validations require feature to be tagged
44996           if (!runValidation('missing_tag')) return _issues;
44997
44998           if (entity.type === 'way') {
44999               runValidation('crossing_ways');
45000
45001               // only check for disconnected way if no almost junctions
45002               if (runValidation('almost_junction')) {
45003                   runValidation('disconnected_way');
45004               } else {
45005                   ran.disconnected_way = true;
45006               }
45007
45008               runValidation('tag_suggests_area');
45009           }
45010
45011           // run all validations not yet run manually
45012           entityValidationIDs.forEach(runValidation);
45013
45014           return _issues;
45015       }
45016
45017
45018       self.validate = function() {
45019           _issuesByEntityID = {};   // clear cached
45020           _issues = [];
45021
45022           for (var validationIndex in validations) {
45023               if (validations[validationIndex].reset) {
45024                   validations[validationIndex].reset();
45025               }
45026           }
45027
45028           var history = context.history();
45029           var changes = history.changes();
45030           var entitiesToCheck = changes.created.concat(changes.modified);
45031           var graph = history.graph();
45032
45033           _issues = flatten(changesValidationIDs.map(function(ruleID) {
45034               var validation = validations[ruleID];
45035               return validation(changes, context);
45036           }));
45037
45038           entitiesToCheck = uniq(flattenDeep(entitiesToCheck.map(function(entity) {
45039               var entities = [entity];
45040               if (entity.type === 'node') {  // validate ways if their nodes have changed
45041                   entities = entities.concat(graph.parentWays(entity));
45042               }
45043               entities = entities.map(function(entity) {
45044                   if (entity.type !== 'relation') {  // validate relations if their geometries have changed
45045                       return [entity].concat(graph.parentRelations(entity));
45046                   }
45047                   return entity;
45048               });
45049               return entities;
45050           })));
45051
45052           var issuesByID = {};
45053
45054           for (var entityIndex in entitiesToCheck) {
45055               var entity = entitiesToCheck[entityIndex];
45056               var entityIssues = validateEntity(entity);
45057               _issuesByEntityID[entity.id] = entityIssues;
45058               entityIssues.forEach(function(issue) {
45059                   // Different entities can produce the same issue so store them by
45060                   // the ID to ensure that there are no duplicate issues.
45061                   issuesByID[issue.id()] = issue;
45062               });
45063           }
45064
45065           for (var issueID in issuesByID) {
45066               _issues.push(issuesByID[issueID]);
45067           }
45068
45069           dispatch$1.call('reload', self, _issues);
45070       };
45071
45072       return utilRebind(self, dispatch$1, 'on');
45073   }
45074
45075
45076   function validationIssue(attrs) {
45077       this.type = attrs.type;                // required
45078       this.severity = attrs.severity;        // required - 'warning' or 'error'
45079       this.message = attrs.message;          // required - localized string
45080       this.tooltip = attrs.tooltip;          // required - localized string
45081       this.entities = attrs.entities;        // optional - array of entities
45082       this.loc = attrs.loc;                  // optional - expect a [lon, lat] array
45083       this.info = attrs.info;                // optional - object containing arbitrary extra information
45084       this.fixes = attrs.fixes;              // optional - array of validationIssueFix objects
45085       this.hash = attrs.hash;                // optional - string to further differentiate the issue
45086
45087
45088       var _id;
45089
45090       // A unique, deterministic string hash.
45091       // Issues with identical id values are considered identical.
45092       this.id = function() {
45093           if (_id) {
45094               return _id;
45095           }
45096
45097           _id = this.type;
45098
45099           if (this.hash) {   // subclasses can pass in their own differentiator
45100               _id += this.hash;
45101           }
45102
45103           // factor in the entities this issue is for
45104           // (sort them so the id is deterministic)
45105           var entityKeys = this.entities.map(osmEntity.key);
45106           _id += entityKeys.sort().join();
45107
45108           // factor in loc since two separate issues can have an
45109           // idential type and entities, e.g. in crossing_ways
45110           if (this.loc) {
45111               _id += this.loc.join();
45112           }
45113           return _id;
45114       };
45115
45116
45117       this.extent = function(resolver) {
45118           if (this.loc) {
45119               return geoExtent(this.loc);
45120           }
45121           if (this.entities && this.entities.length) {
45122               return this.entities.reduce(function(extent, entity) {
45123                   return extent.extend(entity.extent(resolver));
45124               }, geoExtent());
45125           }
45126           return null;
45127       };
45128
45129
45130       if (this.fixes) {   // add a reference in the fixes to the issue for use in fix actions
45131           for (var i = 0; i < this.fixes.length; i++) {
45132               this.fixes[i].issue = this;
45133           }
45134       }
45135   }
45136
45137
45138   function validationIssueFix(attrs) {
45139       this.icon = attrs.icon;
45140       this.title = attrs.title;
45141       this.onClick = attrs.onClick;
45142       this.entityIds = attrs.entityIds || [];  // Used for hover-higlighting.
45143       this.issue = null;    // the issue this fix is for
45144   }
45145
45146   var buildRuleChecks = function() {
45147       return {
45148           equals: function (equals) {
45149               return function(tags) {
45150                   return isMatch(tags, equals);
45151               };
45152           },
45153           notEquals: function (notEquals) {
45154               return function(tags) {
45155                   return !isMatch(tags, notEquals);
45156               };
45157           },
45158           absence: function(absence) {
45159               return function(tags) {
45160                   return Object.keys(tags).indexOf(absence) === -1;
45161               };
45162           },
45163           presence: function(presence) {
45164               return function(tags) {
45165                   return Object.keys(tags).indexOf(presence) > -1;
45166               };
45167           },
45168           greaterThan: function(greaterThan) {
45169               var key = Object.keys(greaterThan)[0];
45170               var value = greaterThan[key];
45171
45172               return function(tags) {
45173                   return tags[key] > value;
45174               };
45175           },
45176           greaterThanEqual: function(greaterThanEqual) {
45177               var key = Object.keys(greaterThanEqual)[0];
45178               var value = greaterThanEqual[key];
45179
45180               return function(tags) {
45181                   return tags[key] >= value;
45182               };
45183           },
45184           lessThan: function(lessThan) {
45185               var key = Object.keys(lessThan)[0];
45186               var value = lessThan[key];
45187
45188               return function(tags) {
45189                   return tags[key] < value;
45190               };
45191           },
45192           lessThanEqual: function(lessThanEqual) {
45193               var key = Object.keys(lessThanEqual)[0];
45194               var value = lessThanEqual[key];
45195
45196               return function(tags) {
45197                   return tags[key] <= value;
45198               };
45199           },
45200           positiveRegex: function(positiveRegex) {
45201               var tagKey = Object.keys(positiveRegex)[0];
45202               var expression = positiveRegex[tagKey].join('|');
45203               var regex = new RegExp(expression);
45204
45205               return function(tags) {
45206                   return regex.test(tags[tagKey]);
45207               };
45208           },
45209           negativeRegex: function(negativeRegex) {
45210               var tagKey = Object.keys(negativeRegex)[0];
45211               var expression = negativeRegex[tagKey].join('|');
45212               var regex = new RegExp(expression);
45213
45214               return function(tags) {
45215                   return !regex.test(tags[tagKey]);
45216               };
45217           }
45218       };
45219   };
45220
45221   var buildLineKeys = function() {
45222       return {
45223           highway: {
45224               rest_area: true,
45225               services: true
45226           },
45227           railway: {
45228               roundhouse: true,
45229               station: true,
45230               traverser: true,
45231               turntable: true,
45232               wash: true
45233           }
45234       };
45235   };
45236
45237   var serviceMapRules = {
45238       init: function() {
45239           this._ruleChecks  = buildRuleChecks();
45240           this._validationRules = [];
45241           this._areaKeys = areaKeys;
45242           this._lineKeys = buildLineKeys();
45243       },
45244
45245       // list of rules only relevant to tag checks...
45246       filterRuleChecks: function(selector) {
45247           var _ruleChecks = this._ruleChecks;
45248           return reduce(Object.keys(selector), function(rules, key) {
45249               if (['geometry', 'error', 'warning'].indexOf(key) === -1) {
45250                   rules.push(_ruleChecks[key](selector[key]));
45251               }
45252               return rules;
45253           }, []);
45254       },
45255
45256       // builds tagMap from mapcss-parse selector object...
45257       buildTagMap: function(selector) {
45258           var getRegexValues = function(regexes) {
45259               return regexes.map(function(regex) {
45260                   return regex.replace(/\$|\^/g, '');
45261               });
45262           };
45263
45264           var selectorKeys = Object.keys(selector);
45265           var tagMap = reduce(selectorKeys, function (expectedTags, key) {
45266               var values;
45267               var isRegex = /regex/gi.test(key);
45268               var isEqual = /equals/gi.test(key);
45269
45270               if (isRegex || isEqual) {
45271                   Object.keys(selector[key]).forEach(function(selectorKey) {
45272                       values = isEqual ? [selector[key][selectorKey]] : getRegexValues(selector[key][selectorKey]);
45273
45274                       if (expectedTags.hasOwnProperty(selectorKey)) {
45275                           values = values.concat(expectedTags[selectorKey]);
45276                       }
45277
45278                       expectedTags[selectorKey] = values;
45279                   });
45280
45281               } else if (/(greater|less)Than(Equal)?|presence/g.test(key)) {
45282                   var tagKey = /presence/.test(key) ? selector[key] : Object.keys(selector[key])[0];
45283
45284                   values = [selector[key][tagKey]];
45285
45286                   if (expectedTags.hasOwnProperty(tagKey)) {
45287                       values = values.concat(expectedTags[tagKey]);
45288                   }
45289
45290                   expectedTags[tagKey] = values;
45291               }
45292
45293               return expectedTags;
45294           }, {});
45295
45296           return tagMap;
45297       },
45298
45299       // inspired by osmWay#isArea()
45300       inferGeometry: function(tagMap) {
45301           var _lineKeys = this._lineKeys;
45302           var _areaKeys = this._areaKeys;
45303
45304           var isAreaKeyBlackList = function(key) {
45305               return intersection(tagMap[key], Object.keys(_areaKeys[key])).length > 0;
45306           };
45307           var isLineKeysWhiteList = function(key) {
45308               return intersection(tagMap[key], Object.keys(_lineKeys[key])).length > 0;
45309           };
45310
45311           if (tagMap.hasOwnProperty('area')) {
45312               if (tagMap.area.indexOf('yes') > -1) {
45313                   return 'area';
45314               }
45315               if (tagMap.area.indexOf('no') > -1) {
45316                   return 'line';
45317               }
45318           }
45319
45320           for (var key in tagMap) {
45321               if (key in _areaKeys && !isAreaKeyBlackList(key)) {
45322                   return 'area';
45323               }
45324               if (key in _lineKeys && isLineKeysWhiteList(key)) {
45325                   return 'area';
45326               }
45327           }
45328
45329           return 'line';
45330       },
45331
45332       // adds from mapcss-parse selector check...
45333       addRule: function(selector) {
45334           var rule = {
45335               // checks relevant to mapcss-selector
45336               checks: this.filterRuleChecks(selector),
45337               // true if all conditions for a tag error are true..
45338               matches: function(entity) {
45339                   return every(this.checks, function(check) {
45340                       return check(entity.tags);
45341                   });
45342               },
45343               // borrowed from Way#isArea()
45344               inferredGeometry: this.inferGeometry(this.buildTagMap(selector), this._areaKeys),
45345               geometryMatches: function(entity, graph) {
45346                   if (entity.type === 'node' || entity.type === 'relation') {
45347                       return selector.geometry === entity.type;
45348                   } else if (entity.type === 'way') {
45349                       return this.inferredGeometry === entity.geometry(graph);
45350                   }
45351               },
45352               // when geometries match and tag matches are present, return a warning...
45353               findIssues: function (entity, graph, issues) {
45354                   if (this.geometryMatches(entity, graph) && this.matches(entity)) {
45355                       var severity = Object.keys(selector).indexOf('error') > -1
45356                               ? 'error'
45357                               : 'warning';
45358                       issues.push(new validationIssue({
45359                           type: 'maprules',
45360                           severity: severity,
45361                           message: selector[severity],
45362                           entities: [entity],
45363                       }));
45364                   }
45365               }
45366           };
45367           this._validationRules.push(rule);
45368       },
45369
45370       clearRules: function() { this._validationRules = []; },
45371
45372       // returns validationRules...
45373       validationRules: function() { return this._validationRules; },
45374
45375       // returns ruleChecks
45376       ruleChecks: function() { return this._ruleChecks; }
45377   };
45378
45379   var apibase$1 = 'https://nominatim.openstreetmap.org/',
45380       inflight = {},
45381       nominatimCache;
45382
45383
45384   var serviceNominatim = {
45385
45386       init: function() {
45387           inflight = {};
45388           nominatimCache = rbush_1();
45389       },
45390
45391       reset: function() {
45392           forEach(inflight, function(req) { req.abort(); });
45393           inflight = {};
45394           nominatimCache = rbush_1();
45395       },
45396
45397
45398       countryCode: function (location, callback) {
45399           this.reverse(location, function(err, result) {
45400               if (err) {
45401                   return callback(err);
45402               } else if (result.address) {
45403                   return callback(null, result.address.country_code);
45404               } else {
45405                   return callback('Unable to geocode', null);
45406               }
45407           });
45408       },
45409
45410
45411       reverse: function (location, callback) {
45412           var cached = nominatimCache.search(
45413               { minX: location[0], minY: location[1], maxX: location[0], maxY: location[1] }
45414           );
45415
45416           if (cached.length > 0) {
45417               return callback(null, cached[0].data);
45418           }
45419
45420           var params = { zoom: 13, format: 'json', addressdetails: 1, lat: location[1], lon: location[0] };
45421           var url = apibase$1 + 'reverse?' + utilQsString(params);
45422           if (inflight[url]) return;
45423
45424           inflight[url] = d3_json(url, function(err, result) {
45425               delete inflight[url];
45426
45427               if (err) {
45428                   return callback(err);
45429               } else if (result && result.error) {
45430                   return callback(result.error);
45431               }
45432
45433               var extent = geoExtent(location).padByMeters(200);
45434               nominatimCache.insert(assign(extent.bbox(), {data: result}));
45435
45436               callback(null, result);
45437           });
45438       },
45439
45440
45441       search: function (val, callback) {
45442           var searchVal = encodeURIComponent(val);
45443           var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
45444           if (inflight[url]) return;
45445
45446           inflight[url] = d3_json(url, function(err, result) {
45447               delete inflight[url];
45448               callback(err, result);
45449           });
45450       }
45451
45452   };
45453
45454   var apibase$2 = 'https://openstreetcam.org';
45455   var maxResults$1 = 1000;
45456   var tileZoom$1 = 14;
45457   var tiler$3 = utilTiler().zoomExtent([tileZoom$1, tileZoom$1]).skipNullIsland(true);
45458   var dispatch$4 = dispatch('loadedImages');
45459   var imgZoom = d3_zoom()
45460       .extent([[0, 0], [320, 240]])
45461       .translateExtent([[0, 0], [320, 240]])
45462       .scaleExtent([1, 15])
45463       .on('zoom', zoomPan);
45464   var _oscCache;
45465   var _oscSelectedImage;
45466
45467
45468   function abortRequest$3(i) {
45469       i.abort();
45470   }
45471
45472
45473   function maxPageAtZoom$1(z) {
45474       if (z < 15)   return 2;
45475       if (z === 15) return 5;
45476       if (z === 16) return 10;
45477       if (z === 17) return 20;
45478       if (z === 18) return 40;
45479       if (z > 18)   return 80;
45480   }
45481
45482
45483   function loadTiles$1(which, url, projection) {
45484       var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
45485       var tiles = tiler$3.getTiles(projection);
45486
45487       // abort inflight requests that are no longer needed
45488       var cache = _oscCache[which];
45489       forEach(cache.inflight, function(v, k) {
45490           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
45491
45492           if (!wanted) {
45493               abortRequest$3(v);
45494               delete cache.inflight[k];
45495           }
45496       });
45497
45498       tiles.forEach(function(tile) {
45499           loadNextTilePage$1(which, currZoom, url, tile);
45500       });
45501   }
45502
45503
45504   function loadNextTilePage$1(which, currZoom, url, tile) {
45505       var cache = _oscCache[which];
45506       var bbox = tile.extent.bbox();
45507       var maxPages = maxPageAtZoom$1(currZoom);
45508       var nextPage = cache.nextPage[tile.id] || 1;
45509       var params = utilQsString({
45510           ipp: maxResults$1,
45511           page: nextPage,
45512           // client_id: clientId,
45513           bbTopLeft: [bbox.maxY, bbox.minX].join(','),
45514           bbBottomRight: [bbox.minY, bbox.maxX].join(',')
45515       }, true);
45516
45517       if (nextPage > maxPages) return;
45518
45519       var id = tile.id + ',' + String(nextPage);
45520       if (cache.loaded[id] || cache.inflight[id]) return;
45521
45522       cache.inflight[id] = request(url)
45523           .mimeType('application/json')
45524           .header('Content-type', 'application/x-www-form-urlencoded')
45525           .response(function(xhr) { return JSON.parse(xhr.responseText); })
45526           .post(params, function(err, data) {
45527               cache.loaded[id] = true;
45528               delete cache.inflight[id];
45529               if (err || !data.currentPageItems || !data.currentPageItems.length) return;
45530
45531               function localeDateString(s) {
45532                   if (!s) return null;
45533                   var detected = utilDetect();
45534                   var options = { day: 'numeric', month: 'short', year: 'numeric' };
45535                   var d = new Date(s);
45536                   if (isNaN(d.getTime())) return null;
45537                   return d.toLocaleDateString(detected.locale, options);
45538               }
45539
45540               var features = data.currentPageItems.map(function(item) {
45541                   var loc = [+item.lng, +item.lat];
45542                   var d;
45543
45544                   if (which === 'images') {
45545                       d = {
45546                           loc: loc,
45547                           key: item.id,
45548                           ca: +item.heading,
45549                           captured_at: localeDateString(item.shot_date || item.date_added),
45550                           captured_by: item.username,
45551                           imagePath: item.lth_name,
45552                           sequence_id: item.sequence_id,
45553                           sequence_index: +item.sequence_index
45554                       };
45555
45556                       // cache sequence info
45557                       var seq = _oscCache.sequences[d.sequence_id];
45558                       if (!seq) {
45559                           seq = { rotation: 0, images: [] };
45560                           _oscCache.sequences[d.sequence_id] = seq;
45561                       }
45562                       seq.images[d.sequence_index] = d;
45563                   }
45564
45565                   return {
45566                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
45567                   };
45568               });
45569
45570               cache.rtree.load(features);
45571
45572               if (which === 'images') {
45573                   dispatch$4.call('loadedImages');
45574               }
45575
45576               if (data.currentPageItems.length === maxResults$1) {  // more pages to load
45577                   cache.nextPage[tile.id] = nextPage + 1;
45578                   loadNextTilePage$1(which, currZoom, url, tile);
45579               } else {
45580                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
45581               }
45582           });
45583   }
45584
45585
45586   // partition viewport into higher zoom tiles
45587   function partitionViewport$1(projection) {
45588       var z = geoScaleToZoom(projection.scale());
45589       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
45590       var tiler = utilTiler().zoomExtent([z2, z2]);
45591
45592       return tiler.getTiles(projection)
45593           .map(function(tile) { return tile.extent; });
45594   }
45595
45596
45597   // no more than `limit` results per partition.
45598   function searchLimited$1(limit, projection, rtree) {
45599       limit = limit || 5;
45600
45601       return partitionViewport$1(projection)
45602           .reduce(function(result, extent) {
45603               var found = rtree.search(extent.bbox())
45604                   .slice(0, limit)
45605                   .map(function(d) { return d.data; });
45606
45607               return (found.length ? result.concat(found) : result);
45608           }, []);
45609   }
45610
45611
45612   function zoomPan() {
45613       var t = event.transform;
45614       select('#photoviewer .osc-image-wrap')
45615           .call(utilSetTransform, t.x, t.y, t.k);
45616   }
45617
45618
45619   var serviceOpenstreetcam = {
45620
45621       init: function() {
45622           if (!_oscCache) {
45623               this.reset();
45624           }
45625
45626           this.event = utilRebind(this, dispatch$4, 'on');
45627       },
45628
45629       reset: function() {
45630           var cache = _oscCache;
45631
45632           if (cache) {
45633               if (cache.images && cache.images.inflight) {
45634                   forEach(cache.images.inflight, abortRequest$3);
45635               }
45636           }
45637
45638           _oscCache = {
45639               images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
45640               sequences: {}
45641           };
45642
45643           _oscSelectedImage = null;
45644       },
45645
45646
45647       images: function(projection) {
45648           var limit = 5;
45649           return searchLimited$1(limit, projection, _oscCache.images.rtree);
45650       },
45651
45652
45653       sequences: function(projection) {
45654           var viewport = projection.clipExtent();
45655           var min = [viewport[0][0], viewport[1][1]];
45656           var max = [viewport[1][0], viewport[0][1]];
45657           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
45658           var sequenceKeys = {};
45659
45660           // all sequences for images in viewport
45661           _oscCache.images.rtree.search(bbox)
45662               .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
45663
45664           // make linestrings from those sequences
45665           var lineStrings = [];
45666           Object.keys(sequenceKeys)
45667               .forEach(function(sequenceKey) {
45668                   var seq = _oscCache.sequences[sequenceKey];
45669                   var images = seq && seq.images;
45670                   if (images) {
45671                       lineStrings.push({
45672                           type: 'LineString',
45673                           coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
45674                           properties: { key: sequenceKey }
45675                       });
45676                   }
45677               });
45678           return lineStrings;
45679       },
45680
45681
45682       loadImages: function(projection) {
45683           var url = apibase$2 + '/1.0/list/nearby-photos/';
45684           loadTiles$1('images', url, projection);
45685       },
45686
45687
45688       loadViewer: function(context) {
45689           var that = this;
45690
45691           // add osc-wrapper
45692           var wrap = select('#photoviewer').selectAll('.osc-wrapper')
45693               .data([0]);
45694
45695           var wrapEnter = wrap.enter()
45696               .append('div')
45697               .attr('class', 'photo-wrapper osc-wrapper')
45698               .classed('hide', true)
45699               .call(imgZoom)
45700               .on('dblclick.zoom', null);
45701
45702           wrapEnter
45703               .append('div')
45704               .attr('class', 'photo-attribution fillD');
45705
45706           var controlsEnter = wrapEnter
45707               .append('div')
45708               .attr('class', 'photo-controls-wrap')
45709               .append('div')
45710               .attr('class', 'photo-controls');
45711
45712           controlsEnter
45713               .append('button')
45714               .on('click.back', step(-1))
45715               .text('◄');
45716
45717           controlsEnter
45718               .append('button')
45719               .on('click.rotate-ccw', rotate(-90))
45720               .text('⤿');
45721
45722           controlsEnter
45723               .append('button')
45724               .on('click.rotate-cw', rotate(90))
45725               .text('⤾');
45726
45727           controlsEnter
45728               .append('button')
45729               .on('click.forward', step(1))
45730               .text('►');
45731
45732           wrapEnter
45733               .append('div')
45734               .attr('class', 'osc-image-wrap');
45735
45736
45737           // Register viewer resize handler
45738           context.ui().photoviewer.on('resize', function(dimensions) {
45739               imgZoom = d3_zoom()
45740                   .extent([[0, 0], dimensions])
45741                   .translateExtent([[0, 0], dimensions])
45742                   .scaleExtent([1, 15])
45743                   .on('zoom', zoomPan);
45744           });
45745
45746
45747           function rotate(deg) {
45748               return function() {
45749                   if (!_oscSelectedImage) return;
45750                   var sequenceKey = _oscSelectedImage.sequence_id;
45751                   var sequence = _oscCache.sequences[sequenceKey];
45752                   if (!sequence) return;
45753
45754                   var r = sequence.rotation || 0;
45755                   r += deg;
45756
45757                   if (r > 180) r -= 360;
45758                   if (r < -180) r += 360;
45759                   sequence.rotation = r;
45760
45761                   var wrap = select('#photoviewer .osc-wrapper');
45762
45763                   wrap
45764                       .transition()
45765                       .duration(100)
45766                       .call(imgZoom.transform, identity$7);
45767
45768                   wrap.selectAll('.osc-image')
45769                       .transition()
45770                       .duration(100)
45771                       .style('transform', 'rotate(' + r + 'deg)');
45772               };
45773           }
45774
45775           function step(stepBy) {
45776               return function() {
45777                   if (!_oscSelectedImage) return;
45778                   var sequenceKey = _oscSelectedImage.sequence_id;
45779                   var sequence = _oscCache.sequences[sequenceKey];
45780                   if (!sequence) return;
45781
45782                   var nextIndex = _oscSelectedImage.sequence_index + stepBy;
45783                   var nextImage = sequence.images[nextIndex];
45784                   if (!nextImage) return;
45785
45786                   context.map().centerEase(nextImage.loc);
45787
45788                   that
45789                       .selectImage(nextImage)
45790                       .updateViewer(nextImage);
45791               };
45792           }
45793       },
45794
45795
45796       showViewer: function() {
45797           var viewer = select('#photoviewer')
45798               .classed('hide', false);
45799
45800           var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
45801
45802           if (isHidden) {
45803               viewer
45804                   .selectAll('.photo-wrapper:not(.osc-wrapper)')
45805                   .classed('hide', true);
45806
45807               viewer
45808                   .selectAll('.photo-wrapper.osc-wrapper')
45809                   .classed('hide', false);
45810           }
45811
45812           return this;
45813       },
45814
45815
45816       hideViewer: function() {
45817           _oscSelectedImage = null;
45818
45819           var viewer = select('#photoviewer');
45820           if (!viewer.empty()) viewer.datum(null);
45821
45822           viewer
45823               .classed('hide', true)
45824               .selectAll('.photo-wrapper')
45825               .classed('hide', true);
45826
45827           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
45828               .classed('currentView', false);
45829
45830           return this.setStyles(null, true);
45831       },
45832
45833
45834       updateViewer: function(d) {
45835           var wrap = select('#photoviewer .osc-wrapper');
45836           var imageWrap = wrap.selectAll('.osc-image-wrap');
45837           var attribution = wrap.selectAll('.photo-attribution').html('');
45838
45839           wrap
45840               .transition()
45841               .duration(100)
45842               .call(imgZoom.transform, identity$7);
45843
45844           imageWrap
45845               .selectAll('.osc-image')
45846               .remove();
45847
45848           if (d) {
45849               var sequence = _oscCache.sequences[d.sequence_id];
45850               var r = (sequence && sequence.rotation) || 0;
45851
45852               imageWrap
45853                   .append('img')
45854                   .attr('class', 'osc-image')
45855                   .attr('src', apibase$2 + '/' + d.imagePath)
45856                   .style('transform', 'rotate(' + r + 'deg)');
45857
45858               if (d.captured_by) {
45859                   attribution
45860                       .append('a')
45861                       .attr('class', 'captured_by')
45862                       .attr('target', '_blank')
45863                       .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
45864                       .text('@' + d.captured_by);
45865
45866                   attribution
45867                       .append('span')
45868                       .text('|');
45869               }
45870
45871               if (d.captured_at) {
45872                   attribution
45873                       .append('span')
45874                       .attr('class', 'captured_at')
45875                       .text(d.captured_at);
45876
45877                   attribution
45878                       .append('span')
45879                       .text('|');
45880               }
45881
45882               attribution
45883                   .append('a')
45884                   .attr('class', 'image-link')
45885                   .attr('target', '_blank')
45886                   .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
45887                   .text('openstreetcam.org');
45888           }
45889           return this;
45890       },
45891
45892
45893       selectImage: function(d) {
45894           _oscSelectedImage = d;
45895           var viewer = select('#photoviewer');
45896           if (!viewer.empty()) viewer.datum(d);
45897
45898           this.setStyles(null, true);
45899
45900           d3_selectAll('.icon-sign')
45901               .classed('currentView', false);
45902
45903           return this;
45904       },
45905
45906
45907       getSelectedImage: function() {
45908           return _oscSelectedImage;
45909       },
45910
45911
45912       getSequenceKeyForImage: function(d) {
45913           return d && d.sequence_id;
45914       },
45915
45916
45917       // Updates the currently highlighted sequence and selected bubble.
45918       // Reset is only necessary when interacting with the viewport because
45919       // this implicitly changes the currently selected bubble/sequence
45920       setStyles: function(hovered, reset) {
45921           if (reset) {  // reset all layers
45922               d3_selectAll('.viewfield-group')
45923                   .classed('highlighted', false)
45924                   .classed('hovered', false)
45925                   .classed('currentView', false);
45926
45927               d3_selectAll('.sequence')
45928                   .classed('highlighted', false)
45929                   .classed('currentView', false);
45930           }
45931
45932           var hoveredImageKey = hovered && hovered.key;
45933           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
45934           var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
45935           var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
45936
45937           var viewer = select('#photoviewer');
45938           var selected = viewer.empty() ? undefined : viewer.datum();
45939           var selectedImageKey = selected && selected.key;
45940           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
45941           var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
45942           var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
45943
45944           // highlight sibling viewfields on either the selected or the hovered sequences
45945           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
45946
45947           d3_selectAll('.layer-openstreetcam-images .viewfield-group')
45948               .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
45949               .classed('hovered', function(d) { return d.key === hoveredImageKey; })
45950               .classed('currentView', function(d) { return d.key === selectedImageKey; });
45951
45952           d3_selectAll('.layer-openstreetcam-images .sequence')
45953               .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
45954               .classed('currentView', function(d) { return d.properties.key === selectedSequenceKey; });
45955
45956           // update viewfields if needed
45957           d3_selectAll('.viewfield-group .viewfield')
45958               .attr('d', viewfieldPath);
45959
45960           function viewfieldPath() {
45961               var d = this.parentNode.__data__;
45962               if (d.pano && d.key !== selectedImageKey) {
45963                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
45964               } else {
45965                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
45966               }
45967           }
45968
45969           return this;
45970       },
45971
45972
45973       cache: function() {
45974           return _oscCache;
45975       }
45976
45977   };
45978
45979   /* Built-in method references for those with the same name as other `lodash` methods. */
45980   var nativeCeil = Math.ceil,
45981       nativeMax$4 = Math.max;
45982
45983   /**
45984    * Creates an array of elements split into groups the length of `size`.
45985    * If `array` can't be split evenly, the final chunk will be the remaining
45986    * elements.
45987    *
45988    * @static
45989    * @memberOf _
45990    * @since 3.0.0
45991    * @category Array
45992    * @param {Array} array The array to process.
45993    * @param {number} [size=1] The length of each chunk
45994    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
45995    * @returns {Array} Returns the new array of chunks.
45996    * @example
45997    *
45998    * _.chunk(['a', 'b', 'c', 'd'], 2);
45999    * // => [['a', 'b'], ['c', 'd']]
46000    *
46001    * _.chunk(['a', 'b', 'c', 'd'], 3);
46002    * // => [['a', 'b', 'c'], ['d']]
46003    */
46004   function chunk(array, size, guard) {
46005     if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
46006       size = 1;
46007     } else {
46008       size = nativeMax$4(toInteger(size), 0);
46009     }
46010     var length = array == null ? 0 : array.length;
46011     if (!length || size < 1) {
46012       return [];
46013     }
46014     var index = 0,
46015         resIndex = 0,
46016         result = Array(nativeCeil(length / size));
46017
46018     while (index < length) {
46019       result[resIndex++] = baseSlice(array, index, (index += size));
46020     }
46021     return result;
46022   }
46023
46024   var hashes = createCommonjsModule(function (module, exports) {
46025   /**
46026    * jshashes - https://github.com/h2non/jshashes
46027    * Released under the "New BSD" license
46028    *
46029    * Algorithms specification:
46030    *
46031    * MD5 - http://www.ietf.org/rfc/rfc1321.txt
46032    * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
46033    * SHA1   - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
46034    * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
46035    * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
46036    * HMAC - http://www.ietf.org/rfc/rfc2104.txt
46037    */
46038   (function() {
46039     var Hashes;
46040
46041     function utf8Encode(str) {
46042       var x, y, output = '',
46043         i = -1,
46044         l;
46045
46046       if (str && str.length) {
46047         l = str.length;
46048         while ((i += 1) < l) {
46049           /* Decode utf-16 surrogate pairs */
46050           x = str.charCodeAt(i);
46051           y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
46052           if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
46053             x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
46054             i += 1;
46055           }
46056           /* Encode output as utf-8 */
46057           if (x <= 0x7F) {
46058             output += String.fromCharCode(x);
46059           } else if (x <= 0x7FF) {
46060             output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
46061               0x80 | (x & 0x3F));
46062           } else if (x <= 0xFFFF) {
46063             output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
46064               0x80 | ((x >>> 6) & 0x3F),
46065               0x80 | (x & 0x3F));
46066           } else if (x <= 0x1FFFFF) {
46067             output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
46068               0x80 | ((x >>> 12) & 0x3F),
46069               0x80 | ((x >>> 6) & 0x3F),
46070               0x80 | (x & 0x3F));
46071           }
46072         }
46073       }
46074       return output;
46075     }
46076
46077     function utf8Decode(str) {
46078       var i, ac, c1, c2, c3, arr = [],
46079         l;
46080       i = ac = c1 = c2 = c3 = 0;
46081
46082       if (str && str.length) {
46083         l = str.length;
46084         str += '';
46085
46086         while (i < l) {
46087           c1 = str.charCodeAt(i);
46088           ac += 1;
46089           if (c1 < 128) {
46090             arr[ac] = String.fromCharCode(c1);
46091             i += 1;
46092           } else if (c1 > 191 && c1 < 224) {
46093             c2 = str.charCodeAt(i + 1);
46094             arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
46095             i += 2;
46096           } else {
46097             c2 = str.charCodeAt(i + 1);
46098             c3 = str.charCodeAt(i + 2);
46099             arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
46100             i += 3;
46101           }
46102         }
46103       }
46104       return arr.join('');
46105     }
46106
46107     /**
46108      * Add integers, wrapping at 2^32. This uses 16-bit operations internally
46109      * to work around bugs in some JS interpreters.
46110      */
46111
46112     function safe_add(x, y) {
46113       var lsw = (x & 0xFFFF) + (y & 0xFFFF),
46114         msw = (x >> 16) + (y >> 16) + (lsw >> 16);
46115       return (msw << 16) | (lsw & 0xFFFF);
46116     }
46117
46118     /**
46119      * Bitwise rotate a 32-bit number to the left.
46120      */
46121
46122     function bit_rol(num, cnt) {
46123       return (num << cnt) | (num >>> (32 - cnt));
46124     }
46125
46126     /**
46127      * Convert a raw string to a hex string
46128      */
46129
46130     function rstr2hex(input, hexcase) {
46131       var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
46132         output = '',
46133         x, i = 0,
46134         l = input.length;
46135       for (; i < l; i += 1) {
46136         x = input.charCodeAt(i);
46137         output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
46138       }
46139       return output;
46140     }
46141
46142     /**
46143      * Convert an array of big-endian words to a string
46144      */
46145
46146     function binb2rstr(input) {
46147       var i, l = input.length * 32,
46148         output = '';
46149       for (i = 0; i < l; i += 8) {
46150         output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
46151       }
46152       return output;
46153     }
46154
46155     /**
46156      * Convert an array of little-endian words to a string
46157      */
46158
46159     function binl2rstr(input) {
46160       var i, l = input.length * 32,
46161         output = '';
46162       for (i = 0; i < l; i += 8) {
46163         output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
46164       }
46165       return output;
46166     }
46167
46168     /**
46169      * Convert a raw string to an array of little-endian words
46170      * Characters >255 have their high-byte silently ignored.
46171      */
46172
46173     function rstr2binl(input) {
46174       var i, l = input.length * 8,
46175         output = Array(input.length >> 2),
46176         lo = output.length;
46177       for (i = 0; i < lo; i += 1) {
46178         output[i] = 0;
46179       }
46180       for (i = 0; i < l; i += 8) {
46181         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
46182       }
46183       return output;
46184     }
46185
46186     /**
46187      * Convert a raw string to an array of big-endian words
46188      * Characters >255 have their high-byte silently ignored.
46189      */
46190
46191     function rstr2binb(input) {
46192       var i, l = input.length * 8,
46193         output = Array(input.length >> 2),
46194         lo = output.length;
46195       for (i = 0; i < lo; i += 1) {
46196         output[i] = 0;
46197       }
46198       for (i = 0; i < l; i += 8) {
46199         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
46200       }
46201       return output;
46202     }
46203
46204     /**
46205      * Convert a raw string to an arbitrary string encoding
46206      */
46207
46208     function rstr2any(input, encoding) {
46209       var divisor = encoding.length,
46210         remainders = Array(),
46211         i, q, x, ld, quotient, dividend, output, full_length;
46212
46213       /* Convert to an array of 16-bit big-endian values, forming the dividend */
46214       dividend = Array(Math.ceil(input.length / 2));
46215       ld = dividend.length;
46216       for (i = 0; i < ld; i += 1) {
46217         dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
46218       }
46219
46220       /**
46221        * Repeatedly perform a long division. The binary array forms the dividend,
46222        * the length of the encoding is the divisor. Once computed, the quotient
46223        * forms the dividend for the next step. We stop when the dividend is zerHashes.
46224        * All remainders are stored for later use.
46225        */
46226       while (dividend.length > 0) {
46227         quotient = Array();
46228         x = 0;
46229         for (i = 0; i < dividend.length; i += 1) {
46230           x = (x << 16) + dividend[i];
46231           q = Math.floor(x / divisor);
46232           x -= q * divisor;
46233           if (quotient.length > 0 || q > 0) {
46234             quotient[quotient.length] = q;
46235           }
46236         }
46237         remainders[remainders.length] = x;
46238         dividend = quotient;
46239       }
46240
46241       /* Convert the remainders to the output string */
46242       output = '';
46243       for (i = remainders.length - 1; i >= 0; i--) {
46244         output += encoding.charAt(remainders[i]);
46245       }
46246
46247       /* Append leading zero equivalents */
46248       full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
46249       for (i = output.length; i < full_length; i += 1) {
46250         output = encoding[0] + output;
46251       }
46252       return output;
46253     }
46254
46255     /**
46256      * Convert a raw string to a base-64 string
46257      */
46258
46259     function rstr2b64(input, b64pad) {
46260       var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
46261         output = '',
46262         len = input.length,
46263         i, j, triplet;
46264       b64pad = b64pad || '=';
46265       for (i = 0; i < len; i += 3) {
46266         triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
46267         for (j = 0; j < 4; j += 1) {
46268           if (i * 8 + j * 6 > input.length * 8) {
46269             output += b64pad;
46270           } else {
46271             output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
46272           }
46273         }
46274       }
46275       return output;
46276     }
46277
46278     Hashes = {
46279       /**
46280        * @property {String} version
46281        * @readonly
46282        */
46283       VERSION: '1.0.6',
46284       /**
46285        * @member Hashes
46286        * @class Base64
46287        * @constructor
46288        */
46289       Base64: function() {
46290         // private properties
46291         var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
46292           pad = '=', // default pad according with the RFC standard
46293           utf8 = true; // by default enable UTF-8 support encoding
46294
46295         // public method for encoding
46296         this.encode = function(input) {
46297           var i, j, triplet,
46298             output = '',
46299             len = input.length;
46300
46301           pad = pad || '=';
46302           input = (utf8) ? utf8Encode(input) : input;
46303
46304           for (i = 0; i < len; i += 3) {
46305             triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
46306             for (j = 0; j < 4; j += 1) {
46307               if (i * 8 + j * 6 > len * 8) {
46308                 output += pad;
46309               } else {
46310                 output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
46311               }
46312             }
46313           }
46314           return output;
46315         };
46316
46317         // public method for decoding
46318         this.decode = function(input) {
46319           // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
46320           var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
46321             dec = '',
46322             arr = [];
46323           if (!input) {
46324             return input;
46325           }
46326
46327           i = ac = 0;
46328           input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
46329           //input += '';
46330
46331           do { // unpack four hexets into three octets using index points in b64
46332             h1 = tab.indexOf(input.charAt(i += 1));
46333             h2 = tab.indexOf(input.charAt(i += 1));
46334             h3 = tab.indexOf(input.charAt(i += 1));
46335             h4 = tab.indexOf(input.charAt(i += 1));
46336
46337             bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
46338
46339             o1 = bits >> 16 & 0xff;
46340             o2 = bits >> 8 & 0xff;
46341             o3 = bits & 0xff;
46342             ac += 1;
46343
46344             if (h3 === 64) {
46345               arr[ac] = String.fromCharCode(o1);
46346             } else if (h4 === 64) {
46347               arr[ac] = String.fromCharCode(o1, o2);
46348             } else {
46349               arr[ac] = String.fromCharCode(o1, o2, o3);
46350             }
46351           } while (i < input.length);
46352
46353           dec = arr.join('');
46354           dec = (utf8) ? utf8Decode(dec) : dec;
46355
46356           return dec;
46357         };
46358
46359         // set custom pad string
46360         this.setPad = function(str) {
46361           pad = str || pad;
46362           return this;
46363         };
46364         // set custom tab string characters
46365         this.setTab = function(str) {
46366           tab = str || tab;
46367           return this;
46368         };
46369         this.setUTF8 = function(bool) {
46370           if (typeof bool === 'boolean') {
46371             utf8 = bool;
46372           }
46373           return this;
46374         };
46375       },
46376
46377       /**
46378        * CRC-32 calculation
46379        * @member Hashes
46380        * @method CRC32
46381        * @static
46382        * @param {String} str Input String
46383        * @return {String}
46384        */
46385       CRC32: function(str) {
46386         var crc = 0,
46387           x = 0,
46388           y = 0,
46389           table, i, iTop;
46390         str = utf8Encode(str);
46391
46392         table = [
46393           '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
46394           '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
46395           '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
46396           '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
46397           'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
46398           '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
46399           'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
46400           '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
46401           'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
46402           '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
46403           'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
46404           '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
46405           'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
46406           '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
46407           '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
46408           '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
46409           '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
46410           'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
46411           '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
46412           'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
46413           '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
46414           'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
46415           '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
46416           'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
46417           '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
46418           'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
46419         ].join('');
46420
46421         crc = crc ^ (-1);
46422         for (i = 0, iTop = str.length; i < iTop; i += 1) {
46423           y = (crc ^ str.charCodeAt(i)) & 0xFF;
46424           x = '0x' + table.substr(y * 9, 8);
46425           crc = (crc >>> 8) ^ x;
46426         }
46427         // always return a positive number (that's what >>> 0 does)
46428         return (crc ^ (-1)) >>> 0;
46429       },
46430       /**
46431        * @member Hashes
46432        * @class MD5
46433        * @constructor
46434        * @param {Object} [config]
46435        *
46436        * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
46437        * Digest Algorithm, as defined in RFC 1321.
46438        * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
46439        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
46440        * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
46441        */
46442       MD5: function(options) {
46443         /**
46444          * Private config properties. You may need to tweak these to be compatible with
46445          * the server-side, but the defaults work in most cases.
46446          * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
46447          */
46448         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
46449           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
46450           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
46451
46452         // privileged (public) methods
46453         this.hex = function(s) {
46454           return rstr2hex(rstr(s, utf8), hexcase);
46455         };
46456         this.b64 = function(s) {
46457           return rstr2b64(rstr(s), b64pad);
46458         };
46459         this.any = function(s, e) {
46460           return rstr2any(rstr(s, utf8), e);
46461         };
46462         this.raw = function(s) {
46463           return rstr(s, utf8);
46464         };
46465         this.hex_hmac = function(k, d) {
46466           return rstr2hex(rstr_hmac(k, d), hexcase);
46467         };
46468         this.b64_hmac = function(k, d) {
46469           return rstr2b64(rstr_hmac(k, d), b64pad);
46470         };
46471         this.any_hmac = function(k, d, e) {
46472           return rstr2any(rstr_hmac(k, d), e);
46473         };
46474         /**
46475          * Perform a simple self-test to see if the VM is working
46476          * @return {String} Hexadecimal hash sample
46477          */
46478         this.vm_test = function() {
46479           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
46480         };
46481         /**
46482          * Enable/disable uppercase hexadecimal returned string
46483          * @param {Boolean}
46484          * @return {Object} this
46485          */
46486         this.setUpperCase = function(a) {
46487           if (typeof a === 'boolean') {
46488             hexcase = a;
46489           }
46490           return this;
46491         };
46492         /**
46493          * Defines a base64 pad string
46494          * @param {String} Pad
46495          * @return {Object} this
46496          */
46497         this.setPad = function(a) {
46498           b64pad = a || b64pad;
46499           return this;
46500         };
46501         /**
46502          * Defines a base64 pad string
46503          * @param {Boolean}
46504          * @return {Object} [this]
46505          */
46506         this.setUTF8 = function(a) {
46507           if (typeof a === 'boolean') {
46508             utf8 = a;
46509           }
46510           return this;
46511         };
46512
46513         // private methods
46514
46515         /**
46516          * Calculate the MD5 of a raw string
46517          */
46518
46519         function rstr(s) {
46520           s = (utf8) ? utf8Encode(s) : s;
46521           return binl2rstr(binl(rstr2binl(s), s.length * 8));
46522         }
46523
46524         /**
46525          * Calculate the HMAC-MD5, of a key and some data (raw strings)
46526          */
46527
46528         function rstr_hmac(key, data) {
46529           var bkey, ipad, opad, hash, i;
46530
46531           key = (utf8) ? utf8Encode(key) : key;
46532           data = (utf8) ? utf8Encode(data) : data;
46533           bkey = rstr2binl(key);
46534           if (bkey.length > 16) {
46535             bkey = binl(bkey, key.length * 8);
46536           }
46537
46538           ipad = Array(16), opad = Array(16);
46539           for (i = 0; i < 16; i += 1) {
46540             ipad[i] = bkey[i] ^ 0x36363636;
46541             opad[i] = bkey[i] ^ 0x5C5C5C5C;
46542           }
46543           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
46544           return binl2rstr(binl(opad.concat(hash), 512 + 128));
46545         }
46546
46547         /**
46548          * Calculate the MD5 of an array of little-endian words, and a bit length.
46549          */
46550
46551         function binl(x, len) {
46552           var i, olda, oldb, oldc, oldd,
46553             a = 1732584193,
46554             b = -271733879,
46555             c = -1732584194,
46556             d = 271733878;
46557
46558           /* append padding */
46559           x[len >> 5] |= 0x80 << ((len) % 32);
46560           x[(((len + 64) >>> 9) << 4) + 14] = len;
46561
46562           for (i = 0; i < x.length; i += 16) {
46563             olda = a;
46564             oldb = b;
46565             oldc = c;
46566             oldd = d;
46567
46568             a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
46569             d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
46570             c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
46571             b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
46572             a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
46573             d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
46574             c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
46575             b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
46576             a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
46577             d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
46578             c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
46579             b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
46580             a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
46581             d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
46582             c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
46583             b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
46584
46585             a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
46586             d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
46587             c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
46588             b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
46589             a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
46590             d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
46591             c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
46592             b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
46593             a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
46594             d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
46595             c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
46596             b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
46597             a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
46598             d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
46599             c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
46600             b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
46601
46602             a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
46603             d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
46604             c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
46605             b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
46606             a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
46607             d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
46608             c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
46609             b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
46610             a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
46611             d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
46612             c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
46613             b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
46614             a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
46615             d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
46616             c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
46617             b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
46618
46619             a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
46620             d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
46621             c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
46622             b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
46623             a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
46624             d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
46625             c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
46626             b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
46627             a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
46628             d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
46629             c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
46630             b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
46631             a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
46632             d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
46633             c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
46634             b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
46635
46636             a = safe_add(a, olda);
46637             b = safe_add(b, oldb);
46638             c = safe_add(c, oldc);
46639             d = safe_add(d, oldd);
46640           }
46641           return Array(a, b, c, d);
46642         }
46643
46644         /**
46645          * These functions implement the four basic operations the algorithm uses.
46646          */
46647
46648         function md5_cmn(q, a, b, x, s, t) {
46649           return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
46650         }
46651
46652         function md5_ff(a, b, c, d, x, s, t) {
46653           return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
46654         }
46655
46656         function md5_gg(a, b, c, d, x, s, t) {
46657           return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
46658         }
46659
46660         function md5_hh(a, b, c, d, x, s, t) {
46661           return md5_cmn(b ^ c ^ d, a, b, x, s, t);
46662         }
46663
46664         function md5_ii(a, b, c, d, x, s, t) {
46665           return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
46666         }
46667       },
46668       /**
46669        * @member Hashes
46670        * @class Hashes.SHA1
46671        * @param {Object} [config]
46672        * @constructor
46673        *
46674        * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
46675        * Version 2.2 Copyright Paul Johnston 2000 - 2009.
46676        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
46677        * See http://pajhome.org.uk/crypt/md5 for details.
46678        */
46679       SHA1: function(options) {
46680         /**
46681          * Private config properties. You may need to tweak these to be compatible with
46682          * the server-side, but the defaults work in most cases.
46683          * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
46684          */
46685         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
46686           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
46687           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
46688
46689         // public methods
46690         this.hex = function(s) {
46691           return rstr2hex(rstr(s, utf8), hexcase);
46692         };
46693         this.b64 = function(s) {
46694           return rstr2b64(rstr(s, utf8), b64pad);
46695         };
46696         this.any = function(s, e) {
46697           return rstr2any(rstr(s, utf8), e);
46698         };
46699         this.raw = function(s) {
46700           return rstr(s, utf8);
46701         };
46702         this.hex_hmac = function(k, d) {
46703           return rstr2hex(rstr_hmac(k, d));
46704         };
46705         this.b64_hmac = function(k, d) {
46706           return rstr2b64(rstr_hmac(k, d), b64pad);
46707         };
46708         this.any_hmac = function(k, d, e) {
46709           return rstr2any(rstr_hmac(k, d), e);
46710         };
46711         /**
46712          * Perform a simple self-test to see if the VM is working
46713          * @return {String} Hexadecimal hash sample
46714          * @public
46715          */
46716         this.vm_test = function() {
46717           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
46718         };
46719         /**
46720          * @description Enable/disable uppercase hexadecimal returned string
46721          * @param {boolean}
46722          * @return {Object} this
46723          * @public
46724          */
46725         this.setUpperCase = function(a) {
46726           if (typeof a === 'boolean') {
46727             hexcase = a;
46728           }
46729           return this;
46730         };
46731         /**
46732          * @description Defines a base64 pad string
46733          * @param {string} Pad
46734          * @return {Object} this
46735          * @public
46736          */
46737         this.setPad = function(a) {
46738           b64pad = a || b64pad;
46739           return this;
46740         };
46741         /**
46742          * @description Defines a base64 pad string
46743          * @param {boolean}
46744          * @return {Object} this
46745          * @public
46746          */
46747         this.setUTF8 = function(a) {
46748           if (typeof a === 'boolean') {
46749             utf8 = a;
46750           }
46751           return this;
46752         };
46753
46754         // private methods
46755
46756         /**
46757          * Calculate the SHA-512 of a raw string
46758          */
46759
46760         function rstr(s) {
46761           s = (utf8) ? utf8Encode(s) : s;
46762           return binb2rstr(binb(rstr2binb(s), s.length * 8));
46763         }
46764
46765         /**
46766          * Calculate the HMAC-SHA1 of a key and some data (raw strings)
46767          */
46768
46769         function rstr_hmac(key, data) {
46770           var bkey, ipad, opad, i, hash;
46771           key = (utf8) ? utf8Encode(key) : key;
46772           data = (utf8) ? utf8Encode(data) : data;
46773           bkey = rstr2binb(key);
46774
46775           if (bkey.length > 16) {
46776             bkey = binb(bkey, key.length * 8);
46777           }
46778           ipad = Array(16), opad = Array(16);
46779           for (i = 0; i < 16; i += 1) {
46780             ipad[i] = bkey[i] ^ 0x36363636;
46781             opad[i] = bkey[i] ^ 0x5C5C5C5C;
46782           }
46783           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
46784           return binb2rstr(binb(opad.concat(hash), 512 + 160));
46785         }
46786
46787         /**
46788          * Calculate the SHA-1 of an array of big-endian words, and a bit length
46789          */
46790
46791         function binb(x, len) {
46792           var i, j, t, olda, oldb, oldc, oldd, olde,
46793             w = Array(80),
46794             a = 1732584193,
46795             b = -271733879,
46796             c = -1732584194,
46797             d = 271733878,
46798             e = -1009589776;
46799
46800           /* append padding */
46801           x[len >> 5] |= 0x80 << (24 - len % 32);
46802           x[((len + 64 >> 9) << 4) + 15] = len;
46803
46804           for (i = 0; i < x.length; i += 16) {
46805             olda = a;
46806             oldb = b;
46807             oldc = c;
46808             oldd = d;
46809             olde = e;
46810
46811             for (j = 0; j < 80; j += 1) {
46812               if (j < 16) {
46813                 w[j] = x[i + j];
46814               } else {
46815                 w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
46816               }
46817               t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
46818                 safe_add(safe_add(e, w[j]), sha1_kt(j)));
46819               e = d;
46820               d = c;
46821               c = bit_rol(b, 30);
46822               b = a;
46823               a = t;
46824             }
46825
46826             a = safe_add(a, olda);
46827             b = safe_add(b, oldb);
46828             c = safe_add(c, oldc);
46829             d = safe_add(d, oldd);
46830             e = safe_add(e, olde);
46831           }
46832           return Array(a, b, c, d, e);
46833         }
46834
46835         /**
46836          * Perform the appropriate triplet combination function for the current
46837          * iteration
46838          */
46839
46840         function sha1_ft(t, b, c, d) {
46841           if (t < 20) {
46842             return (b & c) | ((~b) & d);
46843           }
46844           if (t < 40) {
46845             return b ^ c ^ d;
46846           }
46847           if (t < 60) {
46848             return (b & c) | (b & d) | (c & d);
46849           }
46850           return b ^ c ^ d;
46851         }
46852
46853         /**
46854          * Determine the appropriate additive constant for the current iteration
46855          */
46856
46857         function sha1_kt(t) {
46858           return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
46859             (t < 60) ? -1894007588 : -899497514;
46860         }
46861       },
46862       /**
46863        * @class Hashes.SHA256
46864        * @param {config}
46865        *
46866        * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
46867        * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
46868        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
46869        * See http://pajhome.org.uk/crypt/md5 for details.
46870        * Also http://anmar.eu.org/projects/jssha2/
46871        */
46872       SHA256: function(options) {
46873         /**
46874          * Private properties configuration variables. You may need to tweak these to be compatible with
46875          * the server-side, but the defaults work in most cases.
46876          * @see this.setUpperCase() method
46877          * @see this.setPad() method
46878          */
46879         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
46880           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
46881           /* base-64 pad character. Default '=' for strict RFC compliance   */
46882           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
46883           /* enable/disable utf8 encoding */
46884           sha256_K;
46885
46886         /* privileged (public) methods */
46887         this.hex = function(s) {
46888           return rstr2hex(rstr(s, utf8));
46889         };
46890         this.b64 = function(s) {
46891           return rstr2b64(rstr(s, utf8), b64pad);
46892         };
46893         this.any = function(s, e) {
46894           return rstr2any(rstr(s, utf8), e);
46895         };
46896         this.raw = function(s) {
46897           return rstr(s, utf8);
46898         };
46899         this.hex_hmac = function(k, d) {
46900           return rstr2hex(rstr_hmac(k, d));
46901         };
46902         this.b64_hmac = function(k, d) {
46903           return rstr2b64(rstr_hmac(k, d), b64pad);
46904         };
46905         this.any_hmac = function(k, d, e) {
46906           return rstr2any(rstr_hmac(k, d), e);
46907         };
46908         /**
46909          * Perform a simple self-test to see if the VM is working
46910          * @return {String} Hexadecimal hash sample
46911          * @public
46912          */
46913         this.vm_test = function() {
46914           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
46915         };
46916         /**
46917          * Enable/disable uppercase hexadecimal returned string
46918          * @param {boolean}
46919          * @return {Object} this
46920          * @public
46921          */
46922         this.setUpperCase = function(a) {
46923           if (typeof a === 'boolean') {
46924             hexcase = a;
46925           }
46926           return this;
46927         };
46928         /**
46929          * @description Defines a base64 pad string
46930          * @param {string} Pad
46931          * @return {Object} this
46932          * @public
46933          */
46934         this.setPad = function(a) {
46935           b64pad = a || b64pad;
46936           return this;
46937         };
46938         /**
46939          * Defines a base64 pad string
46940          * @param {boolean}
46941          * @return {Object} this
46942          * @public
46943          */
46944         this.setUTF8 = function(a) {
46945           if (typeof a === 'boolean') {
46946             utf8 = a;
46947           }
46948           return this;
46949         };
46950
46951         // private methods
46952
46953         /**
46954          * Calculate the SHA-512 of a raw string
46955          */
46956
46957         function rstr(s, utf8) {
46958           s = (utf8) ? utf8Encode(s) : s;
46959           return binb2rstr(binb(rstr2binb(s), s.length * 8));
46960         }
46961
46962         /**
46963          * Calculate the HMAC-sha256 of a key and some data (raw strings)
46964          */
46965
46966         function rstr_hmac(key, data) {
46967           key = (utf8) ? utf8Encode(key) : key;
46968           data = (utf8) ? utf8Encode(data) : data;
46969           var hash, i = 0,
46970             bkey = rstr2binb(key),
46971             ipad = Array(16),
46972             opad = Array(16);
46973
46974           if (bkey.length > 16) {
46975             bkey = binb(bkey, key.length * 8);
46976           }
46977
46978           for (; i < 16; i += 1) {
46979             ipad[i] = bkey[i] ^ 0x36363636;
46980             opad[i] = bkey[i] ^ 0x5C5C5C5C;
46981           }
46982
46983           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
46984           return binb2rstr(binb(opad.concat(hash), 512 + 256));
46985         }
46986
46987         /*
46988          * Main sha256 function, with its support functions
46989          */
46990
46991         function sha256_S(X, n) {
46992           return (X >>> n) | (X << (32 - n));
46993         }
46994
46995         function sha256_R(X, n) {
46996           return (X >>> n);
46997         }
46998
46999         function sha256_Ch(x, y, z) {
47000           return ((x & y) ^ ((~x) & z));
47001         }
47002
47003         function sha256_Maj(x, y, z) {
47004           return ((x & y) ^ (x & z) ^ (y & z));
47005         }
47006
47007         function sha256_Sigma0256(x) {
47008           return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
47009         }
47010
47011         function sha256_Sigma1256(x) {
47012           return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
47013         }
47014
47015         function sha256_Gamma0256(x) {
47016           return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
47017         }
47018
47019         function sha256_Gamma1256(x) {
47020           return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
47021         }
47022
47023         sha256_K = [
47024           1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
47025           1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
47026           264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
47027           113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
47028           1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
47029           430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
47030           1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
47031         ];
47032
47033         function binb(m, l) {
47034           var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
47035             1359893119, -1694144372, 528734635, 1541459225
47036           ];
47037           var W = new Array(64);
47038           var a, b, c, d, e, f, g, h;
47039           var i, j, T1, T2;
47040
47041           /* append padding */
47042           m[l >> 5] |= 0x80 << (24 - l % 32);
47043           m[((l + 64 >> 9) << 4) + 15] = l;
47044
47045           for (i = 0; i < m.length; i += 16) {
47046             a = HASH[0];
47047             b = HASH[1];
47048             c = HASH[2];
47049             d = HASH[3];
47050             e = HASH[4];
47051             f = HASH[5];
47052             g = HASH[6];
47053             h = HASH[7];
47054
47055             for (j = 0; j < 64; j += 1) {
47056               if (j < 16) {
47057                 W[j] = m[j + i];
47058               } else {
47059                 W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
47060                   sha256_Gamma0256(W[j - 15])), W[j - 16]);
47061               }
47062
47063               T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
47064                 sha256_K[j]), W[j]);
47065               T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
47066               h = g;
47067               g = f;
47068               f = e;
47069               e = safe_add(d, T1);
47070               d = c;
47071               c = b;
47072               b = a;
47073               a = safe_add(T1, T2);
47074             }
47075
47076             HASH[0] = safe_add(a, HASH[0]);
47077             HASH[1] = safe_add(b, HASH[1]);
47078             HASH[2] = safe_add(c, HASH[2]);
47079             HASH[3] = safe_add(d, HASH[3]);
47080             HASH[4] = safe_add(e, HASH[4]);
47081             HASH[5] = safe_add(f, HASH[5]);
47082             HASH[6] = safe_add(g, HASH[6]);
47083             HASH[7] = safe_add(h, HASH[7]);
47084           }
47085           return HASH;
47086         }
47087
47088       },
47089
47090       /**
47091        * @class Hashes.SHA512
47092        * @param {config}
47093        *
47094        * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
47095        * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
47096        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
47097        * See http://pajhome.org.uk/crypt/md5 for details.
47098        */
47099       SHA512: function(options) {
47100         /**
47101          * Private properties configuration variables. You may need to tweak these to be compatible with
47102          * the server-side, but the defaults work in most cases.
47103          * @see this.setUpperCase() method
47104          * @see this.setPad() method
47105          */
47106         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
47107           /* hexadecimal output case format. false - lowercase; true - uppercase  */
47108           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
47109           /* base-64 pad character. Default '=' for strict RFC compliance   */
47110           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
47111           /* enable/disable utf8 encoding */
47112           sha512_k;
47113
47114         /* privileged (public) methods */
47115         this.hex = function(s) {
47116           return rstr2hex(rstr(s));
47117         };
47118         this.b64 = function(s) {
47119           return rstr2b64(rstr(s), b64pad);
47120         };
47121         this.any = function(s, e) {
47122           return rstr2any(rstr(s), e);
47123         };
47124         this.raw = function(s) {
47125           return rstr(s, utf8);
47126         };
47127         this.hex_hmac = function(k, d) {
47128           return rstr2hex(rstr_hmac(k, d));
47129         };
47130         this.b64_hmac = function(k, d) {
47131           return rstr2b64(rstr_hmac(k, d), b64pad);
47132         };
47133         this.any_hmac = function(k, d, e) {
47134           return rstr2any(rstr_hmac(k, d), e);
47135         };
47136         /**
47137          * Perform a simple self-test to see if the VM is working
47138          * @return {String} Hexadecimal hash sample
47139          * @public
47140          */
47141         this.vm_test = function() {
47142           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
47143         };
47144         /**
47145          * @description Enable/disable uppercase hexadecimal returned string
47146          * @param {boolean}
47147          * @return {Object} this
47148          * @public
47149          */
47150         this.setUpperCase = function(a) {
47151           if (typeof a === 'boolean') {
47152             hexcase = a;
47153           }
47154           return this;
47155         };
47156         /**
47157          * @description Defines a base64 pad string
47158          * @param {string} Pad
47159          * @return {Object} this
47160          * @public
47161          */
47162         this.setPad = function(a) {
47163           b64pad = a || b64pad;
47164           return this;
47165         };
47166         /**
47167          * @description Defines a base64 pad string
47168          * @param {boolean}
47169          * @return {Object} this
47170          * @public
47171          */
47172         this.setUTF8 = function(a) {
47173           if (typeof a === 'boolean') {
47174             utf8 = a;
47175           }
47176           return this;
47177         };
47178
47179         /* private methods */
47180
47181         /**
47182          * Calculate the SHA-512 of a raw string
47183          */
47184
47185         function rstr(s) {
47186           s = (utf8) ? utf8Encode(s) : s;
47187           return binb2rstr(binb(rstr2binb(s), s.length * 8));
47188         }
47189         /*
47190          * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
47191          */
47192
47193         function rstr_hmac(key, data) {
47194           key = (utf8) ? utf8Encode(key) : key;
47195           data = (utf8) ? utf8Encode(data) : data;
47196
47197           var hash, i = 0,
47198             bkey = rstr2binb(key),
47199             ipad = Array(32),
47200             opad = Array(32);
47201
47202           if (bkey.length > 32) {
47203             bkey = binb(bkey, key.length * 8);
47204           }
47205
47206           for (; i < 32; i += 1) {
47207             ipad[i] = bkey[i] ^ 0x36363636;
47208             opad[i] = bkey[i] ^ 0x5C5C5C5C;
47209           }
47210
47211           hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
47212           return binb2rstr(binb(opad.concat(hash), 1024 + 512));
47213         }
47214
47215         /**
47216          * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
47217          */
47218
47219         function binb(x, len) {
47220           var j, i, l,
47221             W = new Array(80),
47222             hash = new Array(16),
47223             //Initial hash values
47224             H = [
47225               new int64(0x6a09e667, -205731576),
47226               new int64(-1150833019, -2067093701),
47227               new int64(0x3c6ef372, -23791573),
47228               new int64(-1521486534, 0x5f1d36f1),
47229               new int64(0x510e527f, -1377402159),
47230               new int64(-1694144372, 0x2b3e6c1f),
47231               new int64(0x1f83d9ab, -79577749),
47232               new int64(0x5be0cd19, 0x137e2179)
47233             ],
47234             T1 = new int64(0, 0),
47235             T2 = new int64(0, 0),
47236             a = new int64(0, 0),
47237             b = new int64(0, 0),
47238             c = new int64(0, 0),
47239             d = new int64(0, 0),
47240             e = new int64(0, 0),
47241             f = new int64(0, 0),
47242             g = new int64(0, 0),
47243             h = new int64(0, 0),
47244             //Temporary variables not specified by the document
47245             s0 = new int64(0, 0),
47246             s1 = new int64(0, 0),
47247             Ch = new int64(0, 0),
47248             Maj = new int64(0, 0),
47249             r1 = new int64(0, 0),
47250             r2 = new int64(0, 0),
47251             r3 = new int64(0, 0);
47252
47253           if (sha512_k === undefined) {
47254             //SHA512 constants
47255             sha512_k = [
47256               new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
47257               new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
47258               new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
47259               new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
47260               new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
47261               new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
47262               new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
47263               new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
47264               new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
47265               new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
47266               new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
47267               new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
47268               new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
47269               new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
47270               new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
47271               new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
47272               new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
47273               new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
47274               new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
47275               new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
47276               new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
47277               new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
47278               new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
47279               new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
47280               new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
47281               new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
47282               new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
47283               new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
47284               new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
47285               new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
47286               new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
47287               new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
47288               new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
47289               new int64(-354779690, -840897762), new int64(-176337025, -294727304),
47290               new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
47291               new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
47292               new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
47293               new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
47294               new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
47295               new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
47296             ];
47297           }
47298
47299           for (i = 0; i < 80; i += 1) {
47300             W[i] = new int64(0, 0);
47301           }
47302
47303           // append padding to the source string. The format is described in the FIPS.
47304           x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
47305           x[((len + 128 >> 10) << 5) + 31] = len;
47306           l = x.length;
47307           for (i = 0; i < l; i += 32) { //32 dwords is the block size
47308             int64copy(a, H[0]);
47309             int64copy(b, H[1]);
47310             int64copy(c, H[2]);
47311             int64copy(d, H[3]);
47312             int64copy(e, H[4]);
47313             int64copy(f, H[5]);
47314             int64copy(g, H[6]);
47315             int64copy(h, H[7]);
47316
47317             for (j = 0; j < 16; j += 1) {
47318               W[j].h = x[i + 2 * j];
47319               W[j].l = x[i + 2 * j + 1];
47320             }
47321
47322             for (j = 16; j < 80; j += 1) {
47323               //sigma1
47324               int64rrot(r1, W[j - 2], 19);
47325               int64revrrot(r2, W[j - 2], 29);
47326               int64shr(r3, W[j - 2], 6);
47327               s1.l = r1.l ^ r2.l ^ r3.l;
47328               s1.h = r1.h ^ r2.h ^ r3.h;
47329               //sigma0
47330               int64rrot(r1, W[j - 15], 1);
47331               int64rrot(r2, W[j - 15], 8);
47332               int64shr(r3, W[j - 15], 7);
47333               s0.l = r1.l ^ r2.l ^ r3.l;
47334               s0.h = r1.h ^ r2.h ^ r3.h;
47335
47336               int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
47337             }
47338
47339             for (j = 0; j < 80; j += 1) {
47340               //Ch
47341               Ch.l = (e.l & f.l) ^ (~e.l & g.l);
47342               Ch.h = (e.h & f.h) ^ (~e.h & g.h);
47343
47344               //Sigma1
47345               int64rrot(r1, e, 14);
47346               int64rrot(r2, e, 18);
47347               int64revrrot(r3, e, 9);
47348               s1.l = r1.l ^ r2.l ^ r3.l;
47349               s1.h = r1.h ^ r2.h ^ r3.h;
47350
47351               //Sigma0
47352               int64rrot(r1, a, 28);
47353               int64revrrot(r2, a, 2);
47354               int64revrrot(r3, a, 7);
47355               s0.l = r1.l ^ r2.l ^ r3.l;
47356               s0.h = r1.h ^ r2.h ^ r3.h;
47357
47358               //Maj
47359               Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
47360               Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
47361
47362               int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
47363               int64add(T2, s0, Maj);
47364
47365               int64copy(h, g);
47366               int64copy(g, f);
47367               int64copy(f, e);
47368               int64add(e, d, T1);
47369               int64copy(d, c);
47370               int64copy(c, b);
47371               int64copy(b, a);
47372               int64add(a, T1, T2);
47373             }
47374             int64add(H[0], H[0], a);
47375             int64add(H[1], H[1], b);
47376             int64add(H[2], H[2], c);
47377             int64add(H[3], H[3], d);
47378             int64add(H[4], H[4], e);
47379             int64add(H[5], H[5], f);
47380             int64add(H[6], H[6], g);
47381             int64add(H[7], H[7], h);
47382           }
47383
47384           //represent the hash as an array of 32-bit dwords
47385           for (i = 0; i < 8; i += 1) {
47386             hash[2 * i] = H[i].h;
47387             hash[2 * i + 1] = H[i].l;
47388           }
47389           return hash;
47390         }
47391
47392         //A constructor for 64-bit numbers
47393
47394         function int64(h, l) {
47395           this.h = h;
47396           this.l = l;
47397           //this.toString = int64toString;
47398         }
47399
47400         //Copies src into dst, assuming both are 64-bit numbers
47401
47402         function int64copy(dst, src) {
47403           dst.h = src.h;
47404           dst.l = src.l;
47405         }
47406
47407         //Right-rotates a 64-bit number by shift
47408         //Won't handle cases of shift>=32
47409         //The function revrrot() is for that
47410
47411         function int64rrot(dst, x, shift) {
47412           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
47413           dst.h = (x.h >>> shift) | (x.l << (32 - shift));
47414         }
47415
47416         //Reverses the dwords of the source and then rotates right by shift.
47417         //This is equivalent to rotation by 32+shift
47418
47419         function int64revrrot(dst, x, shift) {
47420           dst.l = (x.h >>> shift) | (x.l << (32 - shift));
47421           dst.h = (x.l >>> shift) | (x.h << (32 - shift));
47422         }
47423
47424         //Bitwise-shifts right a 64-bit number by shift
47425         //Won't handle shift>=32, but it's never needed in SHA512
47426
47427         function int64shr(dst, x, shift) {
47428           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
47429           dst.h = (x.h >>> shift);
47430         }
47431
47432         //Adds two 64-bit numbers
47433         //Like the original implementation, does not rely on 32-bit operations
47434
47435         function int64add(dst, x, y) {
47436           var w0 = (x.l & 0xffff) + (y.l & 0xffff);
47437           var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
47438           var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
47439           var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
47440           dst.l = (w0 & 0xffff) | (w1 << 16);
47441           dst.h = (w2 & 0xffff) | (w3 << 16);
47442         }
47443
47444         //Same, except with 4 addends. Works faster than adding them one by one.
47445
47446         function int64add4(dst, a, b, c, d) {
47447           var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
47448           var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
47449           var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
47450           var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
47451           dst.l = (w0 & 0xffff) | (w1 << 16);
47452           dst.h = (w2 & 0xffff) | (w3 << 16);
47453         }
47454
47455         //Same, except with 5 addends
47456
47457         function int64add5(dst, a, b, c, d, e) {
47458           var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
47459             w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
47460             w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
47461             w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
47462           dst.l = (w0 & 0xffff) | (w1 << 16);
47463           dst.h = (w2 & 0xffff) | (w3 << 16);
47464         }
47465       },
47466       /**
47467        * @class Hashes.RMD160
47468        * @constructor
47469        * @param {Object} [config]
47470        *
47471        * A JavaScript implementation of the RIPEMD-160 Algorithm
47472        * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
47473        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
47474        * See http://pajhome.org.uk/crypt/md5 for details.
47475        * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
47476        */
47477       RMD160: function(options) {
47478         /**
47479          * Private properties configuration variables. You may need to tweak these to be compatible with
47480          * the server-side, but the defaults work in most cases.
47481          * @see this.setUpperCase() method
47482          * @see this.setPad() method
47483          */
47484         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
47485           /* hexadecimal output case format. false - lowercase; true - uppercase  */
47486           b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
47487           /* base-64 pad character. Default '=' for strict RFC compliance   */
47488           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
47489           /* enable/disable utf8 encoding */
47490           rmd160_r1 = [
47491             0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
47492             7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
47493             3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
47494             1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
47495             4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
47496           ],
47497           rmd160_r2 = [
47498             5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
47499             6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
47500             15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
47501             8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
47502             12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
47503           ],
47504           rmd160_s1 = [
47505             11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
47506             7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
47507             11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
47508             11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
47509             9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
47510           ],
47511           rmd160_s2 = [
47512             8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
47513             9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
47514             9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
47515             15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
47516             8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
47517           ];
47518
47519         /* privileged (public) methods */
47520         this.hex = function(s) {
47521           return rstr2hex(rstr(s, utf8));
47522         };
47523         this.b64 = function(s) {
47524           return rstr2b64(rstr(s, utf8), b64pad);
47525         };
47526         this.any = function(s, e) {
47527           return rstr2any(rstr(s, utf8), e);
47528         };
47529         this.raw = function(s) {
47530           return rstr(s, utf8);
47531         };
47532         this.hex_hmac = function(k, d) {
47533           return rstr2hex(rstr_hmac(k, d));
47534         };
47535         this.b64_hmac = function(k, d) {
47536           return rstr2b64(rstr_hmac(k, d), b64pad);
47537         };
47538         this.any_hmac = function(k, d, e) {
47539           return rstr2any(rstr_hmac(k, d), e);
47540         };
47541         /**
47542          * Perform a simple self-test to see if the VM is working
47543          * @return {String} Hexadecimal hash sample
47544          * @public
47545          */
47546         this.vm_test = function() {
47547           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
47548         };
47549         /**
47550          * @description Enable/disable uppercase hexadecimal returned string
47551          * @param {boolean}
47552          * @return {Object} this
47553          * @public
47554          */
47555         this.setUpperCase = function(a) {
47556           if (typeof a === 'boolean') {
47557             hexcase = a;
47558           }
47559           return this;
47560         };
47561         /**
47562          * @description Defines a base64 pad string
47563          * @param {string} Pad
47564          * @return {Object} this
47565          * @public
47566          */
47567         this.setPad = function(a) {
47568           if (typeof a !== 'undefined') {
47569             b64pad = a;
47570           }
47571           return this;
47572         };
47573         /**
47574          * @description Defines a base64 pad string
47575          * @param {boolean}
47576          * @return {Object} this
47577          * @public
47578          */
47579         this.setUTF8 = function(a) {
47580           if (typeof a === 'boolean') {
47581             utf8 = a;
47582           }
47583           return this;
47584         };
47585
47586         /* private methods */
47587
47588         /**
47589          * Calculate the rmd160 of a raw string
47590          */
47591
47592         function rstr(s) {
47593           s = (utf8) ? utf8Encode(s) : s;
47594           return binl2rstr(binl(rstr2binl(s), s.length * 8));
47595         }
47596
47597         /**
47598          * Calculate the HMAC-rmd160 of a key and some data (raw strings)
47599          */
47600
47601         function rstr_hmac(key, data) {
47602           key = (utf8) ? utf8Encode(key) : key;
47603           data = (utf8) ? utf8Encode(data) : data;
47604           var i, hash,
47605             bkey = rstr2binl(key),
47606             ipad = Array(16),
47607             opad = Array(16);
47608
47609           if (bkey.length > 16) {
47610             bkey = binl(bkey, key.length * 8);
47611           }
47612
47613           for (i = 0; i < 16; i += 1) {
47614             ipad[i] = bkey[i] ^ 0x36363636;
47615             opad[i] = bkey[i] ^ 0x5C5C5C5C;
47616           }
47617           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
47618           return binl2rstr(binl(opad.concat(hash), 512 + 160));
47619         }
47620
47621         /**
47622          * Convert an array of little-endian words to a string
47623          */
47624
47625         function binl2rstr(input) {
47626           var i, output = '',
47627             l = input.length * 32;
47628           for (i = 0; i < l; i += 8) {
47629             output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
47630           }
47631           return output;
47632         }
47633
47634         /**
47635          * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
47636          */
47637
47638         function binl(x, len) {
47639           var T, j, i, l,
47640             h0 = 0x67452301,
47641             h1 = 0xefcdab89,
47642             h2 = 0x98badcfe,
47643             h3 = 0x10325476,
47644             h4 = 0xc3d2e1f0,
47645             A1, B1, C1, D1, E1,
47646             A2, B2, C2, D2, E2;
47647
47648           /* append padding */
47649           x[len >> 5] |= 0x80 << (len % 32);
47650           x[(((len + 64) >>> 9) << 4) + 14] = len;
47651           l = x.length;
47652
47653           for (i = 0; i < l; i += 16) {
47654             A1 = A2 = h0;
47655             B1 = B2 = h1;
47656             C1 = C2 = h2;
47657             D1 = D2 = h3;
47658             E1 = E2 = h4;
47659             for (j = 0; j <= 79; j += 1) {
47660               T = safe_add(A1, rmd160_f(j, B1, C1, D1));
47661               T = safe_add(T, x[i + rmd160_r1[j]]);
47662               T = safe_add(T, rmd160_K1(j));
47663               T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
47664               A1 = E1;
47665               E1 = D1;
47666               D1 = bit_rol(C1, 10);
47667               C1 = B1;
47668               B1 = T;
47669               T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
47670               T = safe_add(T, x[i + rmd160_r2[j]]);
47671               T = safe_add(T, rmd160_K2(j));
47672               T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
47673               A2 = E2;
47674               E2 = D2;
47675               D2 = bit_rol(C2, 10);
47676               C2 = B2;
47677               B2 = T;
47678             }
47679
47680             T = safe_add(h1, safe_add(C1, D2));
47681             h1 = safe_add(h2, safe_add(D1, E2));
47682             h2 = safe_add(h3, safe_add(E1, A2));
47683             h3 = safe_add(h4, safe_add(A1, B2));
47684             h4 = safe_add(h0, safe_add(B1, C2));
47685             h0 = T;
47686           }
47687           return [h0, h1, h2, h3, h4];
47688         }
47689
47690         // specific algorithm methods
47691
47692         function rmd160_f(j, x, y, z) {
47693           return (0 <= j && j <= 15) ? (x ^ y ^ z) :
47694             (16 <= j && j <= 31) ? (x & y) | (~x & z) :
47695             (32 <= j && j <= 47) ? (x | ~y) ^ z :
47696             (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
47697             (64 <= j && j <= 79) ? x ^ (y | ~z) :
47698             'rmd160_f: j out of range';
47699         }
47700
47701         function rmd160_K1(j) {
47702           return (0 <= j && j <= 15) ? 0x00000000 :
47703             (16 <= j && j <= 31) ? 0x5a827999 :
47704             (32 <= j && j <= 47) ? 0x6ed9eba1 :
47705             (48 <= j && j <= 63) ? 0x8f1bbcdc :
47706             (64 <= j && j <= 79) ? 0xa953fd4e :
47707             'rmd160_K1: j out of range';
47708         }
47709
47710         function rmd160_K2(j) {
47711           return (0 <= j && j <= 15) ? 0x50a28be6 :
47712             (16 <= j && j <= 31) ? 0x5c4dd124 :
47713             (32 <= j && j <= 47) ? 0x6d703ef3 :
47714             (48 <= j && j <= 63) ? 0x7a6d76e9 :
47715             (64 <= j && j <= 79) ? 0x00000000 :
47716             'rmd160_K2: j out of range';
47717         }
47718       }
47719     };
47720
47721     // exposes Hashes
47722     (function(window, undefined$1) {
47723       var freeExports = false;
47724       {
47725         freeExports = exports;
47726         if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
47727           window = commonjsGlobal;
47728         }
47729       }
47730
47731       if (typeof undefined$1 === 'function' && typeof undefined$1.amd === 'object' && undefined$1.amd) {
47732         // define as an anonymous module, so, through path mapping, it can be aliased
47733         undefined$1(function() {
47734           return Hashes;
47735         });
47736       } else if (freeExports) {
47737         // in Node.js or RingoJS v0.8.0+
47738         if (module && module.exports === freeExports) {
47739           module.exports = Hashes;
47740         }
47741         // in Narwhal or RingoJS v0.7.0-
47742         else {
47743           freeExports.Hashes = Hashes;
47744         }
47745       } else {
47746         // in a browser or Rhino
47747         window.Hashes = Hashes;
47748       }
47749     }(this));
47750   }()); // IIFE
47751   });
47752
47753   var immutable = extend$2;
47754
47755   var hasOwnProperty$g = Object.prototype.hasOwnProperty;
47756
47757   function extend$2() {
47758       var target = {};
47759
47760       for (var i = 0; i < arguments.length; i++) {
47761           var source = arguments[i];
47762
47763           for (var key in source) {
47764               if (hasOwnProperty$g.call(source, key)) {
47765                   target[key] = source[key];
47766               }
47767           }
47768       }
47769
47770       return target
47771   }
47772
47773   var sha1 = new hashes.SHA1();
47774
47775   var ohauth = {};
47776
47777   ohauth.qsString = function(obj) {
47778       return Object.keys(obj).sort().map(function(key) {
47779           return ohauth.percentEncode(key) + '=' +
47780               ohauth.percentEncode(obj[key]);
47781       }).join('&');
47782   };
47783
47784   ohauth.stringQs = function(str) {
47785       return str.split('&').filter(function (pair) {
47786           return pair !== '';
47787       }).reduce(function(obj, pair){
47788           var parts = pair.split('=');
47789           obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
47790               '' : decodeURIComponent(parts[1]);
47791           return obj;
47792       }, {});
47793   };
47794
47795   ohauth.rawxhr = function(method, url, data, headers, callback) {
47796       var xhr = new XMLHttpRequest(),
47797           twoHundred = /^20\d$/;
47798       xhr.onreadystatechange = function() {
47799           if (4 === xhr.readyState && 0 !== xhr.status) {
47800               if (twoHundred.test(xhr.status)) callback(null, xhr);
47801               else return callback(xhr, null);
47802           }
47803       };
47804       xhr.onerror = function(e) { return callback(e, null); };
47805       xhr.open(method, url, true);
47806       for (var h in headers) xhr.setRequestHeader(h, headers[h]);
47807       xhr.send(data);
47808       return xhr;
47809   };
47810
47811   ohauth.xhr = function(method, url, auth, data, options, callback) {
47812       var headers = (options && options.header) || {
47813           'Content-Type': 'application/x-www-form-urlencoded'
47814       };
47815       headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
47816       return ohauth.rawxhr(method, url, data, headers, callback);
47817   };
47818
47819   ohauth.nonce = function() {
47820       for (var o = ''; o.length < 6;) {
47821           o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
47822       }
47823       return o;
47824   };
47825
47826   ohauth.authHeader = function(obj) {
47827       return Object.keys(obj).sort().map(function(key) {
47828           return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
47829       }).join(', ');
47830   };
47831
47832   ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
47833
47834   ohauth.percentEncode = function(s) {
47835       return encodeURIComponent(s)
47836           .replace(/\!/g, '%21').replace(/\'/g, '%27')
47837           .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
47838   };
47839
47840   ohauth.baseString = function(method, url, params) {
47841       if (params.oauth_signature) delete params.oauth_signature;
47842       return [
47843           method,
47844           ohauth.percentEncode(url),
47845           ohauth.percentEncode(ohauth.qsString(params))].join('&');
47846   };
47847
47848   ohauth.signature = function(oauth_secret, token_secret, baseString) {
47849       return sha1.b64_hmac(
47850           ohauth.percentEncode(oauth_secret) + '&' +
47851           ohauth.percentEncode(token_secret),
47852           baseString);
47853   };
47854
47855   /**
47856    * Takes an options object for configuration (consumer_key,
47857    * consumer_secret, version, signature_method, token, token_secret)
47858    * and returns a function that generates the Authorization header
47859    * for given data.
47860    *
47861    * The returned function takes these parameters:
47862    * - method: GET/POST/...
47863    * - uri: full URI with protocol, port, path and query string
47864    * - extra_params: any extra parameters (that are passed in the POST data),
47865    *   can be an object or a from-urlencoded string.
47866    *
47867    * Returned function returns full OAuth header with "OAuth" string in it.
47868    */
47869
47870   ohauth.headerGenerator = function(options) {
47871       options = options || {};
47872       var consumer_key = options.consumer_key || '',
47873           consumer_secret = options.consumer_secret || '',
47874           signature_method = options.signature_method || 'HMAC-SHA1',
47875           version = options.version || '1.0',
47876           token = options.token || '',
47877           token_secret = options.token_secret || '';
47878
47879       return function(method, uri, extra_params) {
47880           method = method.toUpperCase();
47881           if (typeof extra_params === 'string' && extra_params.length > 0) {
47882               extra_params = ohauth.stringQs(extra_params);
47883           }
47884
47885           var uri_parts = uri.split('?', 2),
47886           base_uri = uri_parts[0];
47887
47888           var query_params = uri_parts.length === 2 ?
47889               ohauth.stringQs(uri_parts[1]) : {};
47890
47891           var oauth_params = {
47892               oauth_consumer_key: consumer_key,
47893               oauth_signature_method: signature_method,
47894               oauth_version: version,
47895               oauth_timestamp: ohauth.timestamp(),
47896               oauth_nonce: ohauth.nonce()
47897           };
47898
47899           if (token) oauth_params.oauth_token = token;
47900
47901           var all_params = immutable({}, oauth_params, query_params, extra_params),
47902               base_str = ohauth.baseString(method, base_uri, all_params);
47903
47904           oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
47905
47906           return 'OAuth ' + ohauth.authHeader(oauth_params);
47907       };
47908   };
47909
47910   var ohauth_1 = ohauth;
47911
47912   var resolveUrl = createCommonjsModule(function (module, exports) {
47913   // Copyright 2014 Simon Lydell
47914   // X11 (“MIT”) Licensed. (See LICENSE.)
47915
47916   void (function(root, factory) {
47917     {
47918       module.exports = factory();
47919     }
47920   }(commonjsGlobal, function() {
47921
47922     function resolveUrl(/* ...urls */) {
47923       var numUrls = arguments.length;
47924
47925       if (numUrls === 0) {
47926         throw new Error("resolveUrl requires at least one argument; got none.")
47927       }
47928
47929       var base = document.createElement("base");
47930       base.href = arguments[0];
47931
47932       if (numUrls === 1) {
47933         return base.href
47934       }
47935
47936       var head = document.getElementsByTagName("head")[0];
47937       head.insertBefore(base, head.firstChild);
47938
47939       var a = document.createElement("a");
47940       var resolved;
47941
47942       for (var index = 1; index < numUrls; index++) {
47943         a.href = arguments[index];
47944         resolved = a.href;
47945         base.href = resolved;
47946       }
47947
47948       head.removeChild(base);
47949
47950       return resolved
47951     }
47952
47953     return resolveUrl
47954
47955   }));
47956   });
47957
47958   var assign$1 = make_assign();
47959   var create$2 = make_create();
47960   var trim = make_trim();
47961   var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
47962
47963   var util = {
47964         assign: assign$1,
47965         create: create$2,
47966         trim: trim,
47967         bind: bind,
47968         slice: slice$7,
47969         each: each,
47970         map: map$4,
47971         pluck: pluck,
47972         isList: isList,
47973         isFunction: isFunction$1,
47974         isObject: isObject$1,
47975         Global: Global
47976   };
47977
47978   function make_assign() {
47979         if (Object.assign) {
47980                 return Object.assign
47981         } else {
47982                 return function shimAssign(obj, props1, props2, etc) {
47983                         for (var i = 1; i < arguments.length; i++) {
47984                                 each(Object(arguments[i]), function(val, key) {
47985                                         obj[key] = val;
47986                                 });
47987                         }                       
47988                         return obj
47989                 }
47990         }
47991   }
47992
47993   function make_create() {
47994         if (Object.create) {
47995                 return function create(obj, assignProps1, assignProps2, etc) {
47996                         var assignArgsList = slice$7(arguments, 1);
47997                         return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList))
47998                 }
47999         } else {
48000                 function F() {} // eslint-disable-line no-inner-declarations
48001                 return function create(obj, assignProps1, assignProps2, etc) {
48002                         var assignArgsList = slice$7(arguments, 1);
48003                         F.prototype = obj;
48004                         return assign$1.apply(this, [new F()].concat(assignArgsList))
48005                 }
48006         }
48007   }
48008
48009   function make_trim() {
48010         if (String.prototype.trim) {
48011                 return function trim(str) {
48012                         return String.prototype.trim.call(str)
48013                 }
48014         } else {
48015                 return function trim(str) {
48016                         return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
48017                 }
48018         }
48019   }
48020
48021   function bind(obj, fn) {
48022         return function() {
48023                 return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
48024         }
48025   }
48026
48027   function slice$7(arr, index) {
48028         return Array.prototype.slice.call(arr, index || 0)
48029   }
48030
48031   function each(obj, fn) {
48032         pluck(obj, function(val, key) {
48033                 fn(val, key);
48034                 return false
48035         });
48036   }
48037
48038   function map$4(obj, fn) {
48039         var res = (isList(obj) ? [] : {});
48040         pluck(obj, function(v, k) {
48041                 res[k] = fn(v, k);
48042                 return false
48043         });
48044         return res
48045   }
48046
48047   function pluck(obj, fn) {
48048         if (isList(obj)) {
48049                 for (var i=0; i<obj.length; i++) {
48050                         if (fn(obj[i], i)) {
48051                                 return obj[i]
48052                         }
48053                 }
48054         } else {
48055                 for (var key in obj) {
48056                         if (obj.hasOwnProperty(key)) {
48057                                 if (fn(obj[key], key)) {
48058                                         return obj[key]
48059                                 }
48060                         }
48061                 }
48062         }
48063   }
48064
48065   function isList(val) {
48066         return (val != null && typeof val != 'function' && typeof val.length == 'number')
48067   }
48068
48069   function isFunction$1(val) {
48070         return val && {}.toString.call(val) === '[object Function]'
48071   }
48072
48073   function isObject$1(val) {
48074         return val && {}.toString.call(val) === '[object Object]'
48075   }
48076
48077   var slice$8 = util.slice;
48078   var pluck$1 = util.pluck;
48079   var each$1 = util.each;
48080   var bind$1 = util.bind;
48081   var create$3 = util.create;
48082   var isList$1 = util.isList;
48083   var isFunction$2 = util.isFunction;
48084   var isObject$2 = util.isObject;
48085
48086   var storeEngine = {
48087         createStore: createStore
48088   };
48089
48090   var storeAPI = {
48091         version: '2.0.12',
48092         enabled: false,
48093         
48094         // get returns the value of the given key. If that value
48095         // is undefined, it returns optionalDefaultValue instead.
48096         get: function(key, optionalDefaultValue) {
48097                 var data = this.storage.read(this._namespacePrefix + key);
48098                 return this._deserialize(data, optionalDefaultValue)
48099         },
48100
48101         // set will store the given value at key and returns value.
48102         // Calling set with value === undefined is equivalent to calling remove.
48103         set: function(key, value) {
48104                 if (value === undefined) {
48105                         return this.remove(key)
48106                 }
48107                 this.storage.write(this._namespacePrefix + key, this._serialize(value));
48108                 return value
48109         },
48110
48111         // remove deletes the key and value stored at the given key.
48112         remove: function(key) {
48113                 this.storage.remove(this._namespacePrefix + key);
48114         },
48115
48116         // each will call the given callback once for each key-value pair
48117         // in this store.
48118         each: function(callback) {
48119                 var self = this;
48120                 this.storage.each(function(val, namespacedKey) {
48121                         callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
48122                 });
48123         },
48124
48125         // clearAll will remove all the stored key-value pairs in this store.
48126         clearAll: function() {
48127                 this.storage.clearAll();
48128         },
48129
48130         // additional functionality that can't live in plugins
48131         // ---------------------------------------------------
48132
48133         // hasNamespace returns true if this store instance has the given namespace.
48134         hasNamespace: function(namespace) {
48135                 return (this._namespacePrefix == '__storejs_'+namespace+'_')
48136         },
48137
48138         // createStore creates a store.js instance with the first
48139         // functioning storage in the list of storage candidates,
48140         // and applies the the given mixins to the instance.
48141         createStore: function() {
48142                 return createStore.apply(this, arguments)
48143         },
48144         
48145         addPlugin: function(plugin) {
48146                 this._addPlugin(plugin);
48147         },
48148         
48149         namespace: function(namespace) {
48150                 return createStore(this.storage, this.plugins, namespace)
48151         }
48152   };
48153
48154   function _warn() {
48155         var _console = (typeof console == 'undefined' ? null : console);
48156         if (!_console) { return }
48157         var fn = (_console.warn ? _console.warn : _console.log);
48158         fn.apply(_console, arguments);
48159   }
48160
48161   function createStore(storages, plugins, namespace) {
48162         if (!namespace) {
48163                 namespace = '';
48164         }
48165         if (storages && !isList$1(storages)) {
48166                 storages = [storages];
48167         }
48168         if (plugins && !isList$1(plugins)) {
48169                 plugins = [plugins];
48170         }
48171
48172         var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
48173         var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
48174         var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
48175         if (!legalNamespaces.test(namespace)) {
48176                 throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
48177         }
48178         
48179         var _privateStoreProps = {
48180                 _namespacePrefix: namespacePrefix,
48181                 _namespaceRegexp: namespaceRegexp,
48182
48183                 _testStorage: function(storage) {
48184                         try {
48185                                 var testStr = '__storejs__test__';
48186                                 storage.write(testStr, testStr);
48187                                 var ok = (storage.read(testStr) === testStr);
48188                                 storage.remove(testStr);
48189                                 return ok
48190                         } catch(e) {
48191                                 return false
48192                         }
48193                 },
48194
48195                 _assignPluginFnProp: function(pluginFnProp, propName) {
48196                         var oldFn = this[propName];
48197                         this[propName] = function pluginFn() {
48198                                 var args = slice$8(arguments, 0);
48199                                 var self = this;
48200
48201                                 // super_fn calls the old function which was overwritten by
48202                                 // this mixin.
48203                                 function super_fn() {
48204                                         if (!oldFn) { return }
48205                                         each$1(arguments, function(arg, i) {
48206                                                 args[i] = arg;
48207                                         });
48208                                         return oldFn.apply(self, args)
48209                                 }
48210
48211                                 // Give mixing function access to super_fn by prefixing all mixin function
48212                                 // arguments with super_fn.
48213                                 var newFnArgs = [super_fn].concat(args);
48214
48215                                 return pluginFnProp.apply(self, newFnArgs)
48216                         };
48217                 },
48218
48219                 _serialize: function(obj) {
48220                         return JSON.stringify(obj)
48221                 },
48222
48223                 _deserialize: function(strVal, defaultVal) {
48224                         if (!strVal) { return defaultVal }
48225                         // It is possible that a raw string value has been previously stored
48226                         // in a storage without using store.js, meaning it will be a raw
48227                         // string value instead of a JSON serialized string. By defaulting
48228                         // to the raw string value in case of a JSON parse error, we allow
48229                         // for past stored values to be forwards-compatible with store.js
48230                         var val = '';
48231                         try { val = JSON.parse(strVal); }
48232                         catch(e) { val = strVal; }
48233
48234                         return (val !== undefined ? val : defaultVal)
48235                 },
48236                 
48237                 _addStorage: function(storage) {
48238                         if (this.enabled) { return }
48239                         if (this._testStorage(storage)) {
48240                                 this.storage = storage;
48241                                 this.enabled = true;
48242                         }
48243                 },
48244
48245                 _addPlugin: function(plugin) {
48246                         var self = this;
48247
48248                         // If the plugin is an array, then add all plugins in the array.
48249                         // This allows for a plugin to depend on other plugins.
48250                         if (isList$1(plugin)) {
48251                                 each$1(plugin, function(plugin) {
48252                                         self._addPlugin(plugin);
48253                                 });
48254                                 return
48255                         }
48256
48257                         // Keep track of all plugins we've seen so far, so that we
48258                         // don't add any of them twice.
48259                         var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
48260                                 return (plugin === seenPlugin)
48261                         });
48262                         if (seenPlugin) {
48263                                 return
48264                         }
48265                         this.plugins.push(plugin);
48266
48267                         // Check that the plugin is properly formed
48268                         if (!isFunction$2(plugin)) {
48269                                 throw new Error('Plugins must be function values that return objects')
48270                         }
48271
48272                         var pluginProperties = plugin.call(this);
48273                         if (!isObject$2(pluginProperties)) {
48274                                 throw new Error('Plugins must return an object of function properties')
48275                         }
48276
48277                         // Add the plugin function properties to this store instance.
48278                         each$1(pluginProperties, function(pluginFnProp, propName) {
48279                                 if (!isFunction$2(pluginFnProp)) {
48280                                         throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
48281                                 }
48282                                 self._assignPluginFnProp(pluginFnProp, propName);
48283                         });
48284                 },
48285                 
48286                 // Put deprecated properties in the private API, so as to not expose it to accidential
48287                 // discovery through inspection of the store object.
48288                 
48289                 // Deprecated: addStorage
48290                 addStorage: function(storage) {
48291                         _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
48292                         this._addStorage(storage);
48293                 }
48294         };
48295
48296         var store = create$3(_privateStoreProps, storeAPI, {
48297                 plugins: []
48298         });
48299         store.raw = {};
48300         each$1(store, function(prop, propName) {
48301                 if (isFunction$2(prop)) {
48302                         store.raw[propName] = bind$1(store, prop);                      
48303                 }
48304         });
48305         each$1(storages, function(storage) {
48306                 store._addStorage(storage);
48307         });
48308         each$1(plugins, function(plugin) {
48309                 store._addPlugin(plugin);
48310         });
48311         return store
48312   }
48313
48314   var Global$1 = util.Global;
48315
48316   var localStorage_1 = {
48317         name: 'localStorage',
48318         read: read,
48319         write: write,
48320         each: each$2,
48321         remove: remove$2,
48322         clearAll: clearAll,
48323   };
48324
48325   function localStorage$1() {
48326         return Global$1.localStorage
48327   }
48328
48329   function read(key) {
48330         return localStorage$1().getItem(key)
48331   }
48332
48333   function write(key, data) {
48334         return localStorage$1().setItem(key, data)
48335   }
48336
48337   function each$2(fn) {
48338         for (var i = localStorage$1().length - 1; i >= 0; i--) {
48339                 var key = localStorage$1().key(i);
48340                 fn(read(key), key);
48341         }
48342   }
48343
48344   function remove$2(key) {
48345         return localStorage$1().removeItem(key)
48346   }
48347
48348   function clearAll() {
48349         return localStorage$1().clear()
48350   }
48351
48352   // oldFF-globalStorage provides storage for Firefox
48353   // versions 6 and 7, where no localStorage, etc
48354   // is available.
48355
48356
48357   var Global$2 = util.Global;
48358
48359   var oldFFGlobalStorage = {
48360         name: 'oldFF-globalStorage',
48361         read: read$1,
48362         write: write$1,
48363         each: each$3,
48364         remove: remove$3,
48365         clearAll: clearAll$1,
48366   };
48367
48368   var globalStorage = Global$2.globalStorage;
48369
48370   function read$1(key) {
48371         return globalStorage[key]
48372   }
48373
48374   function write$1(key, data) {
48375         globalStorage[key] = data;
48376   }
48377
48378   function each$3(fn) {
48379         for (var i = globalStorage.length - 1; i >= 0; i--) {
48380                 var key = globalStorage.key(i);
48381                 fn(globalStorage[key], key);
48382         }
48383   }
48384
48385   function remove$3(key) {
48386         return globalStorage.removeItem(key)
48387   }
48388
48389   function clearAll$1() {
48390         each$3(function(key, _) {
48391                 delete globalStorage[key];
48392         });
48393   }
48394
48395   // oldIE-userDataStorage provides storage for Internet Explorer
48396   // versions 6 and 7, where no localStorage, sessionStorage, etc
48397   // is available.
48398
48399
48400   var Global$3 = util.Global;
48401
48402   var oldIEUserDataStorage = {
48403         name: 'oldIE-userDataStorage',
48404         write: write$2,
48405         read: read$2,
48406         each: each$4,
48407         remove: remove$4,
48408         clearAll: clearAll$2,
48409   };
48410
48411   var storageName = 'storejs';
48412   var doc = Global$3.document;
48413   var _withStorageEl = _makeIEStorageElFunction();
48414   var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
48415
48416   function write$2(unfixedKey, data) {
48417         if (disable) { return }
48418         var fixedKey = fixKey(unfixedKey);
48419         _withStorageEl(function(storageEl) {
48420                 storageEl.setAttribute(fixedKey, data);
48421                 storageEl.save(storageName);
48422         });
48423   }
48424
48425   function read$2(unfixedKey) {
48426         if (disable) { return }
48427         var fixedKey = fixKey(unfixedKey);
48428         var res = null;
48429         _withStorageEl(function(storageEl) {
48430                 res = storageEl.getAttribute(fixedKey);
48431         });
48432         return res
48433   }
48434
48435   function each$4(callback) {
48436         _withStorageEl(function(storageEl) {
48437                 var attributes = storageEl.XMLDocument.documentElement.attributes;
48438                 for (var i=attributes.length-1; i>=0; i--) {
48439                         var attr = attributes[i];
48440                         callback(storageEl.getAttribute(attr.name), attr.name);
48441                 }
48442         });
48443   }
48444
48445   function remove$4(unfixedKey) {
48446         var fixedKey = fixKey(unfixedKey);
48447         _withStorageEl(function(storageEl) {
48448                 storageEl.removeAttribute(fixedKey);
48449                 storageEl.save(storageName);
48450         });
48451   }
48452
48453   function clearAll$2() {
48454         _withStorageEl(function(storageEl) {
48455                 var attributes = storageEl.XMLDocument.documentElement.attributes;
48456                 storageEl.load(storageName);
48457                 for (var i=attributes.length-1; i>=0; i--) {
48458                         storageEl.removeAttribute(attributes[i].name);
48459                 }
48460                 storageEl.save(storageName);
48461         });
48462   }
48463
48464   // Helpers
48465   //////////
48466
48467   // In IE7, keys cannot start with a digit or contain certain chars.
48468   // See https://github.com/marcuswestin/store.js/issues/40
48469   // See https://github.com/marcuswestin/store.js/issues/83
48470   var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
48471   function fixKey(key) {
48472         return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
48473   }
48474
48475   function _makeIEStorageElFunction() {
48476         if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
48477                 return null
48478         }
48479         var scriptTag = 'script',
48480                 storageOwner,
48481                 storageContainer,
48482                 storageEl;
48483
48484         // Since #userData storage applies only to specific paths, we need to
48485         // somehow link our data to a specific path.  We choose /favicon.ico
48486         // as a pretty safe option, since all browsers already make a request to
48487         // this URL anyway and being a 404 will not hurt us here.  We wrap an
48488         // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
48489         // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
48490         // since the iframe access rules appear to allow direct access and
48491         // manipulation of the document element, even for a 404 page.  This
48492         // document can be used instead of the current document (which would
48493         // have been limited to the current path) to perform #userData storage.
48494         try {
48495                 /* global ActiveXObject */
48496                 storageContainer = new ActiveXObject('htmlfile');
48497                 storageContainer.open();
48498                 storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
48499                 storageContainer.close();
48500                 storageOwner = storageContainer.w.frames[0].document;
48501                 storageEl = storageOwner.createElement('div');
48502         } catch(e) {
48503                 // somehow ActiveXObject instantiation failed (perhaps some special
48504                 // security settings or otherwse), fall back to per-path storage
48505                 storageEl = doc.createElement('div');
48506                 storageOwner = doc.body;
48507         }
48508
48509         return function(storeFunction) {
48510                 var args = [].slice.call(arguments, 0);
48511                 args.unshift(storageEl);
48512                 // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
48513                 // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
48514                 storageOwner.appendChild(storageEl);
48515                 storageEl.addBehavior('#default#userData');
48516                 storageEl.load(storageName);
48517                 storeFunction.apply(this, args);
48518                 storageOwner.removeChild(storageEl);
48519                 return
48520         }
48521   }
48522
48523   // cookieStorage is useful Safari private browser mode, where localStorage
48524   // doesn't work but cookies do. This implementation is adopted from
48525   // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
48526
48527
48528   var Global$4 = util.Global;
48529   var trim$1 = util.trim;
48530
48531   var cookieStorage = {
48532         name: 'cookieStorage',
48533         read: read$3,
48534         write: write$3,
48535         each: each$5,
48536         remove: remove$5,
48537         clearAll: clearAll$3,
48538   };
48539
48540   var doc$1 = Global$4.document;
48541
48542   function read$3(key) {
48543         if (!key || !_has(key)) { return null }
48544         var regexpStr = "(?:^|.*;\\s*)" +
48545                 escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
48546                 "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
48547         return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
48548   }
48549
48550   function each$5(callback) {
48551         var cookies = doc$1.cookie.split(/; ?/g);
48552         for (var i = cookies.length - 1; i >= 0; i--) {
48553                 if (!trim$1(cookies[i])) {
48554                         continue
48555                 }
48556                 var kvp = cookies[i].split('=');
48557                 var key = unescape(kvp[0]);
48558                 var val = unescape(kvp[1]);
48559                 callback(val, key);
48560         }
48561   }
48562
48563   function write$3(key, data) {
48564         if(!key) { return }
48565         doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
48566   }
48567
48568   function remove$5(key) {
48569         if (!key || !_has(key)) {
48570                 return
48571         }
48572         doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
48573   }
48574
48575   function clearAll$3() {
48576         each$5(function(_, key) {
48577                 remove$5(key);
48578         });
48579   }
48580
48581   function _has(key) {
48582         return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
48583   }
48584
48585   var Global$5 = util.Global;
48586
48587   var sessionStorage_1 = {
48588         name: 'sessionStorage',
48589         read: read$4,
48590         write: write$4,
48591         each: each$6,
48592         remove: remove$6,
48593         clearAll: clearAll$4
48594   };
48595
48596   function sessionStorage() {
48597         return Global$5.sessionStorage
48598   }
48599
48600   function read$4(key) {
48601         return sessionStorage().getItem(key)
48602   }
48603
48604   function write$4(key, data) {
48605         return sessionStorage().setItem(key, data)
48606   }
48607
48608   function each$6(fn) {
48609         for (var i = sessionStorage().length - 1; i >= 0; i--) {
48610                 var key = sessionStorage().key(i);
48611                 fn(read$4(key), key);
48612         }
48613   }
48614
48615   function remove$6(key) {
48616         return sessionStorage().removeItem(key)
48617   }
48618
48619   function clearAll$4() {
48620         return sessionStorage().clear()
48621   }
48622
48623   // memoryStorage is a useful last fallback to ensure that the store
48624   // is functions (meaning store.get(), store.set(), etc will all function).
48625   // However, stored values will not persist when the browser navigates to
48626   // a new page or reloads the current page.
48627
48628   var memoryStorage_1 = {
48629         name: 'memoryStorage',
48630         read: read$5,
48631         write: write$5,
48632         each: each$7,
48633         remove: remove$7,
48634         clearAll: clearAll$5,
48635   };
48636
48637   var memoryStorage = {};
48638
48639   function read$5(key) {
48640         return memoryStorage[key]
48641   }
48642
48643   function write$5(key, data) {
48644         memoryStorage[key] = data;
48645   }
48646
48647   function each$7(callback) {
48648         for (var key in memoryStorage) {
48649                 if (memoryStorage.hasOwnProperty(key)) {
48650                         callback(memoryStorage[key], key);
48651                 }
48652         }
48653   }
48654
48655   function remove$7(key) {
48656         delete memoryStorage[key];
48657   }
48658
48659   function clearAll$5(key) {
48660         memoryStorage = {};
48661   }
48662
48663   var all = [
48664         // Listed in order of usage preference
48665         localStorage_1,
48666         oldFFGlobalStorage,
48667         oldIEUserDataStorage,
48668         cookieStorage,
48669         sessionStorage_1,
48670         memoryStorage_1
48671   ];
48672
48673   /* eslint-disable */
48674
48675   //  json2.js
48676   //  2016-10-28
48677   //  Public Domain.
48678   //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
48679   //  See http://www.JSON.org/js.html
48680   //  This code should be minified before deployment.
48681   //  See http://javascript.crockford.com/jsmin.html
48682
48683   //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
48684   //  NOT CONTROL.
48685
48686   //  This file creates a global JSON object containing two methods: stringify
48687   //  and parse. This file provides the ES5 JSON capability to ES3 systems.
48688   //  If a project might run on IE8 or earlier, then this file should be included.
48689   //  This file does nothing on ES5 systems.
48690
48691   //      JSON.stringify(value, replacer, space)
48692   //          value       any JavaScript value, usually an object or array.
48693   //          replacer    an optional parameter that determines how object
48694   //                      values are stringified for objects. It can be a
48695   //                      function or an array of strings.
48696   //          space       an optional parameter that specifies the indentation
48697   //                      of nested structures. If it is omitted, the text will
48698   //                      be packed without extra whitespace. If it is a number,
48699   //                      it will specify the number of spaces to indent at each
48700   //                      level. If it is a string (such as "\t" or "&nbsp;"),
48701   //                      it contains the characters used to indent at each level.
48702   //          This method produces a JSON text from a JavaScript value.
48703   //          When an object value is found, if the object contains a toJSON
48704   //          method, its toJSON method will be called and the result will be
48705   //          stringified. A toJSON method does not serialize: it returns the
48706   //          value represented by the name/value pair that should be serialized,
48707   //          or undefined if nothing should be serialized. The toJSON method
48708   //          will be passed the key associated with the value, and this will be
48709   //          bound to the value.
48710
48711   //          For example, this would serialize Dates as ISO strings.
48712
48713   //              Date.prototype.toJSON = function (key) {
48714   //                  function f(n) {
48715   //                      // Format integers to have at least two digits.
48716   //                      return (n < 10)
48717   //                          ? "0" + n
48718   //                          : n;
48719   //                  }
48720   //                  return this.getUTCFullYear()   + "-" +
48721   //                       f(this.getUTCMonth() + 1) + "-" +
48722   //                       f(this.getUTCDate())      + "T" +
48723   //                       f(this.getUTCHours())     + ":" +
48724   //                       f(this.getUTCMinutes())   + ":" +
48725   //                       f(this.getUTCSeconds())   + "Z";
48726   //              };
48727
48728   //          You can provide an optional replacer method. It will be passed the
48729   //          key and value of each member, with this bound to the containing
48730   //          object. The value that is returned from your method will be
48731   //          serialized. If your method returns undefined, then the member will
48732   //          be excluded from the serialization.
48733
48734   //          If the replacer parameter is an array of strings, then it will be
48735   //          used to select the members to be serialized. It filters the results
48736   //          such that only members with keys listed in the replacer array are
48737   //          stringified.
48738
48739   //          Values that do not have JSON representations, such as undefined or
48740   //          functions, will not be serialized. Such values in objects will be
48741   //          dropped; in arrays they will be replaced with null. You can use
48742   //          a replacer function to replace those with JSON values.
48743
48744   //          JSON.stringify(undefined) returns undefined.
48745
48746   //          The optional space parameter produces a stringification of the
48747   //          value that is filled with line breaks and indentation to make it
48748   //          easier to read.
48749
48750   //          If the space parameter is a non-empty string, then that string will
48751   //          be used for indentation. If the space parameter is a number, then
48752   //          the indentation will be that many spaces.
48753
48754   //          Example:
48755
48756   //          text = JSON.stringify(["e", {pluribus: "unum"}]);
48757   //          // text is '["e",{"pluribus":"unum"}]'
48758
48759   //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
48760   //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
48761
48762   //          text = JSON.stringify([new Date()], function (key, value) {
48763   //              return this[key] instanceof Date
48764   //                  ? "Date(" + this[key] + ")"
48765   //                  : value;
48766   //          });
48767   //          // text is '["Date(---current time---)"]'
48768
48769   //      JSON.parse(text, reviver)
48770   //          This method parses a JSON text to produce an object or array.
48771   //          It can throw a SyntaxError exception.
48772
48773   //          The optional reviver parameter is a function that can filter and
48774   //          transform the results. It receives each of the keys and values,
48775   //          and its return value is used instead of the original value.
48776   //          If it returns what it received, then the structure is not modified.
48777   //          If it returns undefined then the member is deleted.
48778
48779   //          Example:
48780
48781   //          // Parse the text. Values that look like ISO date strings will
48782   //          // be converted to Date objects.
48783
48784   //          myData = JSON.parse(text, function (key, value) {
48785   //              var a;
48786   //              if (typeof value === "string") {
48787   //                  a =
48788   //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
48789   //                  if (a) {
48790   //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
48791   //                          +a[5], +a[6]));
48792   //                  }
48793   //              }
48794   //              return value;
48795   //          });
48796
48797   //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
48798   //              var d;
48799   //              if (typeof value === "string" &&
48800   //                      value.slice(0, 5) === "Date(" &&
48801   //                      value.slice(-1) === ")") {
48802   //                  d = new Date(value.slice(5, -1));
48803   //                  if (d) {
48804   //                      return d;
48805   //                  }
48806   //              }
48807   //              return value;
48808   //          });
48809
48810   //  This is a reference implementation. You are free to copy, modify, or
48811   //  redistribute.
48812
48813   /*jslint
48814       eval, for, this
48815   */
48816
48817   /*property
48818       JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
48819       getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
48820       lastIndex, length, parse, prototype, push, replace, slice, stringify,
48821       test, toJSON, toString, valueOf
48822   */
48823
48824
48825   // Create a JSON object only if one does not already exist. We create the
48826   // methods in a closure to avoid creating global variables.
48827
48828   if (typeof JSON !== "object") {
48829       JSON = {};
48830   }
48831
48832   (function () {
48833
48834       var rx_one = /^[\],:{}\s]*$/;
48835       var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
48836       var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
48837       var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
48838       var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
48839       var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
48840
48841       function f(n) {
48842           // Format integers to have at least two digits.
48843           return n < 10
48844               ? "0" + n
48845               : n;
48846       }
48847
48848       function this_value() {
48849           return this.valueOf();
48850       }
48851
48852       if (typeof Date.prototype.toJSON !== "function") {
48853
48854           Date.prototype.toJSON = function () {
48855
48856               return isFinite(this.valueOf())
48857                   ? this.getUTCFullYear() + "-" +
48858                           f(this.getUTCMonth() + 1) + "-" +
48859                           f(this.getUTCDate()) + "T" +
48860                           f(this.getUTCHours()) + ":" +
48861                           f(this.getUTCMinutes()) + ":" +
48862                           f(this.getUTCSeconds()) + "Z"
48863                   : null;
48864           };
48865
48866           Boolean.prototype.toJSON = this_value;
48867           Number.prototype.toJSON = this_value;
48868           String.prototype.toJSON = this_value;
48869       }
48870
48871       var gap;
48872       var indent;
48873       var meta;
48874       var rep;
48875
48876
48877       function quote(string) {
48878
48879   // If the string contains no control characters, no quote characters, and no
48880   // backslash characters, then we can safely slap some quotes around it.
48881   // Otherwise we must also replace the offending characters with safe escape
48882   // sequences.
48883
48884           rx_escapable.lastIndex = 0;
48885           return rx_escapable.test(string)
48886               ? "\"" + string.replace(rx_escapable, function (a) {
48887                   var c = meta[a];
48888                   return typeof c === "string"
48889                       ? c
48890                       : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
48891               }) + "\""
48892               : "\"" + string + "\"";
48893       }
48894
48895
48896       function str(key, holder) {
48897
48898   // Produce a string from holder[key].
48899
48900           var i;          // The loop counter.
48901           var k;          // The member key.
48902           var v;          // The member value.
48903           var length;
48904           var mind = gap;
48905           var partial;
48906           var value = holder[key];
48907
48908   // If the value has a toJSON method, call it to obtain a replacement value.
48909
48910           if (value && typeof value === "object" &&
48911                   typeof value.toJSON === "function") {
48912               value = value.toJSON(key);
48913           }
48914
48915   // If we were called with a replacer function, then call the replacer to
48916   // obtain a replacement value.
48917
48918           if (typeof rep === "function") {
48919               value = rep.call(holder, key, value);
48920           }
48921
48922   // What happens next depends on the value's type.
48923
48924           switch (typeof value) {
48925           case "string":
48926               return quote(value);
48927
48928           case "number":
48929
48930   // JSON numbers must be finite. Encode non-finite numbers as null.
48931
48932               return isFinite(value)
48933                   ? String(value)
48934                   : "null";
48935
48936           case "boolean":
48937           case "null":
48938
48939   // If the value is a boolean or null, convert it to a string. Note:
48940   // typeof null does not produce "null". The case is included here in
48941   // the remote chance that this gets fixed someday.
48942
48943               return String(value);
48944
48945   // If the type is "object", we might be dealing with an object or an array or
48946   // null.
48947
48948           case "object":
48949
48950   // Due to a specification blunder in ECMAScript, typeof null is "object",
48951   // so watch out for that case.
48952
48953               if (!value) {
48954                   return "null";
48955               }
48956
48957   // Make an array to hold the partial results of stringifying this object value.
48958
48959               gap += indent;
48960               partial = [];
48961
48962   // Is the value an array?
48963
48964               if (Object.prototype.toString.apply(value) === "[object Array]") {
48965
48966   // The value is an array. Stringify every element. Use null as a placeholder
48967   // for non-JSON values.
48968
48969                   length = value.length;
48970                   for (i = 0; i < length; i += 1) {
48971                       partial[i] = str(i, value) || "null";
48972                   }
48973
48974   // Join all of the elements together, separated with commas, and wrap them in
48975   // brackets.
48976
48977                   v = partial.length === 0
48978                       ? "[]"
48979                       : gap
48980                           ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
48981                           : "[" + partial.join(",") + "]";
48982                   gap = mind;
48983                   return v;
48984               }
48985
48986   // If the replacer is an array, use it to select the members to be stringified.
48987
48988               if (rep && typeof rep === "object") {
48989                   length = rep.length;
48990                   for (i = 0; i < length; i += 1) {
48991                       if (typeof rep[i] === "string") {
48992                           k = rep[i];
48993                           v = str(k, value);
48994                           if (v) {
48995                               partial.push(quote(k) + (
48996                                   gap
48997                                       ? ": "
48998                                       : ":"
48999                               ) + v);
49000                           }
49001                       }
49002                   }
49003               } else {
49004
49005   // Otherwise, iterate through all of the keys in the object.
49006
49007                   for (k in value) {
49008                       if (Object.prototype.hasOwnProperty.call(value, k)) {
49009                           v = str(k, value);
49010                           if (v) {
49011                               partial.push(quote(k) + (
49012                                   gap
49013                                       ? ": "
49014                                       : ":"
49015                               ) + v);
49016                           }
49017                       }
49018                   }
49019               }
49020
49021   // Join all of the member texts together, separated with commas,
49022   // and wrap them in braces.
49023
49024               v = partial.length === 0
49025                   ? "{}"
49026                   : gap
49027                       ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
49028                       : "{" + partial.join(",") + "}";
49029               gap = mind;
49030               return v;
49031           }
49032       }
49033
49034   // If the JSON object does not yet have a stringify method, give it one.
49035
49036       if (typeof JSON.stringify !== "function") {
49037           meta = {    // table of character substitutions
49038               "\b": "\\b",
49039               "\t": "\\t",
49040               "\n": "\\n",
49041               "\f": "\\f",
49042               "\r": "\\r",
49043               "\"": "\\\"",
49044               "\\": "\\\\"
49045           };
49046           JSON.stringify = function (value, replacer, space) {
49047
49048   // The stringify method takes a value and an optional replacer, and an optional
49049   // space parameter, and returns a JSON text. The replacer can be a function
49050   // that can replace values, or an array of strings that will select the keys.
49051   // A default replacer method can be provided. Use of the space parameter can
49052   // produce text that is more easily readable.
49053
49054               var i;
49055               gap = "";
49056               indent = "";
49057
49058   // If the space parameter is a number, make an indent string containing that
49059   // many spaces.
49060
49061               if (typeof space === "number") {
49062                   for (i = 0; i < space; i += 1) {
49063                       indent += " ";
49064                   }
49065
49066   // If the space parameter is a string, it will be used as the indent string.
49067
49068               } else if (typeof space === "string") {
49069                   indent = space;
49070               }
49071
49072   // If there is a replacer, it must be a function or an array.
49073   // Otherwise, throw an error.
49074
49075               rep = replacer;
49076               if (replacer && typeof replacer !== "function" &&
49077                       (typeof replacer !== "object" ||
49078                       typeof replacer.length !== "number")) {
49079                   throw new Error("JSON.stringify");
49080               }
49081
49082   // Make a fake root object containing our value under the key of "".
49083   // Return the result of stringifying the value.
49084
49085               return str("", {"": value});
49086           };
49087       }
49088
49089
49090   // If the JSON object does not yet have a parse method, give it one.
49091
49092       if (typeof JSON.parse !== "function") {
49093           JSON.parse = function (text, reviver) {
49094
49095   // The parse method takes a text and an optional reviver function, and returns
49096   // a JavaScript value if the text is a valid JSON text.
49097
49098               var j;
49099
49100               function walk(holder, key) {
49101
49102   // The walk method is used to recursively walk the resulting structure so
49103   // that modifications can be made.
49104
49105                   var k;
49106                   var v;
49107                   var value = holder[key];
49108                   if (value && typeof value === "object") {
49109                       for (k in value) {
49110                           if (Object.prototype.hasOwnProperty.call(value, k)) {
49111                               v = walk(value, k);
49112                               if (v !== undefined) {
49113                                   value[k] = v;
49114                               } else {
49115                                   delete value[k];
49116                               }
49117                           }
49118                       }
49119                   }
49120                   return reviver.call(holder, key, value);
49121               }
49122
49123
49124   // Parsing happens in four stages. In the first stage, we replace certain
49125   // Unicode characters with escape sequences. JavaScript handles many characters
49126   // incorrectly, either silently deleting them, or treating them as line endings.
49127
49128               text = String(text);
49129               rx_dangerous.lastIndex = 0;
49130               if (rx_dangerous.test(text)) {
49131                   text = text.replace(rx_dangerous, function (a) {
49132                       return "\\u" +
49133                               ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
49134                   });
49135               }
49136
49137   // In the second stage, we run the text against regular expressions that look
49138   // for non-JSON patterns. We are especially concerned with "()" and "new"
49139   // because they can cause invocation, and "=" because it can cause mutation.
49140   // But just to be safe, we want to reject all unexpected forms.
49141
49142   // We split the second stage into 4 regexp operations in order to work around
49143   // crippling inefficiencies in IE's and Safari's regexp engines. First we
49144   // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
49145   // replace all simple value tokens with "]" characters. Third, we delete all
49146   // open brackets that follow a colon or comma or that begin the text. Finally,
49147   // we look to see that the remaining characters are only whitespace or "]" or
49148   // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
49149
49150               if (
49151                   rx_one.test(
49152                       text
49153                           .replace(rx_two, "@")
49154                           .replace(rx_three, "]")
49155                           .replace(rx_four, "")
49156                   )
49157               ) {
49158
49159   // In the third stage we use the eval function to compile the text into a
49160   // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
49161   // in JavaScript: it can begin a block or an object literal. We wrap the text
49162   // in parens to eliminate the ambiguity.
49163
49164                   j = eval("(" + text + ")");
49165
49166   // In the optional fourth stage, we recursively walk the new structure, passing
49167   // each name/value pair to a reviver function for possible transformation.
49168
49169                   return (typeof reviver === "function")
49170                       ? walk({"": j}, "")
49171                       : j;
49172               }
49173
49174   // If the text is not JSON parseable, then a SyntaxError is thrown.
49175
49176               throw new SyntaxError("JSON.parse");
49177           };
49178       }
49179   }());
49180
49181   var json2 = json2Plugin;
49182
49183   function json2Plugin() {
49184         
49185         return {}
49186   }
49187
49188   var plugins = [json2];
49189
49190   var store_legacy = storeEngine.createStore(all, plugins);
49191
49192   // # osm-auth
49193   //
49194   // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
49195   // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
49196   // does not support custom headers, which this uses everywhere.
49197   var osmAuth = function(o) {
49198
49199       var oauth = {};
49200
49201       // authenticated users will also have a request token secret, but it's
49202       // not used in transactions with the server
49203       oauth.authenticated = function() {
49204           return !!(token('oauth_token') && token('oauth_token_secret'));
49205       };
49206
49207       oauth.logout = function() {
49208           token('oauth_token', '');
49209           token('oauth_token_secret', '');
49210           token('oauth_request_token_secret', '');
49211           return oauth;
49212       };
49213
49214       // TODO: detect lack of click event
49215       oauth.authenticate = function(callback) {
49216           if (oauth.authenticated()) return callback();
49217
49218           oauth.logout();
49219
49220           // ## Getting a request token
49221           var params = timenonce(getAuth(o)),
49222               url = o.url + '/oauth/request_token';
49223
49224           params.oauth_signature = ohauth_1.signature(
49225               o.oauth_secret, '',
49226               ohauth_1.baseString('POST', url, params));
49227
49228           if (!o.singlepage) {
49229               // Create a 600x550 popup window in the center of the screen
49230               var w = 600, h = 550,
49231                   settings = [
49232                       ['width', w], ['height', h],
49233                       ['left', screen.width / 2 - w / 2],
49234                       ['top', screen.height / 2 - h / 2]].map(function(x) {
49235                           return x.join('=');
49236                       }).join(','),
49237                   popup = window.open('about:blank', 'oauth_window', settings);
49238           }
49239
49240           // Request a request token. When this is complete, the popup
49241           // window is redirected to OSM's authorization page.
49242           ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
49243           o.loading();
49244
49245           function reqTokenDone(err, xhr) {
49246               o.done();
49247               if (err) return callback(err);
49248               var resp = ohauth_1.stringQs(xhr.response);
49249               token('oauth_request_token_secret', resp.oauth_token_secret);
49250               var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
49251                   oauth_token: resp.oauth_token,
49252                   oauth_callback: resolveUrl(o.landing)
49253               });
49254
49255               if (o.singlepage) {
49256                   location.href = authorize_url;
49257               } else {
49258                   popup.location = authorize_url;
49259               }
49260           }
49261
49262           // Called by a function in a landing page, in the popup window. The
49263           // window closes itself.
49264           window.authComplete = function(token) {
49265               var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
49266               get_access_token(oauth_token.oauth_token);
49267               delete window.authComplete;
49268           };
49269
49270           // ## Getting an request token
49271           //
49272           // At this point we have an `oauth_token`, brought in from a function
49273           // call on a landing page popup.
49274           function get_access_token(oauth_token) {
49275               var url = o.url + '/oauth/access_token',
49276                   params = timenonce(getAuth(o)),
49277                   request_token_secret = token('oauth_request_token_secret');
49278               params.oauth_token = oauth_token;
49279               params.oauth_signature = ohauth_1.signature(
49280                   o.oauth_secret,
49281                   request_token_secret,
49282                   ohauth_1.baseString('POST', url, params));
49283
49284               // ## Getting an access token
49285               //
49286               // The final token required for authentication. At this point
49287               // we have a `request token secret`
49288               ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
49289               o.loading();
49290           }
49291
49292           function accessTokenDone(err, xhr) {
49293               o.done();
49294               if (err) return callback(err);
49295               var access_token = ohauth_1.stringQs(xhr.response);
49296               token('oauth_token', access_token.oauth_token);
49297               token('oauth_token_secret', access_token.oauth_token_secret);
49298               callback(null, oauth);
49299           }
49300       };
49301
49302       oauth.bootstrapToken = function(oauth_token, callback) {
49303           // ## Getting an request token
49304           // At this point we have an `oauth_token`, brought in from a function
49305           // call on a landing page popup.
49306           function get_access_token(oauth_token) {
49307               var url = o.url + '/oauth/access_token',
49308                   params = timenonce(getAuth(o)),
49309                   request_token_secret = token('oauth_request_token_secret');
49310               params.oauth_token = oauth_token;
49311               params.oauth_signature = ohauth_1.signature(
49312                   o.oauth_secret,
49313                   request_token_secret,
49314                   ohauth_1.baseString('POST', url, params));
49315
49316               // ## Getting an access token
49317               // The final token required for authentication. At this point
49318               // we have a `request token secret`
49319               ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
49320               o.loading();
49321           }
49322
49323           function accessTokenDone(err, xhr) {
49324               o.done();
49325               if (err) return callback(err);
49326               var access_token = ohauth_1.stringQs(xhr.response);
49327               token('oauth_token', access_token.oauth_token);
49328               token('oauth_token_secret', access_token.oauth_token_secret);
49329               callback(null, oauth);
49330           }
49331
49332           get_access_token(oauth_token);
49333       };
49334
49335       // # xhr
49336       //
49337       // A single XMLHttpRequest wrapper that does authenticated calls if the
49338       // user has logged in.
49339       oauth.xhr = function(options, callback) {
49340           if (!oauth.authenticated()) {
49341               if (o.auto) {
49342                   return oauth.authenticate(run);
49343               } else {
49344                   callback('not authenticated', null);
49345                   return;
49346               }
49347           } else {
49348               return run();
49349           }
49350
49351           function run() {
49352               var params = timenonce(getAuth(o)),
49353                   oauth_token_secret = token('oauth_token_secret'),
49354                   url = (options.prefix !== false) ? o.url + options.path : options.path,
49355                   url_parts = url.replace(/#.*$/, '').split('?', 2),
49356                   base_url = url_parts[0],
49357                   query = (url_parts.length === 2) ? url_parts[1] : '';
49358
49359               // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
49360               if ((!options.options || !options.options.header ||
49361                   options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
49362                   options.content) {
49363                   params = immutable(params, ohauth_1.stringQs(options.content));
49364               }
49365
49366               params.oauth_token = token('oauth_token');
49367               params.oauth_signature = ohauth_1.signature(
49368                   o.oauth_secret,
49369                   oauth_token_secret,
49370                   ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
49371               );
49372
49373               return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
49374           }
49375
49376           function done(err, xhr) {
49377               if (err) return callback(err);
49378               else if (xhr.responseXML) return callback(err, xhr.responseXML);
49379               else return callback(err, xhr.response);
49380           }
49381       };
49382
49383       // pre-authorize this object, if we can just get a token and token_secret
49384       // from the start
49385       oauth.preauth = function(c) {
49386           if (!c) return;
49387           if (c.oauth_token) token('oauth_token', c.oauth_token);
49388           if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
49389           return oauth;
49390       };
49391
49392       oauth.options = function(_) {
49393           if (!arguments.length) return o;
49394
49395           o = _;
49396           o.url = o.url || 'https://www.openstreetmap.org';
49397           o.landing = o.landing || 'land.html';
49398           o.singlepage = o.singlepage || false;
49399
49400           // Optional loading and loading-done functions for nice UI feedback.
49401           // by default, no-ops
49402           o.loading = o.loading || function() {};
49403           o.done = o.done || function() {};
49404
49405           return oauth.preauth(o);
49406       };
49407
49408       // 'stamp' an authentication object from `getAuth()`
49409       // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
49410       // and timestamp
49411       function timenonce(o) {
49412           o.oauth_timestamp = ohauth_1.timestamp();
49413           o.oauth_nonce = ohauth_1.nonce();
49414           return o;
49415       }
49416
49417       // get/set tokens. These are prefixed with the base URL so that `osm-auth`
49418       // can be used with multiple APIs and the keys in `localStorage`
49419       // will not clash
49420       var token;
49421
49422       if (store_legacy.enabled) {
49423           token = function (x, y) {
49424               if (arguments.length === 1) return store_legacy.get(o.url + x);
49425               else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
49426           };
49427       } else {
49428           var storage = {};
49429           token = function (x, y) {
49430               if (arguments.length === 1) return storage[o.url + x];
49431               else if (arguments.length === 2) return storage[o.url + x] = y;
49432           };
49433       }
49434
49435       // Get an authentication object. If you just add and remove properties
49436       // from a single object, you'll need to use `delete` to make sure that
49437       // it doesn't contain undesired properties for authentication
49438       function getAuth(o) {
49439           return {
49440               oauth_consumer_key: o.oauth_consumer_key,
49441               oauth_signature_method: 'HMAC-SHA1'
49442           };
49443       }
49444
49445       // potentially pre-authorize
49446       oauth.options(o);
49447
49448       return oauth;
49449   };
49450
49451   var JXON = new (function () {
49452     var
49453       sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
49454       aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
49455
49456     function parseText (sValue) {
49457       if (rIsNull.test(sValue)) { return null; }
49458       if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
49459       if (isFinite(sValue)) { return parseFloat(sValue); }
49460       if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
49461       return sValue;
49462     }
49463
49464     function EmptyTree () { }
49465     EmptyTree.prototype.toString = function () { return 'null'; };
49466     EmptyTree.prototype.valueOf = function () { return null; };
49467
49468     function objectify (vValue) {
49469       return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
49470     }
49471
49472     function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
49473       var
49474         nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
49475         bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
49476
49477       var
49478         sProp, vContent, nLength = 0, sCollectedTxt = '',
49479         vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
49480
49481       if (bChildren) {
49482         for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
49483           oNode = oParentNode.childNodes.item(nItem);
49484           if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
49485           else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
49486           else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
49487         }
49488       }
49489
49490       var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
49491
49492       if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
49493
49494       for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
49495         sProp = aCache[nElId].nodeName.toLowerCase();
49496         vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
49497         if (vResult.hasOwnProperty(sProp)) {
49498           if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
49499           vResult[sProp].push(vContent);
49500         } else {
49501           vResult[sProp] = vContent;
49502           nLength++;
49503         }
49504       }
49505
49506       if (bAttributes) {
49507         var
49508           nAttrLen = oParentNode.attributes.length,
49509           sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
49510
49511         for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
49512           oAttrib = oParentNode.attributes.item(nAttrib);
49513           oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
49514         }
49515
49516         if (bNesteAttr) {
49517           if (bFreeze) { Object.freeze(oAttrParent); }
49518           vResult[sAttributesProp] = oAttrParent;
49519           nLength -= nAttrLen - 1;
49520         }
49521       }
49522
49523       if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
49524         vResult[sValueProp] = vBuiltVal;
49525       } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
49526         vResult = vBuiltVal;
49527       }
49528
49529       if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
49530
49531       aCache.length = nLevelStart;
49532
49533       return vResult;
49534     }
49535
49536     function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
49537       var vValue, oChild;
49538
49539       if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
49540         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
49541       } else if (oParentObj.constructor === Date) {
49542         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));    
49543       }
49544
49545       for (var sName in oParentObj) {
49546         vValue = oParentObj[sName];
49547         if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
49548         if (sName === sValueProp) {
49549           if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
49550         } else if (sName === sAttributesProp) { /* verbosity level is 3 */
49551           for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
49552         } else if (sName.charAt(0) === sAttrPref) {
49553           oParentEl.setAttribute(sName.slice(1), vValue);
49554         } else if (vValue.constructor === Array) {
49555           for (var nItem = 0; nItem < vValue.length; nItem++) {
49556             oChild = oXMLDoc.createElement(sName);
49557             loadObjTree(oXMLDoc, oChild, vValue[nItem]);
49558             oParentEl.appendChild(oChild);
49559           }
49560         } else {
49561           oChild = oXMLDoc.createElement(sName);
49562           if (vValue instanceof Object) {
49563             loadObjTree(oXMLDoc, oChild, vValue);
49564           } else if (vValue !== null && vValue !== true) {
49565             oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
49566           }
49567           oParentEl.appendChild(oChild);
49568        }
49569      }
49570     }
49571
49572     this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
49573       var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
49574       return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);    
49575     };
49576
49577     this.unbuild = function (oObjTree) {    
49578       var oNewDoc = document.implementation.createDocument('', '', null);
49579       loadObjTree(oNewDoc, oNewDoc, oObjTree);
49580       return oNewDoc;
49581     };
49582
49583     this.stringify = function (oObjTree) {
49584       return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
49585     };
49586   })();
49587
49588   // var myObject = JXON.build(doc);
49589   // we got our javascript object! try: alert(JSON.stringify(myObject));
49590
49591   // var newDoc = JXON.unbuild(myObject);
49592   // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
49593
49594   var tiler$4 = utilTiler();
49595   var dispatch$5 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes');
49596   var urlroot = 'https://www.openstreetmap.org';
49597   var oauth = osmAuth({
49598       url: urlroot,
49599       oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
49600       oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
49601       loading: authLoading,
49602       done: authDone
49603   });
49604
49605   var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
49606   var _tileCache = { loaded: {}, inflight: {}, seen: {} };
49607   var _noteCache = { loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
49608   var _userCache = { toLoad: {}, user: {} };
49609   var _changeset = {};
49610
49611   var _connectionID = 1;
49612   var _tileZoom = 16;
49613   var _noteZoom = 12;
49614   var _rateLimitError;
49615   var _userChangesets;
49616   var _userDetails;
49617   var _off;
49618
49619
49620   function authLoading() {
49621       dispatch$5.call('authLoading');
49622   }
49623
49624
49625   function authDone() {
49626       dispatch$5.call('authDone');
49627   }
49628
49629
49630   function abortRequest$4(i) {
49631       if (i) {
49632           i.abort();
49633       }
49634   }
49635
49636
49637   function abortUnwantedRequests$2(cache, tiles) {
49638       forEach(cache.inflight, function(v, k) {
49639           var wanted = find$1(tiles, function(tile) { return k === tile.id; });
49640           if (!wanted) {
49641               abortRequest$4(v);
49642               delete cache.inflight[k];
49643           }
49644       });
49645   }
49646
49647
49648   function getLoc(attrs) {
49649       var lon = attrs.lon && attrs.lon.value;
49650       var lat = attrs.lat && attrs.lat.value;
49651       return [parseFloat(lon), parseFloat(lat)];
49652   }
49653
49654
49655   function getNodes(obj) {
49656       var elems = obj.getElementsByTagName('nd');
49657       var nodes = new Array(elems.length);
49658       for (var i = 0, l = elems.length; i < l; i++) {
49659           nodes[i] = 'n' + elems[i].attributes.ref.value;
49660       }
49661       return nodes;
49662   }
49663
49664
49665   function getTags(obj) {
49666       var elems = obj.getElementsByTagName('tag');
49667       var tags = {};
49668       for (var i = 0, l = elems.length; i < l; i++) {
49669           var attrs = elems[i].attributes;
49670           tags[attrs.k.value] = attrs.v.value;
49671       }
49672
49673       return tags;
49674   }
49675
49676
49677   function getMembers(obj) {
49678       var elems = obj.getElementsByTagName('member');
49679       var members = new Array(elems.length);
49680       for (var i = 0, l = elems.length; i < l; i++) {
49681           var attrs = elems[i].attributes;
49682           members[i] = {
49683               id: attrs.type.value[0] + attrs.ref.value,
49684               type: attrs.type.value,
49685               role: attrs.role.value
49686           };
49687       }
49688       return members;
49689   }
49690
49691
49692   function getVisible(attrs) {
49693       return (!attrs.visible || attrs.visible.value !== 'false');
49694   }
49695
49696
49697   function parseComments(comments) {
49698       var parsedComments = [];
49699
49700       // for each comment
49701       for (var i = 0; i < comments.length; i++) {
49702           var comment = comments[i];
49703           if (comment.nodeName === 'comment') {
49704               var childNodes = comment.childNodes;
49705               var parsedComment = {};
49706
49707               for (var j = 0; j < childNodes.length; j++) {
49708                   var node = childNodes[j];
49709                   var nodeName = node.nodeName;
49710                   if (nodeName === '#text') continue;
49711                   parsedComment[nodeName] = node.textContent;
49712
49713                   if (nodeName === 'uid') {
49714                       var uid = node.textContent;
49715                       if (uid && !_userCache.user[uid]) {
49716                           _userCache.toLoad[uid] = true;
49717                       }
49718                   }
49719               }
49720
49721               if (parsedComment) {
49722                   parsedComments.push(parsedComment);
49723               }
49724           }
49725       }
49726       return parsedComments;
49727   }
49728
49729
49730   function encodeNoteRtree(note) {
49731       return {
49732           minX: note.loc[0],
49733           minY: note.loc[1],
49734           maxX: note.loc[0],
49735           maxY: note.loc[1],
49736           data: note
49737       };
49738   }
49739
49740
49741   var parsers = {
49742       node: function nodeData(obj, uid) {
49743           var attrs = obj.attributes;
49744           return new osmNode({
49745               id: uid,
49746               visible: getVisible(attrs),
49747               version: attrs.version.value,
49748               changeset: attrs.changeset && attrs.changeset.value,
49749               timestamp: attrs.timestamp && attrs.timestamp.value,
49750               user: attrs.user && attrs.user.value,
49751               uid: attrs.uid && attrs.uid.value,
49752               loc: getLoc(attrs),
49753               tags: getTags(obj)
49754           });
49755       },
49756
49757       way: function wayData(obj, uid) {
49758           var attrs = obj.attributes;
49759           return new osmWay({
49760               id: uid,
49761               visible: getVisible(attrs),
49762               version: attrs.version.value,
49763               changeset: attrs.changeset && attrs.changeset.value,
49764               timestamp: attrs.timestamp && attrs.timestamp.value,
49765               user: attrs.user && attrs.user.value,
49766               uid: attrs.uid && attrs.uid.value,
49767               tags: getTags(obj),
49768               nodes: getNodes(obj),
49769           });
49770       },
49771
49772       relation: function relationData(obj, uid) {
49773           var attrs = obj.attributes;
49774           return new osmRelation({
49775               id: uid,
49776               visible: getVisible(attrs),
49777               version: attrs.version.value,
49778               changeset: attrs.changeset && attrs.changeset.value,
49779               timestamp: attrs.timestamp && attrs.timestamp.value,
49780               user: attrs.user && attrs.user.value,
49781               uid: attrs.uid && attrs.uid.value,
49782               tags: getTags(obj),
49783               members: getMembers(obj)
49784           });
49785       },
49786
49787       note: function parseNote(obj, uid) {
49788           var attrs = obj.attributes;
49789           var childNodes = obj.childNodes;
49790           var props = {};
49791
49792           props.id = uid;
49793           props.loc = getLoc(attrs);
49794
49795           // if notes are coincident, move them apart slightly
49796           var coincident = false;
49797           var epsilon = 0.00001;
49798           do {
49799               if (coincident) {
49800                   props.loc = geoVecAdd(props.loc, [epsilon, epsilon]);
49801               }
49802               var bbox = geoExtent(props.loc).bbox();
49803               coincident = _noteCache.rtree.search(bbox).length;
49804           } while (coincident);
49805
49806           // parse note contents
49807           for (var i = 0; i < childNodes.length; i++) {
49808               var node = childNodes[i];
49809               var nodeName = node.nodeName;
49810               if (nodeName === '#text') continue;
49811
49812               // if the element is comments, parse the comments
49813               if (nodeName === 'comments') {
49814                   props[nodeName] = parseComments(node.childNodes);
49815               } else {
49816                   props[nodeName] = node.textContent;
49817               }
49818           }
49819
49820           var note = new osmNote(props);
49821           var item = encodeNoteRtree(note);
49822           _noteCache.note[note.id] = note;
49823           _noteCache.rtree.insert(item);
49824
49825           return note;
49826       },
49827
49828       user: function parseUser(obj, uid) {
49829           var attrs = obj.attributes;
49830           var user = {
49831               id: uid,
49832               display_name: attrs.display_name && attrs.display_name.value,
49833               account_created: attrs.account_created && attrs.account_created.value,
49834               changesets_count: 0
49835           };
49836
49837           var img = obj.getElementsByTagName('img');
49838           if (img && img[0] && img[0].getAttribute('href')) {
49839               user.image_url = img[0].getAttribute('href');
49840           }
49841
49842           var changesets = obj.getElementsByTagName('changesets');
49843           if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
49844               user.changesets_count = changesets[0].getAttribute('count');
49845           }
49846
49847           _userCache.user[uid] = user;
49848           delete _userCache.toLoad[uid];
49849           return user;
49850       }
49851   };
49852
49853
49854   function parseXML(xml, callback, options) {
49855       options = assignIn({ skipSeen: true }, options);
49856       if (!xml || !xml.childNodes) {
49857           return callback({ message: 'No XML', status: -1 });
49858       }
49859
49860       var root = xml.childNodes[0];
49861       var children = root.childNodes;
49862       utilIdleWorker(children, parseChild, done);
49863
49864
49865       function done(results) {
49866           callback(null, results);
49867       }
49868
49869       function parseChild(child) {
49870           var parser = parsers[child.nodeName];
49871           if (!parser) return null;
49872
49873           var uid;
49874           if (child.nodeName === 'user') {
49875               uid = child.attributes.id.value;
49876               if (options.skipSeen && _userCache.user[uid]) {
49877                   delete _userCache.toLoad[uid];
49878                   return null;
49879               }
49880
49881           } else if (child.nodeName === 'note') {
49882               uid = child.getElementsByTagName('id')[0].textContent;
49883
49884           } else {
49885               uid = osmEntity.id.fromOSM(child.nodeName, child.attributes.id.value);
49886               if (options.skipSeen) {
49887                   if (_tileCache.seen[uid]) return null;  // avoid reparsing a "seen" entity
49888                   _tileCache.seen[uid] = true;
49889               }
49890           }
49891
49892           return parser(child, uid);
49893       }
49894   }
49895
49896
49897   // replace or remove note from rtree
49898   function updateRtree$2(item, replace) {
49899       _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; });
49900
49901       if (replace) {
49902           _noteCache.rtree.insert(item);
49903       }
49904   }
49905
49906
49907   function wrapcb(thisArg, callback, cid) {
49908       return function(err, result) {
49909           if (err) {
49910               // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
49911               if (err.status === 400 || err.status === 401 || err.status === 403) {
49912                   thisArg.logout();
49913               }
49914               return callback.call(thisArg, err);
49915
49916           } else if (thisArg.getConnectionId() !== cid) {
49917               return callback.call(thisArg, { message: 'Connection Switched', status: -1 });
49918
49919           } else {
49920               return callback.call(thisArg, err, result);
49921           }
49922       };
49923   }
49924
49925
49926   var serviceOsm = {
49927
49928       init: function() {
49929           utilRebind(this, dispatch$5, 'on');
49930       },
49931
49932
49933       reset: function() {
49934           _connectionID++;
49935           _userChangesets = undefined;
49936           _userDetails = undefined;
49937           _rateLimitError = undefined;
49938
49939           forEach(_tileCache.inflight, abortRequest$4);
49940           forEach(_noteCache.inflight, abortRequest$4);
49941           forEach(_noteCache.inflightPost, abortRequest$4);
49942           if (_changeset.inflight) abortRequest$4(_changeset.inflight);
49943
49944           _tileCache = { loaded: {}, inflight: {}, seen: {} };
49945           _noteCache = { loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
49946           _userCache = { toLoad: {}, user: {} };
49947           _changeset = {};
49948
49949           return this;
49950       },
49951
49952
49953       getConnectionId: function() {
49954           return _connectionID;
49955       },
49956
49957
49958       changesetURL: function(changesetID) {
49959           return urlroot + '/changeset/' + changesetID;
49960       },
49961
49962
49963       changesetsURL: function(center, zoom) {
49964           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
49965           return urlroot + '/history#map=' +
49966               Math.floor(zoom) + '/' +
49967               center[1].toFixed(precision) + '/' +
49968               center[0].toFixed(precision);
49969       },
49970
49971
49972       entityURL: function(entity) {
49973           return urlroot + '/' + entity.type + '/' + entity.osmId();
49974       },
49975
49976
49977       historyURL: function(entity) {
49978           return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
49979       },
49980
49981
49982       userURL: function(username) {
49983           return urlroot + '/user/' + username;
49984       },
49985
49986
49987       noteURL: function(note) {
49988           return urlroot + '/note/' + note.id;
49989       },
49990
49991
49992       noteReportURL: function(note) {
49993           return urlroot + '/reports/new?reportable_type=Note&reportable_id=' + note.id;
49994       },
49995
49996
49997       // Generic method to load data from the OSM API
49998       // Can handle either auth or unauth calls.
49999       loadFromAPI: function(path, callback, options) {
50000           options = assignIn({ skipSeen: true }, options);
50001           var that = this;
50002           var cid = _connectionID;
50003
50004           function done(err, xml) {
50005               if (that.getConnectionId() !== cid) {
50006                   if (callback) callback({ message: 'Connection Switched', status: -1 });
50007                   return;
50008               }
50009
50010               var isAuthenticated = that.authenticated();
50011
50012               // 400 Bad Request, 401 Unauthorized, 403 Forbidden
50013               // Logout and retry the request..
50014               if (isAuthenticated && err && (err.status === 400 || err.status === 401 || err.status === 403)) {
50015                   that.logout();
50016                   that.loadFromAPI(path, callback, options);
50017
50018               // else, no retry..
50019               } else {
50020                   // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
50021                   // Set the rateLimitError flag and trigger a warning..
50022                   if (!isAuthenticated && !_rateLimitError && err &&
50023                           (err.status === 509 || err.status === 429)) {
50024                       _rateLimitError = err;
50025                       dispatch$5.call('change');
50026                   }
50027
50028                   if (callback) {
50029                       if (err) {
50030                           return callback(err);
50031                       } else {
50032                           return parseXML(xml, callback, options);
50033                       }
50034                   }
50035               }
50036           }
50037
50038           if (this.authenticated()) {
50039               return oauth.xhr({ method: 'GET', path: path }, done);
50040           } else {
50041               var url = urlroot + path;
50042               return d3_xml(url).get(done);
50043           }
50044       },
50045
50046
50047       // Load a single entity by id (ways and relations use the `/full` call)
50048       // GET /api/0.6/node/#id
50049       // GET /api/0.6/[way|relation]/#id/full
50050       loadEntity: function(id, callback) {
50051           var type = osmEntity.id.type(id);
50052           var osmID = osmEntity.id.toOSM(id);
50053           var options = { skipSeen: false };
50054
50055           this.loadFromAPI(
50056               '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
50057               function(err, entities) {
50058                   if (callback) callback(err, { data: entities });
50059               },
50060               options
50061           );
50062       },
50063
50064
50065       // Load a single entity with a specific version
50066       // GET /api/0.6/[node|way|relation]/#id/#version
50067       loadEntityVersion: function(id, version, callback) {
50068           var type = osmEntity.id.type(id);
50069           var osmID = osmEntity.id.toOSM(id);
50070           var options = { skipSeen: false };
50071
50072           this.loadFromAPI(
50073               '/api/0.6/' + type + '/' + osmID + '/' + version,
50074               function(err, entities) {
50075                   if (callback) callback(err, { data: entities });
50076               },
50077               options
50078           );
50079       },
50080
50081
50082       // Load multiple entities in chunks
50083       // (note: callback may be called multiple times)
50084       // GET /api/0.6/[nodes|ways|relations]?#parameters
50085       loadMultiple: function(ids, callback) {
50086           var that = this;
50087
50088           forEach(groupBy(uniq(ids), osmEntity.id.type), function(v, k) {
50089               var type = k + 's';
50090               var osmIDs = map$3(v, osmEntity.id.toOSM);
50091               var options = { skipSeen: false };
50092
50093               forEach(chunk(osmIDs, 150), function(arr) {
50094                   that.loadFromAPI(
50095                       '/api/0.6/' + type + '?' + type + '=' + arr.join(),
50096                       function(err, entities) {
50097                           if (callback) callback(err, { data: entities });
50098                       },
50099                       options
50100                   );
50101               });
50102           });
50103       },
50104
50105
50106       // Create, upload, and close a changeset
50107       // PUT /api/0.6/changeset/create
50108       // POST /api/0.6/changeset/#id/upload
50109       // PUT /api/0.6/changeset/#id/close
50110       putChangeset: function(changeset, changes, callback) {
50111           var cid = _connectionID;
50112
50113           if (_changeset.inflight) {
50114               return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
50115
50116           } else if (_changeset.open) {   // reuse existing open changeset..
50117               return createdChangeset.call(this, null, _changeset.open);
50118
50119           } else {   // Open a new changeset..
50120               var options = {
50121                   method: 'PUT',
50122                   path: '/api/0.6/changeset/create',
50123                   options: { header: { 'Content-Type': 'text/xml' } },
50124                   content: JXON.stringify(changeset.asJXON())
50125               };
50126               _changeset.inflight = oauth.xhr(
50127                   options,
50128                   wrapcb(this, createdChangeset, cid)
50129               );
50130           }
50131
50132
50133           function createdChangeset(err, changesetID) {
50134               _changeset.inflight = null;
50135               if (err) { return callback(err, changeset); }
50136
50137               _changeset.open = changesetID;
50138               changeset = changeset.update({ id: changesetID });
50139
50140               // Upload the changeset..
50141               var options = {
50142                   method: 'POST',
50143                   path: '/api/0.6/changeset/' + changesetID + '/upload',
50144                   options: { header: { 'Content-Type': 'text/xml' } },
50145                   content: JXON.stringify(changeset.osmChangeJXON(changes))
50146               };
50147               _changeset.inflight = oauth.xhr(
50148                   options,
50149                   wrapcb(this, uploadedChangeset, cid)
50150               );
50151           }
50152
50153
50154           function uploadedChangeset(err) {
50155               _changeset.inflight = null;
50156               if (err) return callback(err, changeset);
50157
50158               // Upload was successful, safe to call the callback.
50159               // Add delay to allow for postgres replication #1646 #2678
50160               window.setTimeout(function() { callback(null, changeset); }, 2500);
50161               _changeset.open = null;
50162
50163               // At this point, we don't really care if the connection was switched..
50164               // Only try to close the changeset if we're still talking to the same server.
50165               if (this.getConnectionId() === cid) {
50166                   // Still attempt to close changeset, but ignore response because #2667
50167                   oauth.xhr({
50168                       method: 'PUT',
50169                       path: '/api/0.6/changeset/' + changeset.id + '/close',
50170                       options: { header: { 'Content-Type': 'text/xml' } }
50171                   }, function() { return true; });
50172               }
50173           }
50174       },
50175
50176
50177       // Load multiple users in chunks
50178       // (note: callback may be called multiple times)
50179       // GET /api/0.6/users?users=#id1,#id2,...,#idn
50180       loadUsers: function(uids, callback) {
50181           var toLoad = [];
50182           var cached = [];
50183
50184           uniq(uids).forEach(function(uid) {
50185               if (_userCache.user[uid]) {
50186                   delete _userCache.toLoad[uid];
50187                   cached.push(_userCache.user[uid]);
50188               } else {
50189                   toLoad.push(uid);
50190               }
50191           });
50192
50193           if (cached.length || !this.authenticated()) {
50194               callback(undefined, cached);
50195               if (!this.authenticated()) return;  // require auth
50196           }
50197
50198           chunk(toLoad, 150).forEach(function(arr) {
50199               oauth.xhr(
50200                   { method: 'GET', path: '/api/0.6/users?users=' + arr.join() },
50201                   wrapcb(this, done, _connectionID)
50202               );
50203           }.bind(this));
50204
50205           function done(err, xml) {
50206               if (err) { return callback(err); }
50207
50208               var options = { skipSeen: true };
50209               return parseXML(xml, function(err, results) {
50210                   if (err) {
50211                       return callback(err);
50212                   } else {
50213                       return callback(undefined, results);
50214                   }
50215               }, options);
50216           }
50217       },
50218
50219
50220       // Load a given user by id
50221       // GET /api/0.6/user/#id
50222       loadUser: function(uid, callback) {
50223           if (_userCache.user[uid] || !this.authenticated()) {   // require auth
50224               delete _userCache.toLoad[uid];
50225               return callback(undefined, _userCache.user[uid]);
50226           }
50227
50228           oauth.xhr(
50229               { method: 'GET', path: '/api/0.6/user/' + uid },
50230               wrapcb(this, done, _connectionID)
50231           );
50232
50233           function done(err, xml) {
50234               if (err) { return callback(err); }
50235
50236               var options = { skipSeen: true };
50237               return parseXML(xml, function(err, results) {
50238                   if (err) {
50239                       return callback(err);
50240                   } else {
50241                       return callback(undefined, results[0]);
50242                   }
50243               }, options);
50244           }
50245       },
50246
50247
50248       // Load the details of the logged-in user
50249       // GET /api/0.6/user/details
50250       userDetails: function(callback) {
50251           if (_userDetails) {    // retrieve cached
50252               return callback(undefined, _userDetails);
50253           }
50254
50255           oauth.xhr(
50256               { method: 'GET', path: '/api/0.6/user/details' },
50257               wrapcb(this, done, _connectionID)
50258           );
50259
50260           function done(err, xml) {
50261               if (err) { return callback(err); }
50262
50263               var options = { skipSeen: false };
50264               return parseXML(xml, function(err, results) {
50265                   if (err) {
50266                       return callback(err);
50267                   } else {
50268                       _userDetails = results[0];
50269                       return callback(undefined, _userDetails);
50270                   }
50271               }, options);
50272           }
50273       },
50274
50275
50276       // Load previous changesets for the logged in user
50277       // GET /api/0.6/changesets?user=#id
50278       userChangesets: function(callback) {
50279           if (_userChangesets) {    // retrieve cached
50280               return callback(undefined, _userChangesets);
50281           }
50282
50283           this.userDetails(
50284               wrapcb(this, gotDetails, _connectionID)
50285           );
50286
50287
50288           function gotDetails(err, user) {
50289               if (err) { return callback(err); }
50290
50291               oauth.xhr(
50292                   { method: 'GET', path: '/api/0.6/changesets?user=' + user.id },
50293                   wrapcb(this, done, _connectionID)
50294               );
50295           }
50296
50297           function done(err, xml) {
50298               if (err) { return callback(err); }
50299
50300               _userChangesets = Array.prototype.map.call(
50301                   xml.getElementsByTagName('changeset'),
50302                   function (changeset) { return { tags: getTags(changeset) }; }
50303               ).filter(function (changeset) {
50304                   var comment = changeset.tags.comment;
50305                   return comment && comment !== '';
50306               });
50307
50308               return callback(undefined, _userChangesets);
50309           }
50310       },
50311
50312
50313       // Fetch the status of the OSM API
50314       // GET /api/capabilities
50315       status: function(callback) {
50316           d3_xml(urlroot + '/api/capabilities').get(
50317               wrapcb(this, done, _connectionID)
50318           );
50319
50320           function done(err, xml) {
50321               if (err) { return callback(err); }
50322
50323               // update blacklists
50324               var elements = xml.getElementsByTagName('blacklist');
50325               var regexes = [];
50326               for (var i = 0; i < elements.length; i++) {
50327                   var regex = elements[i].getAttribute('regex');  // needs unencode?
50328                   if (regex) {
50329                       regexes.push(regex);
50330                   }
50331               }
50332               if (regexes.length) {
50333                   _blacklists = regexes;
50334               }
50335
50336               if (_rateLimitError) {
50337                   return callback(_rateLimitError, 'rateLimited');
50338               } else {
50339                   var apiStatus = xml.getElementsByTagName('status');
50340                   var val = apiStatus[0].getAttribute('api');
50341                   return callback(undefined, val);
50342               }
50343           }
50344       },
50345
50346
50347       // Load data (entities) from the API in tiles
50348       // GET /api/0.6/map?bbox=
50349       loadTiles: function(projection, callback) {
50350           if (_off) return;
50351
50352           var that = this;
50353           var path = '/api/0.6/map?bbox=';
50354
50355           // determine the needed tiles to cover the view
50356           var tiles = tiler$4.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
50357
50358           // abort inflight requests that are no longer needed
50359           var hadRequests = !isEmpty(_tileCache.inflight);
50360           abortUnwantedRequests$2(_tileCache, tiles);
50361           if (hadRequests && isEmpty(_tileCache.inflight)) {
50362               dispatch$5.call('loaded');    // stop the spinner
50363           }
50364
50365           // issue new requests..
50366           tiles.forEach(function(tile) {
50367               if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
50368               if (isEmpty(_tileCache.inflight)) {
50369                   dispatch$5.call('loading');   // start the spinner
50370               }
50371
50372               var options = { skipSeen: true };
50373               _tileCache.inflight[tile.id] = that.loadFromAPI(
50374                   path + tile.extent.toParam(),
50375                   function(err, parsed) {
50376                       delete _tileCache.inflight[tile.id];
50377                       if (!err) {
50378                           _tileCache.loaded[tile.id] = true;
50379                       }
50380                       if (callback) {
50381                           callback(err, assignIn({ data: parsed }, tile));
50382                       }
50383                       if (isEmpty(_tileCache.inflight)) {
50384                           dispatch$5.call('loaded');     // stop the spinner
50385                       }
50386                   },
50387                   options
50388               );
50389           });
50390       },
50391
50392
50393       // Load notes from the API in tiles
50394       // GET /api/0.6/notes?bbox=
50395       loadNotes: function(projection, noteOptions) {
50396           noteOptions = assignIn({ limit: 10000, closed: 7 }, noteOptions);
50397           if (_off) return;
50398
50399           var that = this;
50400           var path = '/api/0.6/notes?limit=' + noteOptions.limit + '&closed=' + noteOptions.closed + '&bbox=';
50401           var throttleLoadUsers = throttle(function() {
50402               var uids = Object.keys(_userCache.toLoad);
50403               if (!uids.length) return;
50404               that.loadUsers(uids, function() {});  // eagerly load user details
50405           }, 750);
50406
50407           // determine the needed tiles to cover the view
50408           var tiles = tiler$4.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection);
50409
50410           // abort inflight requests that are no longer needed
50411           abortUnwantedRequests$2(_noteCache, tiles);
50412
50413           // issue new requests..
50414           tiles.forEach(function(tile) {
50415               if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) return;
50416
50417               var options = { skipSeen: false };
50418               _noteCache.inflight[tile.id] = that.loadFromAPI(
50419                   path + tile.extent.toParam(),
50420                   function(err) {
50421                       delete _noteCache.inflight[tile.id];
50422                       if (!err) {
50423                           _noteCache.loaded[tile.id] = true;
50424                       }
50425                       throttleLoadUsers();
50426                       dispatch$5.call('loadedNotes');
50427                   },
50428                   options
50429               );
50430           });
50431       },
50432
50433
50434       // Create a note
50435       // POST /api/0.6/notes?params
50436       postNoteCreate: function(note, callback) {
50437           if (!this.authenticated()) {
50438               return callback({ message: 'Not Authenticated', status: -3 }, note);
50439           }
50440           if (_noteCache.inflightPost[note.id]) {
50441               return callback({ message: 'Note update already inflight', status: -2 }, note);
50442           }
50443
50444           if (!note.loc[0] || !note.loc[1] || !note.newComment) return; // location & description required
50445
50446           var comment = note.newComment;
50447           if (note.newCategory && note.newCategory !== 'None') { comment += ' #' + note.newCategory; }
50448
50449           var path = '/api/0.6/notes?' + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment });
50450
50451           _noteCache.inflightPost[note.id] = oauth.xhr(
50452               { method: 'POST', path: path },
50453               wrapcb(this, done, _connectionID)
50454           );
50455
50456
50457           function done(err, xml) {
50458               delete _noteCache.inflightPost[note.id];
50459               if (err) { return callback(err); }
50460
50461               // we get the updated note back, remove from caches and reparse..
50462               this.removeNote(note);
50463
50464               var options = { skipSeen: false };
50465               return parseXML(xml, function(err, results) {
50466                   if (err) {
50467                       return callback(err);
50468                   } else {
50469                       return callback(undefined, results[0]);
50470                   }
50471               }, options);
50472           }
50473       },
50474
50475
50476       // Update a note
50477       // POST /api/0.6/notes/#id/comment?text=comment
50478       // POST /api/0.6/notes/#id/close?text=comment
50479       // POST /api/0.6/notes/#id/reopen?text=comment
50480       postNoteUpdate: function(note, newStatus, callback) {
50481           if (!this.authenticated()) {
50482               return callback({ message: 'Not Authenticated', status: -3 }, note);
50483           }
50484           if (_noteCache.inflightPost[note.id]) {
50485               return callback({ message: 'Note update already inflight', status: -2 }, note);
50486           }
50487
50488           var action;
50489           if (note.status !== 'closed' && newStatus === 'closed') {
50490               action = 'close';
50491           } else if (note.status !== 'open' && newStatus === 'open') {
50492               action = 'reopen';
50493           } else {
50494               action = 'comment';
50495               if (!note.newComment) return; // when commenting, comment required
50496           }
50497
50498           var path = '/api/0.6/notes/' + note.id + '/' + action;
50499           if (note.newComment) {
50500               path += '?' + utilQsString({ text: note.newComment });
50501           }
50502
50503           _noteCache.inflightPost[note.id] = oauth.xhr(
50504               { method: 'POST', path: path },
50505               wrapcb(this, done, _connectionID)
50506           );
50507
50508
50509           function done(err, xml) {
50510               delete _noteCache.inflightPost[note.id];
50511               if (err) { return callback(err); }
50512
50513               // we get the updated note back, remove from caches and reparse..
50514               this.removeNote(note);
50515
50516               // update closed note cache - used to populate `closed:note` changeset tag
50517               if (action === 'close') {
50518                   _noteCache.closed[note.id] = true;
50519               } else if (action === 'reopen') {
50520                   delete _noteCache.closed[note.id];
50521               }
50522
50523               var options = { skipSeen: false };
50524               return parseXML(xml, function(err, results) {
50525                   if (err) {
50526                       return callback(err);
50527                   } else {
50528                       return callback(undefined, results[0]);
50529                   }
50530               }, options);
50531           }
50532       },
50533
50534
50535       switch: function(options) {
50536           urlroot = options.urlroot;
50537
50538           oauth.options(assignIn({
50539               url: urlroot,
50540               loading: authLoading,
50541               done: authDone
50542           }, options));
50543
50544           this.reset();
50545           this.userChangesets(function() {});  // eagerly load user details/changesets
50546           dispatch$5.call('change');
50547           return this;
50548       },
50549
50550
50551       toggle: function(_) {
50552           _off = !_;
50553           return this;
50554       },
50555
50556
50557       isChangesetInflight: function() {
50558           return !!_changeset.inflight;
50559       },
50560
50561
50562       // get/set cached data
50563       // This is used to save/restore the state when entering/exiting the walkthrough
50564       // Also used for testing purposes.
50565       caches: function(obj) {
50566           if (!arguments.length) {
50567               return {
50568                   tile: cloneDeep(_tileCache),
50569                   note: cloneDeep(_noteCache),
50570                   user: cloneDeep(_userCache)
50571               };
50572           }
50573
50574           // access caches directly for testing (e.g., loading notes rtree)
50575           if (obj === 'get') {
50576               return {
50577                   tile: _tileCache,
50578                   note: _noteCache,
50579                   user: _userCache
50580               };
50581           }
50582
50583           if (obj.tile) {
50584               _tileCache = obj.tile;
50585               _tileCache.inflight = {};
50586           }
50587           if (obj.note) {
50588               _noteCache = obj.note;
50589               _noteCache.inflight = {};
50590               _noteCache.inflightPost = {};
50591           }
50592           if (obj.user) {
50593               _userCache = obj.user;
50594           }
50595
50596           return this;
50597       },
50598
50599
50600       logout: function() {
50601           _userChangesets = undefined;
50602           _userDetails = undefined;
50603           oauth.logout();
50604           dispatch$5.call('change');
50605           return this;
50606       },
50607
50608
50609       authenticated: function() {
50610           return oauth.authenticated();
50611       },
50612
50613
50614       authenticate: function(callback) {
50615           var that = this;
50616           var cid = _connectionID;
50617           _userChangesets = undefined;
50618           _userDetails = undefined;
50619
50620           function done(err, res) {
50621               if (err) {
50622                   if (callback) callback(err);
50623                   return;
50624               }
50625               if (that.getConnectionId() !== cid) {
50626                   if (callback) callback({ message: 'Connection Switched', status: -1 });
50627                   return;
50628               }
50629               _rateLimitError = undefined;
50630               dispatch$5.call('change');
50631               if (callback) callback(err, res);
50632               that.userChangesets(function() {});  // eagerly load user details/changesets
50633           }
50634
50635           return oauth.authenticate(done);
50636       },
50637
50638
50639       imageryBlacklists: function() {
50640           return _blacklists;
50641       },
50642
50643
50644       tileZoom: function(_) {
50645           if (!arguments.length) return _tileZoom;
50646           _tileZoom = _;
50647           return this;
50648       },
50649
50650
50651       // get all cached notes covering the viewport
50652       notes: function(projection) {
50653           var viewport = projection.clipExtent();
50654           var min = [viewport[0][0], viewport[1][1]];
50655           var max = [viewport[1][0], viewport[0][1]];
50656           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
50657
50658           return _noteCache.rtree.search(bbox)
50659               .map(function(d) { return d.data; });
50660       },
50661
50662
50663       // get a single note from the cache
50664       getNote: function(id) {
50665           return _noteCache.note[id];
50666       },
50667
50668
50669       // remove a single note from the cache
50670       removeNote: function(note) {
50671           if (!(note instanceof osmNote) || !note.id) return;
50672
50673           delete _noteCache.note[note.id];
50674           updateRtree$2(encodeNoteRtree(note), false);  // false = remove
50675       },
50676
50677
50678       // replace a single note in the cache
50679       replaceNote: function(note) {
50680           if (!(note instanceof osmNote) || !note.id) return;
50681
50682           _noteCache.note[note.id] = note;
50683           updateRtree$2(encodeNoteRtree(note), true);  // true = replace
50684           return note;
50685       },
50686
50687
50688       // Get an array of note IDs closed during this session.
50689       // Used to populate `closed:note` changeset tag
50690       getClosedIDs: function() {
50691           return Object.keys(_noteCache.closed).sort();
50692       }
50693
50694   };
50695
50696   var apibase$3 = 'https://wiki.openstreetmap.org/w/api.php';
50697   var _inflight = {};
50698   var _wikibaseCache = {};
50699   var _localeIDs = { en: false };
50700
50701
50702   var debouncedRequest = debounce(request$1, 500, { leading: false });
50703
50704   function request$1(url, callback) {
50705       if (_inflight[url]) return;
50706
50707       _inflight[url] = d3_json(url, function (err, data) {
50708           delete _inflight[url];
50709           callback(err, data);
50710       });
50711   }
50712
50713
50714   /**
50715    * Get the best string value from the descriptions/labels result
50716    * Note that if mediawiki doesn't recognize language code, it will return all values.
50717    * In that case, fallback to use English.
50718    * @param values object - either descriptions or labels
50719    * @param langCode String
50720    * @returns localized string
50721    */
50722   function localizedToString(values, langCode) {
50723       if (values) {
50724           values = values[langCode] || values.en;
50725       }
50726       return values ? values.value : '';
50727   }
50728
50729
50730   var serviceOsmWikibase = {
50731
50732       init: function() {
50733           _inflight = {};
50734           _wikibaseCache = {};
50735           _localeIDs = {};
50736       },
50737
50738
50739       reset: function() {
50740           forEach(_inflight, function(req) { req.abort(); });
50741           _inflight = {};
50742       },
50743
50744
50745       /**
50746        * Get the best value for the property, or undefined if not found
50747        * @param entity object from wikibase
50748        * @param property string e.g. 'P4' for image
50749        * @param langCode string e.g. 'fr' for French
50750        */
50751       claimToValue: function(entity, property, langCode) {
50752           if (!entity.claims[property]) return undefined;
50753           var locale = _localeIDs[langCode];
50754           var preferredPick, localePick;
50755
50756           forEach(entity.claims[property], function(stmt) {
50757               // If exists, use value limited to the needed language (has a qualifier P26 = locale)
50758               // Or if not found, use the first value with the "preferred" rank
50759               if (!preferredPick && stmt.rank === 'preferred') {
50760                   preferredPick = stmt;
50761               }
50762               if (locale && stmt.qualifiers && stmt.qualifiers.P26 &&
50763                   stmt.qualifiers.P26[0].datavalue.value.id === locale
50764               ) {
50765                   localePick = stmt;
50766               }
50767           });
50768
50769           var result = localePick || preferredPick;
50770           if (result) {
50771               var datavalue = result.mainsnak.datavalue;
50772               return datavalue.type === 'wikibase-entityid' ? datavalue.value.id : datavalue.value;
50773           } else {
50774               return undefined;
50775           }
50776       },
50777
50778
50779       /**
50780        * Convert monolingual property into a key-value object (language -> value)
50781        * @param entity object from wikibase
50782        * @param property string e.g. 'P31' for monolingual wiki page title
50783        */
50784       monolingualClaimToValueObj: function(entity, property) {
50785           if (!entity || !entity.claims[property]) return undefined;
50786
50787           return entity.claims[property].reduce(function(acc, obj) {
50788               var value = obj.mainsnak.datavalue.value;
50789               acc[value.language] = value.text;
50790               return acc;
50791           }, {});
50792       },
50793
50794
50795       toSitelink: function(key, value) {
50796           var result = value ? ('Tag:' + key + '=' + value) : 'Key:' + key;
50797           return result.replace(/_/g, ' ').trim();
50798       },
50799
50800
50801       //
50802       // Pass params object of the form:
50803       // {
50804       //   key: 'string',
50805       //   value: 'string',
50806       //   rtype: 'string',
50807       //   langCode: 'string'
50808       // }
50809       //
50810       getEntity: function(params, callback) {
50811           var doRequest = params.debounce ? debouncedRequest : request$1;
50812           var that = this;
50813           var titles = [];
50814           var result = {};
50815           var rtypeSitelink = params.rtype ? ('Relation:' + params.rtype).replace(/_/g, ' ').trim() : false;
50816           var keySitelink = params.key ? this.toSitelink(params.key) : false;
50817           var tagSitelink = (params.key && params.value) ? this.toSitelink(params.key, params.value) : false;
50818           var localeSitelink;
50819
50820           if (params.langCode && _localeIDs[params.langCode] === undefined) {
50821               // If this is the first time we are asking about this locale,
50822               // fetch corresponding entity (if it exists), and cache it.
50823               // If there is no such entry, cache `false` value to avoid re-requesting it.
50824               localeSitelink = ('Locale:' + params.langCode).replace(/_/g, ' ').trim();
50825               titles.push(localeSitelink);
50826           }
50827
50828           if (rtypeSitelink) {
50829               if (_wikibaseCache[rtypeSitelink]) {
50830                   result.rtype = _wikibaseCache[rtypeSitelink];
50831               } else {
50832                   titles.push(rtypeSitelink);
50833               }
50834           }
50835
50836           if (keySitelink) {
50837               if (_wikibaseCache[keySitelink]) {
50838                   result.key = _wikibaseCache[keySitelink];
50839               } else {
50840                   titles.push(keySitelink);
50841               }
50842           }
50843
50844           if (tagSitelink) {
50845               if (_wikibaseCache[tagSitelink]) {
50846                   result.tag = _wikibaseCache[tagSitelink];
50847               } else {
50848                   titles.push(tagSitelink);
50849               }
50850           }
50851
50852           if (!titles.length) {
50853               // Nothing to do, we already had everything in the cache
50854               return callback(null, result);
50855           }
50856
50857           // Requesting just the user language code
50858           // If backend recognizes the code, it will perform proper fallbacks,
50859           // and the result will contain the requested code. If not, all values are returned:
50860           // {"zh-tw":{"value":"...","language":"zh-tw","source-language":"zh-hant"}
50861           // {"pt-br":{"value":"...","language":"pt","for-language":"pt-br"}}
50862           var obj = {
50863               action: 'wbgetentities',
50864               sites: 'wiki',
50865               titles: titles.join('|'),
50866               languages: params.langCode,
50867               languagefallback: 1,
50868               origin: '*',
50869               format: 'json',
50870               // There is an MW Wikibase API bug https://phabricator.wikimedia.org/T212069
50871               // We shouldn't use v1 until it gets fixed, but should switch to it afterwards
50872               // formatversion: 2,
50873           };
50874
50875           var url = apibase$3 + '?' + utilQsString(obj);
50876           doRequest(url, function(err, d) {
50877               if (err) {
50878                   callback(err);
50879               } else if (!d.success || d.error) {
50880                   callback(d.error.messages.map(function(v) { return v.html['*']; }).join('<br>'));
50881               } else {
50882                   var localeID = false;
50883                   forEach(d.entities, function(res) {
50884                       if (res.missing !== '') {
50885                           // Simplify access to the localized values
50886                           res.description = localizedToString(res.descriptions, params.langCode);
50887                           res.label = localizedToString(res.labels, params.langCode);
50888
50889                           var title = res.sitelinks.wiki.title;
50890                           if (title === rtypeSitelink) {
50891                               _wikibaseCache[rtypeSitelink] = res;
50892                               result.rtype = res;
50893                           } else if (title === keySitelink) {
50894                               _wikibaseCache[keySitelink] = res;
50895                               result.key = res;
50896                           } else if (title === tagSitelink) {
50897                               _wikibaseCache[tagSitelink] = res;
50898                               result.tag = res;
50899                           } else if (title === localeSitelink) {
50900                               localeID = res.id;
50901                           } else {
50902                               console.log('Unexpected title ' + title);  // eslint-disable-line no-console
50903                           }
50904                       }
50905                   });
50906
50907                   if (localeSitelink) {
50908                       // If locale ID is not found, store false to prevent repeated queries
50909                       that.addLocale(params.langCode, localeID);
50910                   }
50911
50912                   callback(null, result);
50913               }
50914           });
50915       },
50916
50917
50918       //
50919       // Pass params object of the form:
50920       // {
50921       //   key: 'string',     // required
50922       //   value: 'string'    // optional
50923       // }
50924       //   -or-
50925       // {
50926       //   rtype: 'rtype'     // relation type  (e.g. 'multipolygon')
50927       // }
50928       //
50929       // Get an result object used to display tag documentation
50930       // {
50931       //   title:        'string',
50932       //   description:  'string',
50933       //   editURL:      'string',
50934       //   imageURL:     'string',
50935       //   wiki:         { title: 'string', text: 'string', url: 'string' }
50936       // }
50937       //
50938       getDocs: function(params, callback) {
50939           var that = this;
50940           var langCode = utilDetect().locale.toLowerCase();
50941           params.langCode = langCode;
50942
50943           this.getEntity(params, function(err, data) {
50944               if (err) {
50945                   callback(err);
50946                   return;
50947               }
50948
50949               var entity = data.rtype || data.tag || data.key;
50950               if (!entity) {
50951                   callback('No entity');
50952                   return;
50953               }
50954
50955               // prepare result
50956               var result = {
50957                   title: entity.title,
50958                   description: entity.description,
50959                   editURL: 'https://wiki.openstreetmap.org/wiki/' + entity.title
50960               };
50961
50962               // add image
50963               if (entity.claims) {
50964                   var imageroot;
50965                   var image = that.claimToValue(entity, 'P4', langCode);
50966                   if (image) {
50967                       imageroot = 'https://commons.wikimedia.org/w/index.php';
50968                   } else {
50969                       image = that.claimToValue(entity, 'P28', langCode);
50970                       if (image) {
50971                           imageroot = 'https://wiki.openstreetmap.org/w/index.php';
50972                       }
50973                   }
50974                   if (imageroot && image) {
50975                       result.imageURL = imageroot + '?' + utilQsString({
50976                           title: 'Special:Redirect/file/' + image,
50977                           width: 400
50978                       });
50979                   }
50980               }
50981
50982               // Try to get a wiki page from tag data item first, followed by the corresponding key data item.
50983               // If neither tag nor key data item contain a wiki page in the needed language nor English,
50984               // get the first found wiki page from either the tag or the key item.
50985               var rtypeWiki = that.monolingualClaimToValueObj(data.rtype, 'P31');
50986               var tagWiki = that.monolingualClaimToValueObj(data.tag, 'P31');
50987               var keyWiki = that.monolingualClaimToValueObj(data.key, 'P31');
50988
50989               // If exact language code does not exist, try to find the first part before the '-'
50990               // BUG: in some cases, a more elaborate fallback logic might be needed
50991               var langPrefix = langCode.split('-', 2)[0];
50992
50993               // use the first acceptable wiki page
50994               result.wiki =
50995                   getWikiInfo(rtypeWiki, langCode, 'inspector.wiki_reference') ||
50996                   getWikiInfo(rtypeWiki, langPrefix, 'inspector.wiki_reference') ||
50997                   getWikiInfo(rtypeWiki, 'en', 'inspector.wiki_en_reference') ||
50998                   getWikiInfo(tagWiki, langCode, 'inspector.wiki_reference') ||
50999                   getWikiInfo(tagWiki, langPrefix, 'inspector.wiki_reference') ||
51000                   getWikiInfo(tagWiki, 'en', 'inspector.wiki_en_reference') ||
51001                   getWikiInfo(keyWiki, langCode, 'inspector.wiki_reference') ||
51002                   getWikiInfo(keyWiki, langPrefix, 'inspector.wiki_reference') ||
51003                   getWikiInfo(keyWiki, 'en', 'inspector.wiki_en_reference');
51004
51005               callback(null, result);
51006
51007
51008               // Helper method to get wiki info if a given language exists
51009               function getWikiInfo(wiki, langCode, tKey) {
51010                   if (wiki && wiki[langCode]) {
51011                       return {
51012                           title: wiki[langCode],
51013                           text: tKey,
51014                           url: 'https://wiki.openstreetmap.org/wiki/' + wiki[langCode]
51015                       };
51016                   }
51017               }
51018           });
51019       },
51020
51021
51022       addLocale: function(langCode, qid) {
51023           // Makes it easier to unit test
51024           _localeIDs[langCode] = qid;
51025       },
51026
51027
51028       apibase: function(val) {
51029           if (!arguments.length) return apibase$3;
51030           apibase$3 = val;
51031           return this;
51032       }
51033
51034   };
51035
51036   var jsonpCache = {};
51037   window.jsonpCache = jsonpCache;
51038
51039   function jsonpRequest(url, callback) {
51040       var request = {
51041           abort: function() {}
51042       };
51043
51044       if (window.JSONP_FIX) {
51045           if (window.JSONP_DELAY === 0) {
51046               callback(window.JSONP_FIX);
51047           } else {
51048               var t = window.setTimeout(function() {
51049                   callback(window.JSONP_FIX);
51050               }, window.JSONP_DELAY || 0);
51051
51052               request.abort = function() { window.clearTimeout(t); };
51053           }
51054
51055           return request;
51056       }
51057
51058       function rand() {
51059           var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
51060           var c = '';
51061           var i = -1;
51062           while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
51063           return c;
51064       }
51065
51066       function create(url) {
51067           var e = url.match(/callback=(\w+)/);
51068           var c = e ? e[1] : rand();
51069
51070           jsonpCache[c] = function(data) {
51071               if (jsonpCache[c]) {
51072                   callback(data);
51073               }
51074               finalize();
51075           };
51076
51077           function finalize() {
51078               delete jsonpCache[c];
51079               script.remove();
51080           }
51081
51082           request.abort = finalize;
51083           return 'jsonpCache.' + c;
51084       }
51085
51086       var cb = create(url);
51087
51088       var script = select('head')
51089           .append('script')
51090           .attr('type', 'text/javascript')
51091           .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
51092
51093       return request;
51094   }
51095
51096   var q = createCommonjsModule(function (module, exports) {
51097   // vim:ts=4:sts=4:sw=4:
51098   /*!
51099    *
51100    * Copyright 2009-2017 Kris Kowal under the terms of the MIT
51101    * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
51102    *
51103    * With parts by Tyler Close
51104    * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
51105    * at http://www.opensource.org/licenses/mit-license.html
51106    * Forked at ref_send.js version: 2009-05-11
51107    *
51108    * With parts by Mark Miller
51109    * Copyright (C) 2011 Google Inc.
51110    *
51111    * Licensed under the Apache License, Version 2.0 (the "License");
51112    * you may not use this file except in compliance with the License.
51113    * You may obtain a copy of the License at
51114    *
51115    * http://www.apache.org/licenses/LICENSE-2.0
51116    *
51117    * Unless required by applicable law or agreed to in writing, software
51118    * distributed under the License is distributed on an "AS IS" BASIS,
51119    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
51120    * See the License for the specific language governing permissions and
51121    * limitations under the License.
51122    *
51123    */
51124
51125   (function (definition) {
51126
51127       // This file will function properly as a <script> tag, or a module
51128       // using CommonJS and NodeJS or RequireJS module formats.  In
51129       // Common/Node/RequireJS, the module exports the Q API and when
51130       // executed as a simple <script>, it creates a Q global instead.
51131
51132       // Montage Require
51133       if (typeof bootstrap === "function") {
51134           bootstrap("promise", definition);
51135
51136       // CommonJS
51137       } else {
51138           module.exports = definition();
51139
51140       // RequireJS
51141       }
51142
51143   })(function () {
51144
51145   var hasStacks = false;
51146   try {
51147       throw new Error();
51148   } catch (e) {
51149       hasStacks = !!e.stack;
51150   }
51151
51152   // All code after this point will be filtered from stack traces reported
51153   // by Q.
51154   var qStartingLine = captureLine();
51155   var qFileName;
51156
51157   // shims
51158
51159   // used for fallback in "allResolved"
51160   var noop = function () {};
51161
51162   // Use the fastest possible means to execute a task in a future turn
51163   // of the event loop.
51164   var nextTick =(function () {
51165       // linked list of tasks (single, with head node)
51166       var head = {task: void 0, next: null};
51167       var tail = head;
51168       var flushing = false;
51169       var requestTick = void 0;
51170       var isNodeJS = false;
51171       // queue for late tasks, used by unhandled rejection tracking
51172       var laterQueue = [];
51173
51174       function flush() {
51175           /* jshint loopfunc: true */
51176           var task, domain;
51177
51178           while (head.next) {
51179               head = head.next;
51180               task = head.task;
51181               head.task = void 0;
51182               domain = head.domain;
51183
51184               if (domain) {
51185                   head.domain = void 0;
51186                   domain.enter();
51187               }
51188               runSingle(task, domain);
51189
51190           }
51191           while (laterQueue.length) {
51192               task = laterQueue.pop();
51193               runSingle(task);
51194           }
51195           flushing = false;
51196       }
51197       // runs a single function in the async queue
51198       function runSingle(task, domain) {
51199           try {
51200               task();
51201
51202           } catch (e) {
51203               if (isNodeJS) {
51204                   // In node, uncaught exceptions are considered fatal errors.
51205                   // Re-throw them synchronously to interrupt flushing!
51206
51207                   // Ensure continuation if the uncaught exception is suppressed
51208                   // listening "uncaughtException" events (as domains does).
51209                   // Continue in next event to avoid tick recursion.
51210                   if (domain) {
51211                       domain.exit();
51212                   }
51213                   setTimeout(flush, 0);
51214                   if (domain) {
51215                       domain.enter();
51216                   }
51217
51218                   throw e;
51219
51220               } else {
51221                   // In browsers, uncaught exceptions are not fatal.
51222                   // Re-throw them asynchronously to avoid slow-downs.
51223                   setTimeout(function () {
51224                       throw e;
51225                   }, 0);
51226               }
51227           }
51228
51229           if (domain) {
51230               domain.exit();
51231           }
51232       }
51233
51234       nextTick = function (task) {
51235           tail = tail.next = {
51236               task: task,
51237               domain: isNodeJS && process.domain,
51238               next: null
51239           };
51240
51241           if (!flushing) {
51242               flushing = true;
51243               requestTick();
51244           }
51245       };
51246
51247       if (typeof process === "object" &&
51248           process.toString() === "[object process]" && process.nextTick) {
51249           // Ensure Q is in a real Node environment, with a `process.nextTick`.
51250           // To see through fake Node environments:
51251           // * Mocha test runner - exposes a `process` global without a `nextTick`
51252           // * Browserify - exposes a `process.nexTick` function that uses
51253           //   `setTimeout`. In this case `setImmediate` is preferred because
51254           //    it is faster. Browserify's `process.toString()` yields
51255           //   "[object Object]", while in a real Node environment
51256           //   `process.toString()` yields "[object process]".
51257           isNodeJS = true;
51258
51259           requestTick = function () {
51260               process.nextTick(flush);
51261           };
51262
51263       } else if (typeof setImmediate === "function") {
51264           // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
51265           if (typeof window !== "undefined") {
51266               requestTick = setImmediate.bind(window, flush);
51267           } else {
51268               requestTick = function () {
51269                   setImmediate(flush);
51270               };
51271           }
51272
51273       } else if (typeof MessageChannel !== "undefined") {
51274           // modern browsers
51275           // http://www.nonblocking.io/2011/06/windownexttick.html
51276           var channel = new MessageChannel();
51277           // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
51278           // working message ports the first time a page loads.
51279           channel.port1.onmessage = function () {
51280               requestTick = requestPortTick;
51281               channel.port1.onmessage = flush;
51282               flush();
51283           };
51284           var requestPortTick = function () {
51285               // Opera requires us to provide a message payload, regardless of
51286               // whether we use it.
51287               channel.port2.postMessage(0);
51288           };
51289           requestTick = function () {
51290               setTimeout(flush, 0);
51291               requestPortTick();
51292           };
51293
51294       } else {
51295           // old browsers
51296           requestTick = function () {
51297               setTimeout(flush, 0);
51298           };
51299       }
51300       // runs a task after all other tasks have been run
51301       // this is useful for unhandled rejection tracking that needs to happen
51302       // after all `then`d tasks have been run.
51303       nextTick.runAfter = function (task) {
51304           laterQueue.push(task);
51305           if (!flushing) {
51306               flushing = true;
51307               requestTick();
51308           }
51309       };
51310       return nextTick;
51311   })();
51312
51313   // Attempt to make generics safe in the face of downstream
51314   // modifications.
51315   // There is no situation where this is necessary.
51316   // If you need a security guarantee, these primordials need to be
51317   // deeply frozen anyway, and if you don’t need a security guarantee,
51318   // this is just plain paranoid.
51319   // However, this **might** have the nice side-effect of reducing the size of
51320   // the minified code by reducing x.call() to merely x()
51321   // See Mark Miller’s explanation of what this does.
51322   // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
51323   var call = Function.call;
51324   function uncurryThis(f) {
51325       return function () {
51326           return call.apply(f, arguments);
51327       };
51328   }
51329   // This is equivalent, but slower:
51330   // uncurryThis = Function_bind.bind(Function_bind.call);
51331   // http://jsperf.com/uncurrythis
51332
51333   var array_slice = uncurryThis(Array.prototype.slice);
51334
51335   var array_reduce = uncurryThis(
51336       Array.prototype.reduce || function (callback, basis) {
51337           var index = 0,
51338               length = this.length;
51339           // concerning the initial value, if one is not provided
51340           if (arguments.length === 1) {
51341               // seek to the first value in the array, accounting
51342               // for the possibility that is is a sparse array
51343               do {
51344                   if (index in this) {
51345                       basis = this[index++];
51346                       break;
51347                   }
51348                   if (++index >= length) {
51349                       throw new TypeError();
51350                   }
51351               } while (1);
51352           }
51353           // reduce
51354           for (; index < length; index++) {
51355               // account for the possibility that the array is sparse
51356               if (index in this) {
51357                   basis = callback(basis, this[index], index);
51358               }
51359           }
51360           return basis;
51361       }
51362   );
51363
51364   var array_indexOf = uncurryThis(
51365       Array.prototype.indexOf || function (value) {
51366           // not a very good shim, but good enough for our one use of it
51367           for (var i = 0; i < this.length; i++) {
51368               if (this[i] === value) {
51369                   return i;
51370               }
51371           }
51372           return -1;
51373       }
51374   );
51375
51376   var array_map = uncurryThis(
51377       Array.prototype.map || function (callback, thisp) {
51378           var self = this;
51379           var collect = [];
51380           array_reduce(self, function (undefined$1, value, index) {
51381               collect.push(callback.call(thisp, value, index, self));
51382           }, void 0);
51383           return collect;
51384       }
51385   );
51386
51387   var object_create = Object.create || function (prototype) {
51388       function Type() { }
51389       Type.prototype = prototype;
51390       return new Type();
51391   };
51392
51393   var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
51394       obj[prop] = descriptor.value;
51395       return obj;
51396   };
51397
51398   var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
51399
51400   var object_keys = Object.keys || function (object) {
51401       var keys = [];
51402       for (var key in object) {
51403           if (object_hasOwnProperty(object, key)) {
51404               keys.push(key);
51405           }
51406       }
51407       return keys;
51408   };
51409
51410   var object_toString = uncurryThis(Object.prototype.toString);
51411
51412   function isObject(value) {
51413       return value === Object(value);
51414   }
51415
51416   // generator related shims
51417
51418   // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
51419   function isStopIteration(exception) {
51420       return (
51421           object_toString(exception) === "[object StopIteration]" ||
51422           exception instanceof QReturnValue
51423       );
51424   }
51425
51426   // FIXME: Remove this helper and Q.return once ES6 generators are in
51427   // SpiderMonkey.
51428   var QReturnValue;
51429   if (typeof ReturnValue !== "undefined") {
51430       QReturnValue = ReturnValue;
51431   } else {
51432       QReturnValue = function (value) {
51433           this.value = value;
51434       };
51435   }
51436
51437   // long stack traces
51438
51439   var STACK_JUMP_SEPARATOR = "From previous event:";
51440
51441   function makeStackTraceLong(error, promise) {
51442       // If possible, transform the error stack trace by removing Node and Q
51443       // cruft, then concatenating with the stack trace of `promise`. See #57.
51444       if (hasStacks &&
51445           promise.stack &&
51446           typeof error === "object" &&
51447           error !== null &&
51448           error.stack
51449       ) {
51450           var stacks = [];
51451           for (var p = promise; !!p; p = p.source) {
51452               if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
51453                   object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
51454                   stacks.unshift(p.stack);
51455               }
51456           }
51457           stacks.unshift(error.stack);
51458
51459           var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
51460           var stack = filterStackString(concatedStacks);
51461           object_defineProperty(error, "stack", {value: stack, configurable: true});
51462       }
51463   }
51464
51465   function filterStackString(stackString) {
51466       var lines = stackString.split("\n");
51467       var desiredLines = [];
51468       for (var i = 0; i < lines.length; ++i) {
51469           var line = lines[i];
51470
51471           if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
51472               desiredLines.push(line);
51473           }
51474       }
51475       return desiredLines.join("\n");
51476   }
51477
51478   function isNodeFrame(stackLine) {
51479       return stackLine.indexOf("(module.js:") !== -1 ||
51480              stackLine.indexOf("(node.js:") !== -1;
51481   }
51482
51483   function getFileNameAndLineNumber(stackLine) {
51484       // Named functions: "at functionName (filename:lineNumber:columnNumber)"
51485       // In IE10 function name can have spaces ("Anonymous function") O_o
51486       var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
51487       if (attempt1) {
51488           return [attempt1[1], Number(attempt1[2])];
51489       }
51490
51491       // Anonymous functions: "at filename:lineNumber:columnNumber"
51492       var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
51493       if (attempt2) {
51494           return [attempt2[1], Number(attempt2[2])];
51495       }
51496
51497       // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
51498       var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
51499       if (attempt3) {
51500           return [attempt3[1], Number(attempt3[2])];
51501       }
51502   }
51503
51504   function isInternalFrame(stackLine) {
51505       var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
51506
51507       if (!fileNameAndLineNumber) {
51508           return false;
51509       }
51510
51511       var fileName = fileNameAndLineNumber[0];
51512       var lineNumber = fileNameAndLineNumber[1];
51513
51514       return fileName === qFileName &&
51515           lineNumber >= qStartingLine &&
51516           lineNumber <= qEndingLine;
51517   }
51518
51519   // discover own file name and line number range for filtering stack
51520   // traces
51521   function captureLine() {
51522       if (!hasStacks) {
51523           return;
51524       }
51525
51526       try {
51527           throw new Error();
51528       } catch (e) {
51529           var lines = e.stack.split("\n");
51530           var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
51531           var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
51532           if (!fileNameAndLineNumber) {
51533               return;
51534           }
51535
51536           qFileName = fileNameAndLineNumber[0];
51537           return fileNameAndLineNumber[1];
51538       }
51539   }
51540
51541   function deprecate(callback, name, alternative) {
51542       return function () {
51543           if (typeof console !== "undefined" &&
51544               typeof console.warn === "function") {
51545               console.warn(name + " is deprecated, use " + alternative +
51546                            " instead.", new Error("").stack);
51547           }
51548           return callback.apply(callback, arguments);
51549       };
51550   }
51551
51552   // end of shims
51553   // beginning of real work
51554
51555   /**
51556    * Constructs a promise for an immediate reference, passes promises through, or
51557    * coerces promises from different systems.
51558    * @param value immediate reference or promise
51559    */
51560   function Q(value) {
51561       // If the object is already a Promise, return it directly.  This enables
51562       // the resolve function to both be used to created references from objects,
51563       // but to tolerably coerce non-promises to promises.
51564       if (value instanceof Promise) {
51565           return value;
51566       }
51567
51568       // assimilate thenables
51569       if (isPromiseAlike(value)) {
51570           return coerce(value);
51571       } else {
51572           return fulfill(value);
51573       }
51574   }
51575   Q.resolve = Q;
51576
51577   /**
51578    * Performs a task in a future turn of the event loop.
51579    * @param {Function} task
51580    */
51581   Q.nextTick = nextTick;
51582
51583   /**
51584    * Controls whether or not long stack traces will be on
51585    */
51586   Q.longStackSupport = false;
51587
51588   /**
51589    * The counter is used to determine the stopping point for building
51590    * long stack traces. In makeStackTraceLong we walk backwards through
51591    * the linked list of promises, only stacks which were created before
51592    * the rejection are concatenated.
51593    */
51594   var longStackCounter = 1;
51595
51596   // enable long stacks if Q_DEBUG is set
51597   if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
51598       Q.longStackSupport = true;
51599   }
51600
51601   /**
51602    * Constructs a {promise, resolve, reject} object.
51603    *
51604    * `resolve` is a callback to invoke with a more resolved value for the
51605    * promise. To fulfill the promise, invoke `resolve` with any value that is
51606    * not a thenable. To reject the promise, invoke `resolve` with a rejected
51607    * thenable, or invoke `reject` with the reason directly. To resolve the
51608    * promise to another thenable, thus putting it in the same state, invoke
51609    * `resolve` with that other thenable.
51610    */
51611   Q.defer = defer;
51612   function defer() {
51613       // if "messages" is an "Array", that indicates that the promise has not yet
51614       // been resolved.  If it is "undefined", it has been resolved.  Each
51615       // element of the messages array is itself an array of complete arguments to
51616       // forward to the resolved promise.  We coerce the resolution value to a
51617       // promise using the `resolve` function because it handles both fully
51618       // non-thenable values and other thenables gracefully.
51619       var messages = [], progressListeners = [], resolvedPromise;
51620
51621       var deferred = object_create(defer.prototype);
51622       var promise = object_create(Promise.prototype);
51623
51624       promise.promiseDispatch = function (resolve, op, operands) {
51625           var args = array_slice(arguments);
51626           if (messages) {
51627               messages.push(args);
51628               if (op === "when" && operands[1]) { // progress operand
51629                   progressListeners.push(operands[1]);
51630               }
51631           } else {
51632               Q.nextTick(function () {
51633                   resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
51634               });
51635           }
51636       };
51637
51638       // XXX deprecated
51639       promise.valueOf = function () {
51640           if (messages) {
51641               return promise;
51642           }
51643           var nearerValue = nearer(resolvedPromise);
51644           if (isPromise(nearerValue)) {
51645               resolvedPromise = nearerValue; // shorten chain
51646           }
51647           return nearerValue;
51648       };
51649
51650       promise.inspect = function () {
51651           if (!resolvedPromise) {
51652               return { state: "pending" };
51653           }
51654           return resolvedPromise.inspect();
51655       };
51656
51657       if (Q.longStackSupport && hasStacks) {
51658           try {
51659               throw new Error();
51660           } catch (e) {
51661               // NOTE: don't try to use `Error.captureStackTrace` or transfer the
51662               // accessor around; that causes memory leaks as per GH-111. Just
51663               // reify the stack trace as a string ASAP.
51664               //
51665               // At the same time, cut off the first line; it's always just
51666               // "[object Promise]\n", as per the `toString`.
51667               promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
51668               promise.stackCounter = longStackCounter++;
51669           }
51670       }
51671
51672       // NOTE: we do the checks for `resolvedPromise` in each method, instead of
51673       // consolidating them into `become`, since otherwise we'd create new
51674       // promises with the lines `become(whatever(value))`. See e.g. GH-252.
51675
51676       function become(newPromise) {
51677           resolvedPromise = newPromise;
51678
51679           if (Q.longStackSupport && hasStacks) {
51680               // Only hold a reference to the new promise if long stacks
51681               // are enabled to reduce memory usage
51682               promise.source = newPromise;
51683           }
51684
51685           array_reduce(messages, function (undefined$1, message) {
51686               Q.nextTick(function () {
51687                   newPromise.promiseDispatch.apply(newPromise, message);
51688               });
51689           }, void 0);
51690
51691           messages = void 0;
51692           progressListeners = void 0;
51693       }
51694
51695       deferred.promise = promise;
51696       deferred.resolve = function (value) {
51697           if (resolvedPromise) {
51698               return;
51699           }
51700
51701           become(Q(value));
51702       };
51703
51704       deferred.fulfill = function (value) {
51705           if (resolvedPromise) {
51706               return;
51707           }
51708
51709           become(fulfill(value));
51710       };
51711       deferred.reject = function (reason) {
51712           if (resolvedPromise) {
51713               return;
51714           }
51715
51716           become(reject(reason));
51717       };
51718       deferred.notify = function (progress) {
51719           if (resolvedPromise) {
51720               return;
51721           }
51722
51723           array_reduce(progressListeners, function (undefined$1, progressListener) {
51724               Q.nextTick(function () {
51725                   progressListener(progress);
51726               });
51727           }, void 0);
51728       };
51729
51730       return deferred;
51731   }
51732
51733   /**
51734    * Creates a Node-style callback that will resolve or reject the deferred
51735    * promise.
51736    * @returns a nodeback
51737    */
51738   defer.prototype.makeNodeResolver = function () {
51739       var self = this;
51740       return function (error, value) {
51741           if (error) {
51742               self.reject(error);
51743           } else if (arguments.length > 2) {
51744               self.resolve(array_slice(arguments, 1));
51745           } else {
51746               self.resolve(value);
51747           }
51748       };
51749   };
51750
51751   /**
51752    * @param resolver {Function} a function that returns nothing and accepts
51753    * the resolve, reject, and notify functions for a deferred.
51754    * @returns a promise that may be resolved with the given resolve and reject
51755    * functions, or rejected by a thrown exception in resolver
51756    */
51757   Q.Promise = promise; // ES6
51758   Q.promise = promise;
51759   function promise(resolver) {
51760       if (typeof resolver !== "function") {
51761           throw new TypeError("resolver must be a function.");
51762       }
51763       var deferred = defer();
51764       try {
51765           resolver(deferred.resolve, deferred.reject, deferred.notify);
51766       } catch (reason) {
51767           deferred.reject(reason);
51768       }
51769       return deferred.promise;
51770   }
51771
51772   promise.race = race; // ES6
51773   promise.all = all; // ES6
51774   promise.reject = reject; // ES6
51775   promise.resolve = Q; // ES6
51776
51777   // XXX experimental.  This method is a way to denote that a local value is
51778   // serializable and should be immediately dispatched to a remote upon request,
51779   // instead of passing a reference.
51780   Q.passByCopy = function (object) {
51781       //freeze(object);
51782       //passByCopies.set(object, true);
51783       return object;
51784   };
51785
51786   Promise.prototype.passByCopy = function () {
51787       //freeze(object);
51788       //passByCopies.set(object, true);
51789       return this;
51790   };
51791
51792   /**
51793    * If two promises eventually fulfill to the same value, promises that value,
51794    * but otherwise rejects.
51795    * @param x {Any*}
51796    * @param y {Any*}
51797    * @returns {Any*} a promise for x and y if they are the same, but a rejection
51798    * otherwise.
51799    *
51800    */
51801   Q.join = function (x, y) {
51802       return Q(x).join(y);
51803   };
51804
51805   Promise.prototype.join = function (that) {
51806       return Q([this, that]).spread(function (x, y) {
51807           if (x === y) {
51808               // TODO: "===" should be Object.is or equiv
51809               return x;
51810           } else {
51811               throw new Error("Q can't join: not the same: " + x + " " + y);
51812           }
51813       });
51814   };
51815
51816   /**
51817    * Returns a promise for the first of an array of promises to become settled.
51818    * @param answers {Array[Any*]} promises to race
51819    * @returns {Any*} the first promise to be settled
51820    */
51821   Q.race = race;
51822   function race(answerPs) {
51823       return promise(function (resolve, reject) {
51824           // Switch to this once we can assume at least ES5
51825           // answerPs.forEach(function (answerP) {
51826           //     Q(answerP).then(resolve, reject);
51827           // });
51828           // Use this in the meantime
51829           for (var i = 0, len = answerPs.length; i < len; i++) {
51830               Q(answerPs[i]).then(resolve, reject);
51831           }
51832       });
51833   }
51834
51835   Promise.prototype.race = function () {
51836       return this.then(Q.race);
51837   };
51838
51839   /**
51840    * Constructs a Promise with a promise descriptor object and optional fallback
51841    * function.  The descriptor contains methods like when(rejected), get(name),
51842    * set(name, value), post(name, args), and delete(name), which all
51843    * return either a value, a promise for a value, or a rejection.  The fallback
51844    * accepts the operation name, a resolver, and any further arguments that would
51845    * have been forwarded to the appropriate method above had a method been
51846    * provided with the proper name.  The API makes no guarantees about the nature
51847    * of the returned object, apart from that it is usable whereever promises are
51848    * bought and sold.
51849    */
51850   Q.makePromise = Promise;
51851   function Promise(descriptor, fallback, inspect) {
51852       if (fallback === void 0) {
51853           fallback = function (op) {
51854               return reject(new Error(
51855                   "Promise does not support operation: " + op
51856               ));
51857           };
51858       }
51859       if (inspect === void 0) {
51860           inspect = function () {
51861               return {state: "unknown"};
51862           };
51863       }
51864
51865       var promise = object_create(Promise.prototype);
51866
51867       promise.promiseDispatch = function (resolve, op, args) {
51868           var result;
51869           try {
51870               if (descriptor[op]) {
51871                   result = descriptor[op].apply(promise, args);
51872               } else {
51873                   result = fallback.call(promise, op, args);
51874               }
51875           } catch (exception) {
51876               result = reject(exception);
51877           }
51878           if (resolve) {
51879               resolve(result);
51880           }
51881       };
51882
51883       promise.inspect = inspect;
51884
51885       // XXX deprecated `valueOf` and `exception` support
51886       if (inspect) {
51887           var inspected = inspect();
51888           if (inspected.state === "rejected") {
51889               promise.exception = inspected.reason;
51890           }
51891
51892           promise.valueOf = function () {
51893               var inspected = inspect();
51894               if (inspected.state === "pending" ||
51895                   inspected.state === "rejected") {
51896                   return promise;
51897               }
51898               return inspected.value;
51899           };
51900       }
51901
51902       return promise;
51903   }
51904
51905   Promise.prototype.toString = function () {
51906       return "[object Promise]";
51907   };
51908
51909   Promise.prototype.then = function (fulfilled, rejected, progressed) {
51910       var self = this;
51911       var deferred = defer();
51912       var done = false;   // ensure the untrusted promise makes at most a
51913                           // single call to one of the callbacks
51914
51915       function _fulfilled(value) {
51916           try {
51917               return typeof fulfilled === "function" ? fulfilled(value) : value;
51918           } catch (exception) {
51919               return reject(exception);
51920           }
51921       }
51922
51923       function _rejected(exception) {
51924           if (typeof rejected === "function") {
51925               makeStackTraceLong(exception, self);
51926               try {
51927                   return rejected(exception);
51928               } catch (newException) {
51929                   return reject(newException);
51930               }
51931           }
51932           return reject(exception);
51933       }
51934
51935       function _progressed(value) {
51936           return typeof progressed === "function" ? progressed(value) : value;
51937       }
51938
51939       Q.nextTick(function () {
51940           self.promiseDispatch(function (value) {
51941               if (done) {
51942                   return;
51943               }
51944               done = true;
51945
51946               deferred.resolve(_fulfilled(value));
51947           }, "when", [function (exception) {
51948               if (done) {
51949                   return;
51950               }
51951               done = true;
51952
51953               deferred.resolve(_rejected(exception));
51954           }]);
51955       });
51956
51957       // Progress propagator need to be attached in the current tick.
51958       self.promiseDispatch(void 0, "when", [void 0, function (value) {
51959           var newValue;
51960           var threw = false;
51961           try {
51962               newValue = _progressed(value);
51963           } catch (e) {
51964               threw = true;
51965               if (Q.onerror) {
51966                   Q.onerror(e);
51967               } else {
51968                   throw e;
51969               }
51970           }
51971
51972           if (!threw) {
51973               deferred.notify(newValue);
51974           }
51975       }]);
51976
51977       return deferred.promise;
51978   };
51979
51980   Q.tap = function (promise, callback) {
51981       return Q(promise).tap(callback);
51982   };
51983
51984   /**
51985    * Works almost like "finally", but not called for rejections.
51986    * Original resolution value is passed through callback unaffected.
51987    * Callback may return a promise that will be awaited for.
51988    * @param {Function} callback
51989    * @returns {Q.Promise}
51990    * @example
51991    * doSomething()
51992    *   .then(...)
51993    *   .tap(console.log)
51994    *   .then(...);
51995    */
51996   Promise.prototype.tap = function (callback) {
51997       callback = Q(callback);
51998
51999       return this.then(function (value) {
52000           return callback.fcall(value).thenResolve(value);
52001       });
52002   };
52003
52004   /**
52005    * Registers an observer on a promise.
52006    *
52007    * Guarantees:
52008    *
52009    * 1. that fulfilled and rejected will be called only once.
52010    * 2. that either the fulfilled callback or the rejected callback will be
52011    *    called, but not both.
52012    * 3. that fulfilled and rejected will not be called in this turn.
52013    *
52014    * @param value      promise or immediate reference to observe
52015    * @param fulfilled  function to be called with the fulfilled value
52016    * @param rejected   function to be called with the rejection exception
52017    * @param progressed function to be called on any progress notifications
52018    * @return promise for the return value from the invoked callback
52019    */
52020   Q.when = when;
52021   function when(value, fulfilled, rejected, progressed) {
52022       return Q(value).then(fulfilled, rejected, progressed);
52023   }
52024
52025   Promise.prototype.thenResolve = function (value) {
52026       return this.then(function () { return value; });
52027   };
52028
52029   Q.thenResolve = function (promise, value) {
52030       return Q(promise).thenResolve(value);
52031   };
52032
52033   Promise.prototype.thenReject = function (reason) {
52034       return this.then(function () { throw reason; });
52035   };
52036
52037   Q.thenReject = function (promise, reason) {
52038       return Q(promise).thenReject(reason);
52039   };
52040
52041   /**
52042    * If an object is not a promise, it is as "near" as possible.
52043    * If a promise is rejected, it is as "near" as possible too.
52044    * If it’s a fulfilled promise, the fulfillment value is nearer.
52045    * If it’s a deferred promise and the deferred has been resolved, the
52046    * resolution is "nearer".
52047    * @param object
52048    * @returns most resolved (nearest) form of the object
52049    */
52050
52051   // XXX should we re-do this?
52052   Q.nearer = nearer;
52053   function nearer(value) {
52054       if (isPromise(value)) {
52055           var inspected = value.inspect();
52056           if (inspected.state === "fulfilled") {
52057               return inspected.value;
52058           }
52059       }
52060       return value;
52061   }
52062
52063   /**
52064    * @returns whether the given object is a promise.
52065    * Otherwise it is a fulfilled value.
52066    */
52067   Q.isPromise = isPromise;
52068   function isPromise(object) {
52069       return object instanceof Promise;
52070   }
52071
52072   Q.isPromiseAlike = isPromiseAlike;
52073   function isPromiseAlike(object) {
52074       return isObject(object) && typeof object.then === "function";
52075   }
52076
52077   /**
52078    * @returns whether the given object is a pending promise, meaning not
52079    * fulfilled or rejected.
52080    */
52081   Q.isPending = isPending;
52082   function isPending(object) {
52083       return isPromise(object) && object.inspect().state === "pending";
52084   }
52085
52086   Promise.prototype.isPending = function () {
52087       return this.inspect().state === "pending";
52088   };
52089
52090   /**
52091    * @returns whether the given object is a value or fulfilled
52092    * promise.
52093    */
52094   Q.isFulfilled = isFulfilled;
52095   function isFulfilled(object) {
52096       return !isPromise(object) || object.inspect().state === "fulfilled";
52097   }
52098
52099   Promise.prototype.isFulfilled = function () {
52100       return this.inspect().state === "fulfilled";
52101   };
52102
52103   /**
52104    * @returns whether the given object is a rejected promise.
52105    */
52106   Q.isRejected = isRejected;
52107   function isRejected(object) {
52108       return isPromise(object) && object.inspect().state === "rejected";
52109   }
52110
52111   Promise.prototype.isRejected = function () {
52112       return this.inspect().state === "rejected";
52113   };
52114
52115   //// BEGIN UNHANDLED REJECTION TRACKING
52116
52117   // This promise library consumes exceptions thrown in handlers so they can be
52118   // handled by a subsequent promise.  The exceptions get added to this array when
52119   // they are created, and removed when they are handled.  Note that in ES6 or
52120   // shimmed environments, this would naturally be a `Set`.
52121   var unhandledReasons = [];
52122   var unhandledRejections = [];
52123   var reportedUnhandledRejections = [];
52124   var trackUnhandledRejections = true;
52125
52126   function resetUnhandledRejections() {
52127       unhandledReasons.length = 0;
52128       unhandledRejections.length = 0;
52129
52130       if (!trackUnhandledRejections) {
52131           trackUnhandledRejections = true;
52132       }
52133   }
52134
52135   function trackRejection(promise, reason) {
52136       if (!trackUnhandledRejections) {
52137           return;
52138       }
52139       if (typeof process === "object" && typeof process.emit === "function") {
52140           Q.nextTick.runAfter(function () {
52141               if (array_indexOf(unhandledRejections, promise) !== -1) {
52142                   process.emit("unhandledRejection", reason, promise);
52143                   reportedUnhandledRejections.push(promise);
52144               }
52145           });
52146       }
52147
52148       unhandledRejections.push(promise);
52149       if (reason && typeof reason.stack !== "undefined") {
52150           unhandledReasons.push(reason.stack);
52151       } else {
52152           unhandledReasons.push("(no stack) " + reason);
52153       }
52154   }
52155
52156   function untrackRejection(promise) {
52157       if (!trackUnhandledRejections) {
52158           return;
52159       }
52160
52161       var at = array_indexOf(unhandledRejections, promise);
52162       if (at !== -1) {
52163           if (typeof process === "object" && typeof process.emit === "function") {
52164               Q.nextTick.runAfter(function () {
52165                   var atReport = array_indexOf(reportedUnhandledRejections, promise);
52166                   if (atReport !== -1) {
52167                       process.emit("rejectionHandled", unhandledReasons[at], promise);
52168                       reportedUnhandledRejections.splice(atReport, 1);
52169                   }
52170               });
52171           }
52172           unhandledRejections.splice(at, 1);
52173           unhandledReasons.splice(at, 1);
52174       }
52175   }
52176
52177   Q.resetUnhandledRejections = resetUnhandledRejections;
52178
52179   Q.getUnhandledReasons = function () {
52180       // Make a copy so that consumers can't interfere with our internal state.
52181       return unhandledReasons.slice();
52182   };
52183
52184   Q.stopUnhandledRejectionTracking = function () {
52185       resetUnhandledRejections();
52186       trackUnhandledRejections = false;
52187   };
52188
52189   resetUnhandledRejections();
52190
52191   //// END UNHANDLED REJECTION TRACKING
52192
52193   /**
52194    * Constructs a rejected promise.
52195    * @param reason value describing the failure
52196    */
52197   Q.reject = reject;
52198   function reject(reason) {
52199       var rejection = Promise({
52200           "when": function (rejected) {
52201               // note that the error has been handled
52202               if (rejected) {
52203                   untrackRejection(this);
52204               }
52205               return rejected ? rejected(reason) : this;
52206           }
52207       }, function fallback() {
52208           return this;
52209       }, function inspect() {
52210           return { state: "rejected", reason: reason };
52211       });
52212
52213       // Note that the reason has not been handled.
52214       trackRejection(rejection, reason);
52215
52216       return rejection;
52217   }
52218
52219   /**
52220    * Constructs a fulfilled promise for an immediate reference.
52221    * @param value immediate reference
52222    */
52223   Q.fulfill = fulfill;
52224   function fulfill(value) {
52225       return Promise({
52226           "when": function () {
52227               return value;
52228           },
52229           "get": function (name) {
52230               return value[name];
52231           },
52232           "set": function (name, rhs) {
52233               value[name] = rhs;
52234           },
52235           "delete": function (name) {
52236               delete value[name];
52237           },
52238           "post": function (name, args) {
52239               // Mark Miller proposes that post with no name should apply a
52240               // promised function.
52241               if (name === null || name === void 0) {
52242                   return value.apply(void 0, args);
52243               } else {
52244                   return value[name].apply(value, args);
52245               }
52246           },
52247           "apply": function (thisp, args) {
52248               return value.apply(thisp, args);
52249           },
52250           "keys": function () {
52251               return object_keys(value);
52252           }
52253       }, void 0, function inspect() {
52254           return { state: "fulfilled", value: value };
52255       });
52256   }
52257
52258   /**
52259    * Converts thenables to Q promises.
52260    * @param promise thenable promise
52261    * @returns a Q promise
52262    */
52263   function coerce(promise) {
52264       var deferred = defer();
52265       Q.nextTick(function () {
52266           try {
52267               promise.then(deferred.resolve, deferred.reject, deferred.notify);
52268           } catch (exception) {
52269               deferred.reject(exception);
52270           }
52271       });
52272       return deferred.promise;
52273   }
52274
52275   /**
52276    * Annotates an object such that it will never be
52277    * transferred away from this process over any promise
52278    * communication channel.
52279    * @param object
52280    * @returns promise a wrapping of that object that
52281    * additionally responds to the "isDef" message
52282    * without a rejection.
52283    */
52284   Q.master = master;
52285   function master(object) {
52286       return Promise({
52287           "isDef": function () {}
52288       }, function fallback(op, args) {
52289           return dispatch(object, op, args);
52290       }, function () {
52291           return Q(object).inspect();
52292       });
52293   }
52294
52295   /**
52296    * Spreads the values of a promised array of arguments into the
52297    * fulfillment callback.
52298    * @param fulfilled callback that receives variadic arguments from the
52299    * promised array
52300    * @param rejected callback that receives the exception if the promise
52301    * is rejected.
52302    * @returns a promise for the return value or thrown exception of
52303    * either callback.
52304    */
52305   Q.spread = spread;
52306   function spread(value, fulfilled, rejected) {
52307       return Q(value).spread(fulfilled, rejected);
52308   }
52309
52310   Promise.prototype.spread = function (fulfilled, rejected) {
52311       return this.all().then(function (array) {
52312           return fulfilled.apply(void 0, array);
52313       }, rejected);
52314   };
52315
52316   /**
52317    * The async function is a decorator for generator functions, turning
52318    * them into asynchronous generators.  Although generators are only part
52319    * of the newest ECMAScript 6 drafts, this code does not cause syntax
52320    * errors in older engines.  This code should continue to work and will
52321    * in fact improve over time as the language improves.
52322    *
52323    * ES6 generators are currently part of V8 version 3.19 with the
52324    * --harmony-generators runtime flag enabled.  SpiderMonkey has had them
52325    * for longer, but under an older Python-inspired form.  This function
52326    * works on both kinds of generators.
52327    *
52328    * Decorates a generator function such that:
52329    *  - it may yield promises
52330    *  - execution will continue when that promise is fulfilled
52331    *  - the value of the yield expression will be the fulfilled value
52332    *  - it returns a promise for the return value (when the generator
52333    *    stops iterating)
52334    *  - the decorated function returns a promise for the return value
52335    *    of the generator or the first rejected promise among those
52336    *    yielded.
52337    *  - if an error is thrown in the generator, it propagates through
52338    *    every following yield until it is caught, or until it escapes
52339    *    the generator function altogether, and is translated into a
52340    *    rejection for the promise returned by the decorated generator.
52341    */
52342   Q.async = async;
52343   function async(makeGenerator) {
52344       return function () {
52345           // when verb is "send", arg is a value
52346           // when verb is "throw", arg is an exception
52347           function continuer(verb, arg) {
52348               var result;
52349
52350               // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
52351               // engine that has a deployed base of browsers that support generators.
52352               // However, SM's generators use the Python-inspired semantics of
52353               // outdated ES6 drafts.  We would like to support ES6, but we'd also
52354               // like to make it possible to use generators in deployed browsers, so
52355               // we also support Python-style generators.  At some point we can remove
52356               // this block.
52357
52358               if (typeof StopIteration === "undefined") {
52359                   // ES6 Generators
52360                   try {
52361                       result = generator[verb](arg);
52362                   } catch (exception) {
52363                       return reject(exception);
52364                   }
52365                   if (result.done) {
52366                       return Q(result.value);
52367                   } else {
52368                       return when(result.value, callback, errback);
52369                   }
52370               } else {
52371                   // SpiderMonkey Generators
52372                   // FIXME: Remove this case when SM does ES6 generators.
52373                   try {
52374                       result = generator[verb](arg);
52375                   } catch (exception) {
52376                       if (isStopIteration(exception)) {
52377                           return Q(exception.value);
52378                       } else {
52379                           return reject(exception);
52380                       }
52381                   }
52382                   return when(result, callback, errback);
52383               }
52384           }
52385           var generator = makeGenerator.apply(this, arguments);
52386           var callback = continuer.bind(continuer, "next");
52387           var errback = continuer.bind(continuer, "throw");
52388           return callback();
52389       };
52390   }
52391
52392   /**
52393    * The spawn function is a small wrapper around async that immediately
52394    * calls the generator and also ends the promise chain, so that any
52395    * unhandled errors are thrown instead of forwarded to the error
52396    * handler. This is useful because it's extremely common to run
52397    * generators at the top-level to work with libraries.
52398    */
52399   Q.spawn = spawn;
52400   function spawn(makeGenerator) {
52401       Q.done(Q.async(makeGenerator)());
52402   }
52403
52404   // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
52405   /**
52406    * Throws a ReturnValue exception to stop an asynchronous generator.
52407    *
52408    * This interface is a stop-gap measure to support generator return
52409    * values in older Firefox/SpiderMonkey.  In browsers that support ES6
52410    * generators like Chromium 29, just use "return" in your generator
52411    * functions.
52412    *
52413    * @param value the return value for the surrounding generator
52414    * @throws ReturnValue exception with the value.
52415    * @example
52416    * // ES6 style
52417    * Q.async(function* () {
52418    *      var foo = yield getFooPromise();
52419    *      var bar = yield getBarPromise();
52420    *      return foo + bar;
52421    * })
52422    * // Older SpiderMonkey style
52423    * Q.async(function () {
52424    *      var foo = yield getFooPromise();
52425    *      var bar = yield getBarPromise();
52426    *      Q.return(foo + bar);
52427    * })
52428    */
52429   Q["return"] = _return;
52430   function _return(value) {
52431       throw new QReturnValue(value);
52432   }
52433
52434   /**
52435    * The promised function decorator ensures that any promise arguments
52436    * are settled and passed as values (`this` is also settled and passed
52437    * as a value).  It will also ensure that the result of a function is
52438    * always a promise.
52439    *
52440    * @example
52441    * var add = Q.promised(function (a, b) {
52442    *     return a + b;
52443    * });
52444    * add(Q(a), Q(B));
52445    *
52446    * @param {function} callback The function to decorate
52447    * @returns {function} a function that has been decorated.
52448    */
52449   Q.promised = promised;
52450   function promised(callback) {
52451       return function () {
52452           return spread([this, all(arguments)], function (self, args) {
52453               return callback.apply(self, args);
52454           });
52455       };
52456   }
52457
52458   /**
52459    * sends a message to a value in a future turn
52460    * @param object* the recipient
52461    * @param op the name of the message operation, e.g., "when",
52462    * @param args further arguments to be forwarded to the operation
52463    * @returns result {Promise} a promise for the result of the operation
52464    */
52465   Q.dispatch = dispatch;
52466   function dispatch(object, op, args) {
52467       return Q(object).dispatch(op, args);
52468   }
52469
52470   Promise.prototype.dispatch = function (op, args) {
52471       var self = this;
52472       var deferred = defer();
52473       Q.nextTick(function () {
52474           self.promiseDispatch(deferred.resolve, op, args);
52475       });
52476       return deferred.promise;
52477   };
52478
52479   /**
52480    * Gets the value of a property in a future turn.
52481    * @param object    promise or immediate reference for target object
52482    * @param name      name of property to get
52483    * @return promise for the property value
52484    */
52485   Q.get = function (object, key) {
52486       return Q(object).dispatch("get", [key]);
52487   };
52488
52489   Promise.prototype.get = function (key) {
52490       return this.dispatch("get", [key]);
52491   };
52492
52493   /**
52494    * Sets the value of a property in a future turn.
52495    * @param object    promise or immediate reference for object object
52496    * @param name      name of property to set
52497    * @param value     new value of property
52498    * @return promise for the return value
52499    */
52500   Q.set = function (object, key, value) {
52501       return Q(object).dispatch("set", [key, value]);
52502   };
52503
52504   Promise.prototype.set = function (key, value) {
52505       return this.dispatch("set", [key, value]);
52506   };
52507
52508   /**
52509    * Deletes a property in a future turn.
52510    * @param object    promise or immediate reference for target object
52511    * @param name      name of property to delete
52512    * @return promise for the return value
52513    */
52514   Q.del = // XXX legacy
52515   Q["delete"] = function (object, key) {
52516       return Q(object).dispatch("delete", [key]);
52517   };
52518
52519   Promise.prototype.del = // XXX legacy
52520   Promise.prototype["delete"] = function (key) {
52521       return this.dispatch("delete", [key]);
52522   };
52523
52524   /**
52525    * Invokes a method in a future turn.
52526    * @param object    promise or immediate reference for target object
52527    * @param name      name of method to invoke
52528    * @param value     a value to post, typically an array of
52529    *                  invocation arguments for promises that
52530    *                  are ultimately backed with `resolve` values,
52531    *                  as opposed to those backed with URLs
52532    *                  wherein the posted value can be any
52533    *                  JSON serializable object.
52534    * @return promise for the return value
52535    */
52536   // bound locally because it is used by other methods
52537   Q.mapply = // XXX As proposed by "Redsandro"
52538   Q.post = function (object, name, args) {
52539       return Q(object).dispatch("post", [name, args]);
52540   };
52541
52542   Promise.prototype.mapply = // XXX As proposed by "Redsandro"
52543   Promise.prototype.post = function (name, args) {
52544       return this.dispatch("post", [name, args]);
52545   };
52546
52547   /**
52548    * Invokes a method in a future turn.
52549    * @param object    promise or immediate reference for target object
52550    * @param name      name of method to invoke
52551    * @param ...args   array of invocation arguments
52552    * @return promise for the return value
52553    */
52554   Q.send = // XXX Mark Miller's proposed parlance
52555   Q.mcall = // XXX As proposed by "Redsandro"
52556   Q.invoke = function (object, name /*...args*/) {
52557       return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
52558   };
52559
52560   Promise.prototype.send = // XXX Mark Miller's proposed parlance
52561   Promise.prototype.mcall = // XXX As proposed by "Redsandro"
52562   Promise.prototype.invoke = function (name /*...args*/) {
52563       return this.dispatch("post", [name, array_slice(arguments, 1)]);
52564   };
52565
52566   /**
52567    * Applies the promised function in a future turn.
52568    * @param object    promise or immediate reference for target function
52569    * @param args      array of application arguments
52570    */
52571   Q.fapply = function (object, args) {
52572       return Q(object).dispatch("apply", [void 0, args]);
52573   };
52574
52575   Promise.prototype.fapply = function (args) {
52576       return this.dispatch("apply", [void 0, args]);
52577   };
52578
52579   /**
52580    * Calls the promised function in a future turn.
52581    * @param object    promise or immediate reference for target function
52582    * @param ...args   array of application arguments
52583    */
52584   Q["try"] =
52585   Q.fcall = function (object /* ...args*/) {
52586       return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
52587   };
52588
52589   Promise.prototype.fcall = function (/*...args*/) {
52590       return this.dispatch("apply", [void 0, array_slice(arguments)]);
52591   };
52592
52593   /**
52594    * Binds the promised function, transforming return values into a fulfilled
52595    * promise and thrown errors into a rejected one.
52596    * @param object    promise or immediate reference for target function
52597    * @param ...args   array of application arguments
52598    */
52599   Q.fbind = function (object /*...args*/) {
52600       var promise = Q(object);
52601       var args = array_slice(arguments, 1);
52602       return function fbound() {
52603           return promise.dispatch("apply", [
52604               this,
52605               args.concat(array_slice(arguments))
52606           ]);
52607       };
52608   };
52609   Promise.prototype.fbind = function (/*...args*/) {
52610       var promise = this;
52611       var args = array_slice(arguments);
52612       return function fbound() {
52613           return promise.dispatch("apply", [
52614               this,
52615               args.concat(array_slice(arguments))
52616           ]);
52617       };
52618   };
52619
52620   /**
52621    * Requests the names of the owned properties of a promised
52622    * object in a future turn.
52623    * @param object    promise or immediate reference for target object
52624    * @return promise for the keys of the eventually settled object
52625    */
52626   Q.keys = function (object) {
52627       return Q(object).dispatch("keys", []);
52628   };
52629
52630   Promise.prototype.keys = function () {
52631       return this.dispatch("keys", []);
52632   };
52633
52634   /**
52635    * Turns an array of promises into a promise for an array.  If any of
52636    * the promises gets rejected, the whole array is rejected immediately.
52637    * @param {Array*} an array (or promise for an array) of values (or
52638    * promises for values)
52639    * @returns a promise for an array of the corresponding values
52640    */
52641   // By Mark Miller
52642   // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
52643   Q.all = all;
52644   function all(promises) {
52645       return when(promises, function (promises) {
52646           var pendingCount = 0;
52647           var deferred = defer();
52648           array_reduce(promises, function (undefined$1, promise, index) {
52649               var snapshot;
52650               if (
52651                   isPromise(promise) &&
52652                   (snapshot = promise.inspect()).state === "fulfilled"
52653               ) {
52654                   promises[index] = snapshot.value;
52655               } else {
52656                   ++pendingCount;
52657                   when(
52658                       promise,
52659                       function (value) {
52660                           promises[index] = value;
52661                           if (--pendingCount === 0) {
52662                               deferred.resolve(promises);
52663                           }
52664                       },
52665                       deferred.reject,
52666                       function (progress) {
52667                           deferred.notify({ index: index, value: progress });
52668                       }
52669                   );
52670               }
52671           }, void 0);
52672           if (pendingCount === 0) {
52673               deferred.resolve(promises);
52674           }
52675           return deferred.promise;
52676       });
52677   }
52678
52679   Promise.prototype.all = function () {
52680       return all(this);
52681   };
52682
52683   /**
52684    * Returns the first resolved promise of an array. Prior rejected promises are
52685    * ignored.  Rejects only if all promises are rejected.
52686    * @param {Array*} an array containing values or promises for values
52687    * @returns a promise fulfilled with the value of the first resolved promise,
52688    * or a rejected promise if all promises are rejected.
52689    */
52690   Q.any = any;
52691
52692   function any(promises) {
52693       if (promises.length === 0) {
52694           return Q.resolve();
52695       }
52696
52697       var deferred = Q.defer();
52698       var pendingCount = 0;
52699       array_reduce(promises, function (prev, current, index) {
52700           var promise = promises[index];
52701
52702           pendingCount++;
52703
52704           when(promise, onFulfilled, onRejected, onProgress);
52705           function onFulfilled(result) {
52706               deferred.resolve(result);
52707           }
52708           function onRejected(err) {
52709               pendingCount--;
52710               if (pendingCount === 0) {
52711                   var rejection = err || new Error("" + err);
52712
52713                   rejection.message = ("Q can't get fulfillment value from any promise, all " +
52714                       "promises were rejected. Last error message: " + rejection.message);
52715
52716                   deferred.reject(rejection);
52717               }
52718           }
52719           function onProgress(progress) {
52720               deferred.notify({
52721                   index: index,
52722                   value: progress
52723               });
52724           }
52725       }, undefined);
52726
52727       return deferred.promise;
52728   }
52729
52730   Promise.prototype.any = function () {
52731       return any(this);
52732   };
52733
52734   /**
52735    * Waits for all promises to be settled, either fulfilled or
52736    * rejected.  This is distinct from `all` since that would stop
52737    * waiting at the first rejection.  The promise returned by
52738    * `allResolved` will never be rejected.
52739    * @param promises a promise for an array (or an array) of promises
52740    * (or values)
52741    * @return a promise for an array of promises
52742    */
52743   Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
52744   function allResolved(promises) {
52745       return when(promises, function (promises) {
52746           promises = array_map(promises, Q);
52747           return when(all(array_map(promises, function (promise) {
52748               return when(promise, noop, noop);
52749           })), function () {
52750               return promises;
52751           });
52752       });
52753   }
52754
52755   Promise.prototype.allResolved = function () {
52756       return allResolved(this);
52757   };
52758
52759   /**
52760    * @see Promise#allSettled
52761    */
52762   Q.allSettled = allSettled;
52763   function allSettled(promises) {
52764       return Q(promises).allSettled();
52765   }
52766
52767   /**
52768    * Turns an array of promises into a promise for an array of their states (as
52769    * returned by `inspect`) when they have all settled.
52770    * @param {Array[Any*]} values an array (or promise for an array) of values (or
52771    * promises for values)
52772    * @returns {Array[State]} an array of states for the respective values.
52773    */
52774   Promise.prototype.allSettled = function () {
52775       return this.then(function (promises) {
52776           return all(array_map(promises, function (promise) {
52777               promise = Q(promise);
52778               function regardless() {
52779                   return promise.inspect();
52780               }
52781               return promise.then(regardless, regardless);
52782           }));
52783       });
52784   };
52785
52786   /**
52787    * Captures the failure of a promise, giving an oportunity to recover
52788    * with a callback.  If the given promise is fulfilled, the returned
52789    * promise is fulfilled.
52790    * @param {Any*} promise for something
52791    * @param {Function} callback to fulfill the returned promise if the
52792    * given promise is rejected
52793    * @returns a promise for the return value of the callback
52794    */
52795   Q.fail = // XXX legacy
52796   Q["catch"] = function (object, rejected) {
52797       return Q(object).then(void 0, rejected);
52798   };
52799
52800   Promise.prototype.fail = // XXX legacy
52801   Promise.prototype["catch"] = function (rejected) {
52802       return this.then(void 0, rejected);
52803   };
52804
52805   /**
52806    * Attaches a listener that can respond to progress notifications from a
52807    * promise's originating deferred. This listener receives the exact arguments
52808    * passed to ``deferred.notify``.
52809    * @param {Any*} promise for something
52810    * @param {Function} callback to receive any progress notifications
52811    * @returns the given promise, unchanged
52812    */
52813   Q.progress = progress;
52814   function progress(object, progressed) {
52815       return Q(object).then(void 0, void 0, progressed);
52816   }
52817
52818   Promise.prototype.progress = function (progressed) {
52819       return this.then(void 0, void 0, progressed);
52820   };
52821
52822   /**
52823    * Provides an opportunity to observe the settling of a promise,
52824    * regardless of whether the promise is fulfilled or rejected.  Forwards
52825    * the resolution to the returned promise when the callback is done.
52826    * The callback can return a promise to defer completion.
52827    * @param {Any*} promise
52828    * @param {Function} callback to observe the resolution of the given
52829    * promise, takes no arguments.
52830    * @returns a promise for the resolution of the given promise when
52831    * ``fin`` is done.
52832    */
52833   Q.fin = // XXX legacy
52834   Q["finally"] = function (object, callback) {
52835       return Q(object)["finally"](callback);
52836   };
52837
52838   Promise.prototype.fin = // XXX legacy
52839   Promise.prototype["finally"] = function (callback) {
52840       if (!callback || typeof callback.apply !== "function") {
52841           throw new Error("Q can't apply finally callback");
52842       }
52843       callback = Q(callback);
52844       return this.then(function (value) {
52845           return callback.fcall().then(function () {
52846               return value;
52847           });
52848       }, function (reason) {
52849           // TODO attempt to recycle the rejection with "this".
52850           return callback.fcall().then(function () {
52851               throw reason;
52852           });
52853       });
52854   };
52855
52856   /**
52857    * Terminates a chain of promises, forcing rejections to be
52858    * thrown as exceptions.
52859    * @param {Any*} promise at the end of a chain of promises
52860    * @returns nothing
52861    */
52862   Q.done = function (object, fulfilled, rejected, progress) {
52863       return Q(object).done(fulfilled, rejected, progress);
52864   };
52865
52866   Promise.prototype.done = function (fulfilled, rejected, progress) {
52867       var onUnhandledError = function (error) {
52868           // forward to a future turn so that ``when``
52869           // does not catch it and turn it into a rejection.
52870           Q.nextTick(function () {
52871               makeStackTraceLong(error, promise);
52872               if (Q.onerror) {
52873                   Q.onerror(error);
52874               } else {
52875                   throw error;
52876               }
52877           });
52878       };
52879
52880       // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
52881       var promise = fulfilled || rejected || progress ?
52882           this.then(fulfilled, rejected, progress) :
52883           this;
52884
52885       if (typeof process === "object" && process && process.domain) {
52886           onUnhandledError = process.domain.bind(onUnhandledError);
52887       }
52888
52889       promise.then(void 0, onUnhandledError);
52890   };
52891
52892   /**
52893    * Causes a promise to be rejected if it does not get fulfilled before
52894    * some milliseconds time out.
52895    * @param {Any*} promise
52896    * @param {Number} milliseconds timeout
52897    * @param {Any*} custom error message or Error object (optional)
52898    * @returns a promise for the resolution of the given promise if it is
52899    * fulfilled before the timeout, otherwise rejected.
52900    */
52901   Q.timeout = function (object, ms, error) {
52902       return Q(object).timeout(ms, error);
52903   };
52904
52905   Promise.prototype.timeout = function (ms, error) {
52906       var deferred = defer();
52907       var timeoutId = setTimeout(function () {
52908           if (!error || "string" === typeof error) {
52909               error = new Error(error || "Timed out after " + ms + " ms");
52910               error.code = "ETIMEDOUT";
52911           }
52912           deferred.reject(error);
52913       }, ms);
52914
52915       this.then(function (value) {
52916           clearTimeout(timeoutId);
52917           deferred.resolve(value);
52918       }, function (exception) {
52919           clearTimeout(timeoutId);
52920           deferred.reject(exception);
52921       }, deferred.notify);
52922
52923       return deferred.promise;
52924   };
52925
52926   /**
52927    * Returns a promise for the given value (or promised value), some
52928    * milliseconds after it resolved. Passes rejections immediately.
52929    * @param {Any*} promise
52930    * @param {Number} milliseconds
52931    * @returns a promise for the resolution of the given promise after milliseconds
52932    * time has elapsed since the resolution of the given promise.
52933    * If the given promise rejects, that is passed immediately.
52934    */
52935   Q.delay = function (object, timeout) {
52936       if (timeout === void 0) {
52937           timeout = object;
52938           object = void 0;
52939       }
52940       return Q(object).delay(timeout);
52941   };
52942
52943   Promise.prototype.delay = function (timeout) {
52944       return this.then(function (value) {
52945           var deferred = defer();
52946           setTimeout(function () {
52947               deferred.resolve(value);
52948           }, timeout);
52949           return deferred.promise;
52950       });
52951   };
52952
52953   /**
52954    * Passes a continuation to a Node function, which is called with the given
52955    * arguments provided as an array, and returns a promise.
52956    *
52957    *      Q.nfapply(FS.readFile, [__filename])
52958    *      .then(function (content) {
52959    *      })
52960    *
52961    */
52962   Q.nfapply = function (callback, args) {
52963       return Q(callback).nfapply(args);
52964   };
52965
52966   Promise.prototype.nfapply = function (args) {
52967       var deferred = defer();
52968       var nodeArgs = array_slice(args);
52969       nodeArgs.push(deferred.makeNodeResolver());
52970       this.fapply(nodeArgs).fail(deferred.reject);
52971       return deferred.promise;
52972   };
52973
52974   /**
52975    * Passes a continuation to a Node function, which is called with the given
52976    * arguments provided individually, and returns a promise.
52977    * @example
52978    * Q.nfcall(FS.readFile, __filename)
52979    * .then(function (content) {
52980    * })
52981    *
52982    */
52983   Q.nfcall = function (callback /*...args*/) {
52984       var args = array_slice(arguments, 1);
52985       return Q(callback).nfapply(args);
52986   };
52987
52988   Promise.prototype.nfcall = function (/*...args*/) {
52989       var nodeArgs = array_slice(arguments);
52990       var deferred = defer();
52991       nodeArgs.push(deferred.makeNodeResolver());
52992       this.fapply(nodeArgs).fail(deferred.reject);
52993       return deferred.promise;
52994   };
52995
52996   /**
52997    * Wraps a NodeJS continuation passing function and returns an equivalent
52998    * version that returns a promise.
52999    * @example
53000    * Q.nfbind(FS.readFile, __filename)("utf-8")
53001    * .then(console.log)
53002    * .done()
53003    */
53004   Q.nfbind =
53005   Q.denodeify = function (callback /*...args*/) {
53006       if (callback === undefined) {
53007           throw new Error("Q can't wrap an undefined function");
53008       }
53009       var baseArgs = array_slice(arguments, 1);
53010       return function () {
53011           var nodeArgs = baseArgs.concat(array_slice(arguments));
53012           var deferred = defer();
53013           nodeArgs.push(deferred.makeNodeResolver());
53014           Q(callback).fapply(nodeArgs).fail(deferred.reject);
53015           return deferred.promise;
53016       };
53017   };
53018
53019   Promise.prototype.nfbind =
53020   Promise.prototype.denodeify = function (/*...args*/) {
53021       var args = array_slice(arguments);
53022       args.unshift(this);
53023       return Q.denodeify.apply(void 0, args);
53024   };
53025
53026   Q.nbind = function (callback, thisp /*...args*/) {
53027       var baseArgs = array_slice(arguments, 2);
53028       return function () {
53029           var nodeArgs = baseArgs.concat(array_slice(arguments));
53030           var deferred = defer();
53031           nodeArgs.push(deferred.makeNodeResolver());
53032           function bound() {
53033               return callback.apply(thisp, arguments);
53034           }
53035           Q(bound).fapply(nodeArgs).fail(deferred.reject);
53036           return deferred.promise;
53037       };
53038   };
53039
53040   Promise.prototype.nbind = function (/*thisp, ...args*/) {
53041       var args = array_slice(arguments, 0);
53042       args.unshift(this);
53043       return Q.nbind.apply(void 0, args);
53044   };
53045
53046   /**
53047    * Calls a method of a Node-style object that accepts a Node-style
53048    * callback with a given array of arguments, plus a provided callback.
53049    * @param object an object that has the named method
53050    * @param {String} name name of the method of object
53051    * @param {Array} args arguments to pass to the method; the callback
53052    * will be provided by Q and appended to these arguments.
53053    * @returns a promise for the value or error
53054    */
53055   Q.nmapply = // XXX As proposed by "Redsandro"
53056   Q.npost = function (object, name, args) {
53057       return Q(object).npost(name, args);
53058   };
53059
53060   Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
53061   Promise.prototype.npost = function (name, args) {
53062       var nodeArgs = array_slice(args || []);
53063       var deferred = defer();
53064       nodeArgs.push(deferred.makeNodeResolver());
53065       this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
53066       return deferred.promise;
53067   };
53068
53069   /**
53070    * Calls a method of a Node-style object that accepts a Node-style
53071    * callback, forwarding the given variadic arguments, plus a provided
53072    * callback argument.
53073    * @param object an object that has the named method
53074    * @param {String} name name of the method of object
53075    * @param ...args arguments to pass to the method; the callback will
53076    * be provided by Q and appended to these arguments.
53077    * @returns a promise for the value or error
53078    */
53079   Q.nsend = // XXX Based on Mark Miller's proposed "send"
53080   Q.nmcall = // XXX Based on "Redsandro's" proposal
53081   Q.ninvoke = function (object, name /*...args*/) {
53082       var nodeArgs = array_slice(arguments, 2);
53083       var deferred = defer();
53084       nodeArgs.push(deferred.makeNodeResolver());
53085       Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
53086       return deferred.promise;
53087   };
53088
53089   Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
53090   Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
53091   Promise.prototype.ninvoke = function (name /*...args*/) {
53092       var nodeArgs = array_slice(arguments, 1);
53093       var deferred = defer();
53094       nodeArgs.push(deferred.makeNodeResolver());
53095       this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
53096       return deferred.promise;
53097   };
53098
53099   /**
53100    * If a function would like to support both Node continuation-passing-style and
53101    * promise-returning-style, it can end its internal promise chain with
53102    * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user
53103    * elects to use a nodeback, the result will be sent there.  If they do not
53104    * pass a nodeback, they will receive the result promise.
53105    * @param object a result (or a promise for a result)
53106    * @param {Function} nodeback a Node.js-style callback
53107    * @returns either the promise or nothing
53108    */
53109   Q.nodeify = nodeify;
53110   function nodeify(object, nodeback) {
53111       return Q(object).nodeify(nodeback);
53112   }
53113
53114   Promise.prototype.nodeify = function (nodeback) {
53115       if (nodeback) {
53116           this.then(function (value) {
53117               Q.nextTick(function () {
53118                   nodeback(null, value);
53119               });
53120           }, function (error) {
53121               Q.nextTick(function () {
53122                   nodeback(error);
53123               });
53124           });
53125       } else {
53126           return this;
53127       }
53128   };
53129
53130   Q.noConflict = function() {
53131       throw new Error("Q.noConflict only works when Q is used as a global");
53132   };
53133
53134   // All code before this point will be filtered from stack traces.
53135   var qEndingLine = captureLine();
53136
53137   return Q;
53138
53139   });
53140   });
53141
53142   var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?';
53143   var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/';
53144   var bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm';
53145   var pannellumViewerCSS = 'pannellum-streetside/pannellum.css';
53146   var pannellumViewerJS = 'pannellum-streetside/pannellum.js';
53147   var maxResults$2 = 2000;
53148   var tileZoom$2 = 16.5;
53149   var tiler$5 = utilTiler().zoomExtent([tileZoom$2, tileZoom$2]).skipNullIsland(true);
53150   var dispatch$6 = dispatch('loadedBubbles', 'viewerChanged');
53151   var minHfov = 10;         // zoom in degrees:  20, 10, 5
53152   var maxHfov = 90;         // zoom out degrees
53153   var defaultHfov = 45;
53154
53155   var _hires = false;
53156   var _resolution = 512;    // higher numbers are slower - 512, 1024, 2048, 4096
53157   var _currScene = 0;
53158   var _ssCache;
53159   var _pannellumViewer;
53160   var _sceneOptions;
53161   var _dataUrlArray = [];
53162
53163
53164   /**
53165    * abortRequest().
53166    */
53167   function abortRequest$5(i) {
53168       i.abort();
53169   }
53170
53171
53172   /**
53173    * localeTimeStamp().
53174    */
53175   function localeTimestamp(s) {
53176       if (!s) return null;
53177       var detected = utilDetect();
53178       var options = { day: 'numeric', month: 'short', year: 'numeric' };
53179       var d = new Date(s);
53180       if (isNaN(d.getTime())) return null;
53181       return d.toLocaleString(detected.locale, options);
53182   }
53183
53184
53185   /**
53186    * loadTiles() wraps the process of generating tiles and then fetching image points for each tile.
53187    */
53188   function loadTiles$2(which, url, projection, margin) {
53189       var tiles = tiler$5.margin(margin).getTiles(projection);
53190
53191       // abort inflight requests that are no longer needed
53192       var cache = _ssCache[which];
53193       forEach(cache.inflight, function(v, k) {
53194           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
53195
53196           if (!wanted) {
53197               abortRequest$5(v);
53198               delete cache.inflight[k];
53199           }
53200       });
53201
53202       tiles.forEach(function (tile) {
53203          loadNextTilePage$2(which, url, tile);
53204       });
53205   }
53206
53207   /**
53208    * loadNextTilePage() load data for the next tile page in line.
53209    */
53210   function loadNextTilePage$2(which, url, tile) {
53211       var cache = _ssCache[which];
53212       var nextPage = cache.nextPage[tile.id] || 0;
53213       var id = tile.id + ',' + String(nextPage);
53214       if (cache.loaded[id] || cache.inflight[id]) return;
53215
53216       cache.inflight[id] = getBubbles(url, tile, function(bubbles) {
53217           cache.loaded[id] = true;
53218           delete cache.inflight[id];
53219           if (!bubbles) return;
53220
53221           // [].shift() removes the first element, some statistics info, not a bubble point
53222           bubbles.shift();
53223
53224           var features = bubbles.map(function(bubble) {
53225               if (cache.points[bubble.id]) return null;  // skip duplicates
53226
53227               var loc = [bubble.lo, bubble.la];
53228               var d = {
53229                   loc: loc,
53230                   key: bubble.id,
53231                   ca: bubble.he,
53232                   captured_at: bubble.cd,
53233                   captured_by: 'microsoft',
53234                   // nbn: bubble.nbn,
53235                   // pbn: bubble.pbn,
53236                   // ad: bubble.ad,
53237                   // rn: bubble.rn,
53238                   pr: bubble.pr,  // previous
53239                   ne: bubble.ne,  // next
53240                   pano: true,
53241                   sequenceKey: null
53242               };
53243
53244               cache.points[bubble.id] = d;
53245
53246               // a sequence starts here
53247               if (bubble.pr === undefined) {
53248                   cache.leaders.push(bubble.id);
53249               }
53250
53251               return {
53252                   minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
53253               };
53254
53255           }).filter(Boolean);
53256
53257           cache.rtree.load(features);
53258
53259           connectSequences();
53260
53261           if (which === 'bubbles') {
53262               dispatch$6.call('loadedBubbles');
53263           }
53264       });
53265   }
53266
53267
53268   // call this sometimes to connect the bubbles into sequences
53269   function connectSequences() {
53270       var cache = _ssCache.bubbles;
53271       var keepLeaders = [];
53272
53273       for (var i = 0; i < cache.leaders.length; i++) {
53274           var bubble = cache.points[cache.leaders[i]];
53275           var seen = {};
53276
53277           // try to make a sequence.. use the key of the leader bubble.
53278           var sequence = { key: bubble.key, bubbles: [] };
53279           var complete = false;
53280
53281           do {
53282               sequence.bubbles.push(bubble);
53283               seen[bubble.key] = true;
53284
53285               if (bubble.ne === undefined) {
53286                   complete = true;
53287               } else {
53288                   bubble = cache.points[bubble.ne];  // advance to next
53289               }
53290           } while (bubble && !seen[bubble.key] && !complete);
53291
53292
53293           if (complete) {
53294               _ssCache.sequences[sequence.key] = sequence;
53295
53296               // assign bubbles to the sequence
53297               for (var j = 0; j < sequence.bubbles.length; j++) {
53298                   sequence.bubbles[j].sequenceKey = sequence.key;
53299               }
53300
53301               // create a GeoJSON LineString
53302               sequence.geojson = {
53303                   type: 'LineString',
53304                   properties: { key: sequence.key },
53305                   coordinates: sequence.bubbles.map(function (d) { return d.loc; })
53306               };
53307
53308           } else {
53309               keepLeaders.push(cache.leaders[i]);
53310           }
53311       }
53312
53313       // couldn't complete these, save for later
53314       cache.leaders = keepLeaders;
53315   }
53316
53317   /**
53318    * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations).
53319    */
53320   function getBubbles(url, tile, callback) {
53321       var rect = tile.extent.rectangle();
53322       var urlForRequest = url + utilQsString({
53323           n: rect[3],
53324           s: rect[1],
53325           e: rect[2],
53326           w: rect[0],
53327           c: maxResults$2,
53328           appkey: bubbleAppKey,
53329           jsCallback: '{callback}'
53330       });
53331
53332       return jsonpRequest(urlForRequest, function (data) {
53333           if (!data || data.error) {
53334               callback(null);
53335           } else {
53336               callback(data);
53337           }
53338       });
53339   }
53340
53341
53342   // partition viewport into higher zoom tiles
53343   function partitionViewport$2(projection) {
53344       var z = geoScaleToZoom(projection.scale());
53345       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
53346       var tiler = utilTiler().zoomExtent([z2, z2]);
53347
53348       return tiler.getTiles(projection)
53349           .map(function(tile) { return tile.extent; });
53350   }
53351
53352
53353   // no more than `limit` results per partition.
53354   function searchLimited$2(limit, projection, rtree) {
53355       limit = limit || 5;
53356
53357       return partitionViewport$2(projection)
53358           .reduce(function(result, extent) {
53359               var found = rtree.search(extent.bbox())
53360                   .slice(0, limit)
53361                   .map(function(d) { return d.data; });
53362
53363               return (found.length ? result.concat(found) : result);
53364           }, []);
53365   }
53366
53367
53368   /**
53369    * getImage()
53370    */
53371   function getImage(imgInfo) {
53372       var response = q.defer();
53373       var img = new Image();
53374
53375       img.onload = function() {
53376           var canvas = document.getElementById('canvas' + imgInfo.face);
53377           var ctx = canvas.getContext('2d');
53378           ctx.drawImage(img, imgInfo.x, imgInfo.y);
53379           response.resolve({imgInfo:imgInfo, status: 'ok'});
53380       };
53381       img.onerror = function() {
53382           response.resolve({data: imgInfo, status: 'error'});
53383       };
53384       img.setAttribute('crossorigin', '');
53385       img.src = imgInfo.url;
53386
53387       return response.promise;
53388   }
53389
53390
53391   /**
53392    * loadCanvas()
53393    */
53394   function loadCanvas(imgInfoGroup) {
53395       var response = q.defer();
53396       var getImagePromises = imgInfoGroup.map(function(imgInfo) {
53397           return getImage(imgInfo);
53398       });
53399
53400       q.all(getImagePromises).then(function(data) {
53401           var canvas = document.getElementById('canvas' + data[0].imgInfo.face);
53402           switch (data[0].imgInfo.face) {
53403               case '01':
53404                   _dataUrlArray[0] = canvas.toDataURL('image/jpeg', 1.0);
53405                   break;
53406               case '02':
53407                   _dataUrlArray[1] = canvas.toDataURL('image/jpeg', 1.0);
53408                   break;
53409               case '03':
53410                   _dataUrlArray[2] = canvas.toDataURL('image/jpeg', 1.0);
53411                   break;
53412               case '10':
53413                   _dataUrlArray[3] = canvas.toDataURL('image/jpeg', 1.0);
53414                   break;
53415               case '11':
53416                   _dataUrlArray[4] = canvas.toDataURL('image/jpeg', 1.0);
53417                   break;
53418               case '12':
53419                   _dataUrlArray[5] = canvas.toDataURL('image/jpeg', 1.0);
53420                   break;
53421           }
53422           response.resolve({status:'loadCanvas for face ' + data[0].imgInfo.face + 'ok'});
53423       });
53424
53425       return response.promise;
53426   }
53427
53428
53429   function setupCanvas(selection, reset) {
53430       if (reset) {
53431           selection.selectAll('#divForCanvasWork')
53432               .remove();
53433       }
53434
53435       // Add the Streetside working canvases. These are used for 'stitching', or combining,
53436       // multiple images for each of the six faces, before passing to the Pannellum control as DataUrls
53437       selection.selectAll('#divForCanvasWork')
53438           .data([0])
53439           .enter()
53440           .append('div')
53441           .attr('id', 'divForCanvasWork')
53442           .attr('display', 'none')
53443           .selectAll('canvas')
53444           .data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12'])
53445           .enter()
53446           .append('canvas')
53447           .attr('id', function(d) { return d; })
53448           .attr('width', _resolution)
53449           .attr('height', _resolution);
53450   }
53451
53452
53453   /**
53454    * processFaces()
53455    */
53456   function processFaces(imgFaceInfoGroups) {
53457       var response = q.defer();
53458       var loadCanvasPromises = imgFaceInfoGroups.map(function(faceImgGroup) {
53459           return loadCanvas(faceImgGroup);
53460       });
53461
53462       q.all(loadCanvasPromises).then(function() {
53463           response.resolve({status: 'processFaces done'});
53464       });
53465
53466       return response.promise;
53467   }
53468
53469
53470
53471   function qkToXY(qk) {
53472       var x = 0;
53473       var y = 0;
53474       var scale = 256;
53475       for (var i = qk.length; i > 0; i--) {
53476           var key = qk[i-1];
53477           x += (+(key === '1' || key === '3')) * scale;
53478           y += (+(key === '2' || key === '3')) * scale;
53479           scale *= 2;
53480       }
53481       return [x, y];
53482   }
53483
53484
53485   function getQuadKeys() {
53486       var dim = _resolution / 256;
53487       var quadKeys;
53488
53489       if (dim === 16) {
53490           quadKeys = [
53491               '0000','0001','0010','0011','0100','0101','0110','0111',  '1000','1001','1010','1011','1100','1101','1110','1111',
53492               '0002','0003','0012','0013','0102','0103','0112','0113',  '1002','1003','1012','1013','1102','1103','1112','1113',
53493               '0020','0021','0030','0031','0120','0121','0130','0131',  '1020','1021','1030','1031','1120','1121','1130','1131',
53494               '0022','0023','0032','0033','0122','0123','0132','0133',  '1022','1023','1032','1033','1122','1123','1132','1133',
53495               '0200','0201','0210','0211','0300','0301','0310','0311',  '1200','1201','1210','1211','1300','1301','1310','1311',
53496               '0202','0203','0212','0213','0302','0303','0312','0313',  '1202','1203','1212','1213','1302','1303','1312','1313',
53497               '0220','0221','0230','0231','0320','0321','0330','0331',  '1220','1221','1230','1231','1320','1321','1330','1331',
53498               '0222','0223','0232','0233','0322','0323','0332','0333',  '1222','1223','1232','1233','1322','1323','1332','1333',
53499
53500               '2000','2001','2010','2011','2100','2101','2110','2111',  '3000','3001','3010','3011','3100','3101','3110','3111',
53501               '2002','2003','2012','2013','2102','2103','2112','2113',  '3002','3003','3012','3013','3102','3103','3112','3113',
53502               '2020','2021','2030','2031','2120','2121','2130','2131',  '3020','3021','3030','3031','3120','3121','3130','3131',
53503               '2022','2023','2032','2033','2122','2123','2132','2133',  '3022','3023','3032','3033','3122','3123','3132','3133',
53504               '2200','2201','2210','2211','2300','2301','2310','2311',  '3200','3201','3210','3211','3300','3301','3310','3311',
53505               '2202','2203','2212','2213','2302','2303','2312','2313',  '3202','3203','3212','3213','3302','3303','3312','3313',
53506               '2220','2221','2230','2231','2320','2321','2330','2331',  '3220','3221','3230','3231','3320','3321','3330','3331',
53507               '2222','2223','2232','2233','2322','2323','2332','2333',  '3222','3223','3232','3233','3322','3323','3332','3333'
53508           ];
53509
53510       } else if (dim === 8) {
53511           quadKeys = [
53512               '000','001','010','011',  '100','101','110','111',
53513               '002','003','012','013',  '102','103','112','113',
53514               '020','021','030','031',  '120','121','130','131',
53515               '022','023','032','033',  '122','123','132','133',
53516
53517               '200','201','210','211',  '300','301','310','311',
53518               '202','203','212','213',  '302','303','312','313',
53519               '220','221','230','231',  '320','321','330','331',
53520               '222','223','232','233',  '322','323','332','333'
53521           ];
53522
53523       } else if (dim === 4) {
53524           quadKeys = [
53525               '00','01',  '10','11',
53526               '02','03',  '12','13',
53527
53528               '20','21',  '30','31',
53529               '22','23',  '32','33'
53530           ];
53531
53532       } else {  // dim === 2
53533           quadKeys = [
53534               '0', '1',
53535               '2', '3'
53536           ];
53537       }
53538
53539       return quadKeys;
53540   }
53541
53542
53543
53544   var serviceStreetside = {
53545       /**
53546        * init() initialize streetside.
53547        */
53548       init: function () {
53549           if (!_ssCache) {
53550               this.reset();
53551           }
53552
53553           this.event = utilRebind(this, dispatch$6, 'on');
53554       },
53555
53556       /**
53557        * reset() reset the cache.
53558        */
53559       reset: function () {
53560           var cache = _ssCache;
53561
53562           if (cache) {
53563               if (cache.bubbles && cache.bubbles.inflight) {
53564                   forEach(cache.bubbles.inflight, abortRequest$5);
53565               }
53566           }
53567
53568           _ssCache = {
53569               bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1(), points: {}, leaders: [] },
53570               sequences: {}
53571           };
53572       },
53573
53574       /**
53575        * bubbles()
53576        */
53577       bubbles: function (projection) {
53578           var limit = 5;
53579           return searchLimited$2(limit, projection, _ssCache.bubbles.rtree);
53580       },
53581
53582
53583       sequences: function(projection) {
53584           var viewport = projection.clipExtent();
53585           var min = [viewport[0][0], viewport[1][1]];
53586           var max = [viewport[1][0], viewport[0][1]];
53587           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
53588           var seen = {};
53589           var results = [];
53590
53591           // all sequences for bubbles in viewport
53592           _ssCache.bubbles.rtree.search(bbox)
53593               .forEach(function(d) {
53594                   var key = d.data.sequenceKey;
53595                   if (key && !seen[key]) {
53596                       seen[key] = true;
53597                       results.push(_ssCache.sequences[key].geojson);
53598                   }
53599               });
53600
53601           return results;
53602       },
53603
53604
53605       /**
53606        * loadBubbles()
53607        */
53608       loadBubbles: function (projection, margin) {
53609           // by default: request 2 nearby tiles so we can connect sequences.
53610           if (margin === undefined) margin = 2;
53611
53612           loadTiles$2('bubbles', bubbleApi, projection, margin);
53613       },
53614
53615
53616       viewer: function() {
53617           return _pannellumViewer;
53618       },
53619
53620
53621       initViewer: function () {
53622           if (!window.pannellum) return;
53623           if (_pannellumViewer) return;
53624
53625           var sceneID = ++_currScene + '';
53626           var options = {
53627               'default': { firstScene: sceneID },
53628               scenes: {}
53629           };
53630           options.scenes[sceneID] = _sceneOptions;
53631
53632           _pannellumViewer = window.pannellum.viewer('viewer-streetside', options);
53633
53634           _pannellumViewer
53635               .on('mousedown', function() {
53636                   select(window).on('mousemove.pannellum', function() {
53637                       dispatch$6.call('viewerChanged');
53638                   });
53639               })
53640               .on('mouseup', function() {
53641                   select(window).on('mousemove.pannellum', null);
53642                   // continue dispatching events for a few seconds, in case viewer has inertia.
53643                   var t = timer(function(elapsed) {
53644                       dispatch$6.call('viewerChanged');
53645                       if (elapsed > 2000) {
53646                           t.stop();
53647                       }
53648                   });
53649               });
53650       },
53651
53652
53653       /**
53654        * loadViewer() create the streeside viewer.
53655        */
53656       loadViewer: function (context) {
53657           var that = this;
53658
53659           // create ms-wrapper, a photo wrapper class
53660           var wrap = select('#photoviewer').selectAll('.ms-wrapper')
53661               .data([0]);
53662
53663           // inject ms-wrapper into the photoviewer div
53664           // (used by all to house each custom photo viewer)
53665           var wrapEnter = wrap.enter()
53666               .append('div')
53667               .attr('id', 'ms')
53668               .attr('class', 'photo-wrapper ms-wrapper')
53669               .classed('hide', true);
53670
53671           // inject div to support streetside viewer (pannellum) and attribution line
53672           wrapEnter
53673               .append('div')
53674               .attr('id', 'viewer-streetside')
53675               .append('div')
53676               .attr('class', 'photo-attribution fillD');
53677
53678           var controlsEnter = wrapEnter
53679               .append('div')
53680               .attr('class', 'photo-controls-wrap')
53681               .append('div')
53682               .attr('class', 'photo-controls');
53683
53684           controlsEnter
53685               .append('button')
53686               .on('click.back', step(-1))
53687               .text('◄');
53688
53689           controlsEnter
53690               .append('button')
53691               .on('click.forward', step(1))
53692               .text('►');
53693
53694
53695           // create working canvas for stitching together images
53696           wrap = wrap
53697               .merge(wrapEnter)
53698               .call(setupCanvas, true);
53699
53700           // load streetside pannellum viewer css
53701           select('head').selectAll('#streetside-viewercss')
53702               .data([0])
53703               .enter()
53704               .append('link')
53705               .attr('id', 'streetside-viewercss')
53706               .attr('rel', 'stylesheet')
53707               .attr('href', context.asset(pannellumViewerCSS));
53708
53709           // load streetside pannellum viewer js
53710           select('head').selectAll('#streetside-viewerjs')
53711               .data([0])
53712               .enter()
53713               .append('script')
53714               .attr('id', 'streetside-viewerjs')
53715               .attr('src', context.asset(pannellumViewerJS));
53716
53717
53718           // Register viewer resize handler
53719           context.ui().photoviewer.on('resize', function() {
53720               if (_pannellumViewer) {
53721                   _pannellumViewer.resize();
53722               }
53723           });
53724
53725
53726           function step(stepBy) {
53727               return function() {
53728                   var viewer = select('#photoviewer');
53729                   var selected = viewer.empty() ? undefined : viewer.datum();
53730                   if (!selected) return;
53731
53732                   var nextID = (stepBy === 1 ? selected.ne : selected.pr);
53733                   var yaw = _pannellumViewer.getYaw();
53734                   var ca = selected.ca + yaw;
53735                   var origin = selected.loc;
53736
53737                   // construct a search trapezoid pointing out from current bubble
53738                   var meters = 35;
53739                   var p1 = [
53740                       origin[0] + geoMetersToLon(meters / 5, origin[1]),
53741                       origin[1]
53742                   ];
53743                   var p2 = [
53744                       origin[0] + geoMetersToLon(meters / 2, origin[1]),
53745                       origin[1] + geoMetersToLat(meters)
53746                   ];
53747                   var p3 = [
53748                       origin[0] - geoMetersToLon(meters / 2, origin[1]),
53749                       origin[1] + geoMetersToLat(meters)
53750                   ];
53751                   var p4 = [
53752                       origin[0] - geoMetersToLon(meters / 5, origin[1]),
53753                       origin[1]
53754                   ];
53755
53756                   var poly = [p1, p2, p3, p4, p1];
53757
53758                   // rotate it to face forward/backward
53759                   var angle = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
53760                   poly = geoRotate(poly, -angle, origin);
53761
53762                   var extent = poly.reduce(function(extent, point) {
53763                       return extent.extend(geoExtent(point));
53764                   }, geoExtent());
53765
53766                   // find nearest other bubble in the search polygon
53767                   var minDist = Infinity;
53768                   _ssCache.bubbles.rtree.search(extent.bbox())
53769                       .forEach(function(d) {
53770                           if (d.data.key === selected.key) return;
53771                           if (!geoPointInPolygon(d.data.loc, poly)) return;
53772
53773                           var dist = geoVecLength(d.data.loc, selected.loc);
53774                           var theta = selected.ca - d.data.ca;
53775                           var minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
53776                           if (minTheta > 20) {
53777                               dist += 5;  // penalize distance if camera angles don't match
53778                           }
53779
53780                           if (dist < minDist) {
53781                               nextID = d.data.key;
53782                               minDist = dist;
53783                           }
53784                       });
53785
53786                   var nextBubble = nextID && _ssCache.bubbles.points[nextID];
53787                   if (!nextBubble) return;
53788
53789                   context.map().centerEase(nextBubble.loc);
53790
53791                   that.selectImage(nextBubble)
53792                       .then(function(r) {
53793                           if (r.status === 'ok') {
53794                               _sceneOptions.yaw = yaw;
53795                               that.showViewer();
53796                           }
53797                       });
53798               };
53799           }
53800       },
53801
53802       /**
53803        * showViewer()
53804        */
53805       showViewer: function (yaw) {
53806           if (!_sceneOptions) return;
53807
53808           if (yaw !== undefined) {
53809               _sceneOptions.yaw = yaw;
53810           }
53811
53812           if (!_pannellumViewer) {
53813               this.initViewer();
53814           } else {
53815               // make a new scene
53816               var sceneID = ++_currScene + '';
53817               _pannellumViewer
53818                   .addScene(sceneID, _sceneOptions)
53819                   .loadScene(sceneID);
53820
53821               // remove previous scene
53822               if (_currScene > 2) {
53823                   sceneID = (_currScene - 1) + '';
53824                   _pannellumViewer
53825                       .removeScene(sceneID);
53826               }
53827           }
53828
53829           var wrap = select('#photoviewer')
53830               .classed('hide', false);
53831
53832           var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
53833
53834           if (isHidden) {
53835               wrap
53836                   .selectAll('.photo-wrapper:not(.ms-wrapper)')
53837                   .classed('hide', true);
53838
53839               wrap
53840                   .selectAll('.photo-wrapper.ms-wrapper')
53841                   .classed('hide', false);
53842           }
53843
53844           return this;
53845       },
53846
53847       /**
53848        * hideViewer()
53849        */
53850       hideViewer: function () {
53851           var viewer = select('#photoviewer');
53852           if (!viewer.empty()) viewer.datum(null);
53853
53854           viewer
53855               .classed('hide', true)
53856               .selectAll('.photo-wrapper')
53857               .classed('hide', true);
53858
53859           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
53860               .classed('currentView', false);
53861
53862           return this.setStyles(null, true);
53863       },
53864
53865       /**
53866        * selectImage().
53867        */
53868       selectImage: function (d) {
53869           var response = q.defer();
53870           var that = this;
53871
53872           var viewer = select('#photoviewer');
53873           if (!viewer.empty()) viewer.datum(d);
53874
53875           this.setStyles(null, true);
53876
53877           var wrap = select('#photoviewer .ms-wrapper');
53878           var attribution = wrap.selectAll('.photo-attribution').html('');
53879
53880           wrap.selectAll('.pnlm-load-box')   // display "loading.."
53881               .style('display', 'block');
53882
53883           if (!d) {
53884               response.resolve({status: 'ok'});
53885               return response.promise;
53886           }
53887
53888           var line1 = attribution
53889               .append('div')
53890               .attr('class', 'attribution-row');
53891
53892           // Add hires checkbox
53893           var label = line1
53894               .append('label')
53895               .attr('class', 'streetside-hires');
53896
53897           label
53898               .append('input')
53899               .attr('type', 'checkbox')
53900               .attr('id', 'streetside-hires-input')
53901               .property('checked', _hires)
53902               .on('click', function() {
53903                   event.stopPropagation();
53904
53905                   _hires = !_hires;
53906                   _resolution = _hires ? 1024 : 512;
53907                   wrap.call(setupCanvas, true);
53908
53909                   var viewstate = {
53910                       yaw: _pannellumViewer.getYaw(),
53911                       pitch: _pannellumViewer.getPitch(),
53912                       hfov: _pannellumViewer.getHfov()
53913                   };
53914
53915                   that.selectImage(d)
53916                       .then(function(r) {
53917                           if (r.status === 'ok') {
53918                               _sceneOptions = assignIn(_sceneOptions, viewstate);
53919                               that.showViewer();
53920                           }
53921                       });
53922               });
53923
53924           label
53925               .append('span')
53926               .text(t('streetside.hires'));
53927
53928
53929           var captureInfo = line1
53930               .append('div')
53931               .attr('class', 'attribution-capture-info');
53932
53933           // Add capture date
53934           if (d.captured_by) {
53935               var yyyy = (new Date()).getFullYear();
53936
53937               captureInfo
53938                   .append('a')
53939                   .attr('class', 'captured_by')
53940                   .attr('target', '_blank')
53941                   .attr('href', 'https://www.microsoft.com/en-us/maps/streetside')
53942                   .text('©' + yyyy + ' Microsoft');
53943
53944               captureInfo
53945                   .append('span')
53946                   .text('|');
53947           }
53948
53949           if (d.captured_at) {
53950               captureInfo
53951                   .append('span')
53952                   .attr('class', 'captured_at')
53953                   .text(localeTimestamp(d.captured_at));
53954           }
53955
53956           // Add image links
53957           var line2 = attribution
53958               .append('div')
53959               .attr('class', 'attribution-row');
53960
53961           line2
53962               .append('a')
53963               .attr('class', 'image-view-link')
53964               .attr('target', '_blank')
53965               .attr('href', 'https://www.bing.com/maps?cp=' + d.loc[1] + '~' + d.loc[0] +
53966                   '&lvl=17&dir=' + d.ca + '&style=x&v=2&sV=1')
53967               .text(t('streetside.view_on_bing'));
53968
53969           line2
53970               .append('a')
53971               .attr('class', 'image-report-link')
53972               .attr('target', '_blank')
53973               .attr('href', 'https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=' + encodeURIComponent(d.key) +
53974                   '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
53975               .text(t('streetside.report'));
53976
53977
53978           var bubbleIdQuadKey = d.key.toString(4);
53979           var paddingNeeded = 16 - bubbleIdQuadKey.length;
53980           for (var i = 0; i < paddingNeeded; i++) {
53981               bubbleIdQuadKey = '0' + bubbleIdQuadKey;
53982           }
53983           var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
53984           var imgUrlSuffix = '.jpg?g=6338&n=z';
53985
53986           // Cubemap face code order matters here: front=01, right=02, back=03, left=10, up=11, down=12
53987           var faceKeys = ['01','02','03','10','11','12'];
53988
53989           // Map images to cube faces
53990           var quadKeys = getQuadKeys();
53991           var faces = faceKeys.map(function(faceKey) {
53992               return quadKeys.map(function(quadKey) {
53993                   var xy = qkToXY(quadKey);
53994                   return {
53995                       face: faceKey,
53996                       url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
53997                       x: xy[0],
53998                       y: xy[1]
53999                   };
54000               });
54001           });
54002
54003           processFaces(faces).then(function() {
54004               _sceneOptions = {
54005                   showFullscreenCtrl: false,
54006                   autoLoad: true,
54007                   compass: true,
54008                   northOffset: d.ca,
54009                   yaw: 0,
54010                   minHfov: minHfov,
54011                   maxHfov: maxHfov,
54012                   hfov: defaultHfov,
54013                   type: 'cubemap',
54014                   cubeMap: [
54015                       _dataUrlArray[0],
54016                       _dataUrlArray[1],
54017                       _dataUrlArray[2],
54018                       _dataUrlArray[3],
54019                       _dataUrlArray[4],
54020                       _dataUrlArray[5]
54021                   ]
54022               };
54023               response.resolve({status: 'ok'});
54024           });
54025
54026           return response.promise;
54027       },
54028
54029
54030       getSequenceKeyForBubble: function(d) {
54031           return d && d.sequenceKey;
54032       },
54033
54034
54035       // Updates the currently highlighted sequence and selected bubble.
54036       // Reset is only necessary when interacting with the viewport because
54037       // this implicitly changes the currently selected bubble/sequence
54038       setStyles: function (hovered, reset) {
54039           if (reset) {  // reset all layers
54040               d3_selectAll('.viewfield-group')
54041                   .classed('highlighted', false)
54042                   .classed('hovered', false)
54043                   .classed('currentView', false);
54044
54045               d3_selectAll('.sequence')
54046                   .classed('highlighted', false)
54047                   .classed('currentView', false);
54048           }
54049
54050           var hoveredBubbleKey = hovered && hovered.key;
54051           var hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
54052           var hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
54053           var hoveredBubbleKeys =  (hoveredSequence && hoveredSequence.bubbles.map(function (d) { return d.key; })) || [];
54054
54055           var viewer = select('#photoviewer');
54056           var selected = viewer.empty() ? undefined : viewer.datum();
54057           var selectedBubbleKey = selected && selected.key;
54058           var selectedSequenceKey = this.getSequenceKeyForBubble(selected);
54059           var selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
54060           var selectedBubbleKeys = (selectedSequence && selectedSequence.bubbles.map(function (d) { return d.key; })) || [];
54061
54062           // highlight sibling viewfields on either the selected or the hovered sequences
54063           var highlightedBubbleKeys = union(hoveredBubbleKeys, selectedBubbleKeys);
54064
54065           d3_selectAll('.layer-streetside-images .viewfield-group')
54066               .classed('highlighted', function (d) { return highlightedBubbleKeys.indexOf(d.key) !== -1; })
54067               .classed('hovered', function (d) { return d.key === hoveredBubbleKey; })
54068               .classed('currentView', function (d) { return d.key === selectedBubbleKey; });
54069
54070           d3_selectAll('.layer-streetside-images .sequence')
54071               .classed('highlighted', function (d) { return d.properties.key === hoveredSequenceKey; })
54072               .classed('currentView', function (d) { return d.properties.key === selectedSequenceKey; });
54073
54074           // update viewfields if needed
54075           d3_selectAll('.viewfield-group .viewfield')
54076               .attr('d', viewfieldPath);
54077
54078           function viewfieldPath() {
54079               var d = this.parentNode.__data__;
54080               if (d.pano && d.key !== selectedBubbleKey) {
54081                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
54082               } else {
54083                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
54084               }
54085           }
54086
54087           return this;
54088       },
54089
54090       /**
54091        * cache().
54092        */
54093       cache: function () {
54094           return _ssCache;
54095       }
54096   };
54097
54098   var apibase$4 = 'https://taginfo.openstreetmap.org/api/4/';
54099   var _inflight$1 = {};
54100   var _popularKeys = {};
54101   var _taginfoCache = {};
54102
54103   var tag_sorts = {
54104       point: 'count_nodes',
54105       vertex: 'count_nodes',
54106       area: 'count_ways',
54107       line: 'count_ways'
54108   };
54109   var tag_sort_members = {
54110       point: 'count_node_members',
54111       vertex: 'count_node_members',
54112       area: 'count_way_members',
54113       line: 'count_way_members',
54114       relation: 'count_relation_members'
54115   };
54116   var tag_filters = {
54117       point: 'nodes',
54118       vertex: 'nodes',
54119       area: 'ways',
54120       line: 'ways'
54121   };
54122   var tag_members_fractions = {
54123       point: 'count_node_members_fraction',
54124       vertex: 'count_node_members_fraction',
54125       area: 'count_way_members_fraction',
54126       line: 'count_way_members_fraction',
54127       relation: 'count_relation_members_fraction'
54128   };
54129
54130
54131   function sets(params, n, o) {
54132       if (params.geometry && o[params.geometry]) {
54133           params[n] = o[params.geometry];
54134       }
54135       return params;
54136   }
54137
54138
54139   function setFilter(params) {
54140       return sets(params, 'filter', tag_filters);
54141   }
54142
54143
54144   function setSort(params) {
54145       return sets(params, 'sortname', tag_sorts);
54146   }
54147
54148
54149   function setSortMembers(params) {
54150       return sets(params, 'sortname', tag_sort_members);
54151   }
54152
54153
54154   function clean(params) {
54155       return omit(params, ['geometry', 'debounce']);
54156   }
54157
54158
54159   function filterKeys(type) {
54160       var count_type = type ? 'count_' + type : 'count_all';
54161       return function(d) {
54162           return parseFloat(d[count_type]) > 2500 || d.in_wiki;
54163       };
54164   }
54165
54166
54167   function filterMultikeys(prefix) {
54168       return function(d) {
54169           // d.key begins with prefix, and d.key contains no additional ':'s
54170           var re = new RegExp('^' + prefix + '(.*)$');
54171           var matches = d.key.match(re) || [];
54172           return (matches.length === 2 && matches[1].indexOf(':') === -1);
54173       };
54174   }
54175
54176
54177   function filterValues(allowUpperCase) {
54178       return function(d) {
54179           if (d.value.match(/[;,]/) !== null) return false;  // exclude some punctuation
54180           if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false;  // exclude uppercase letters
54181           return parseFloat(d.fraction) > 0.0;
54182       };
54183   }
54184
54185
54186   function filterRoles(geometry) {
54187       return function(d) {
54188           if (d.role === '') return false; // exclude empty role
54189           if (d.role.match(/[A-Z*;,]/) !== null) return false;  // exclude uppercase letters and some punctuation
54190           return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
54191       };
54192   }
54193
54194
54195   function valKey(d) {
54196       return {
54197           value: d.key,
54198           title: d.key
54199       };
54200   }
54201
54202
54203   function valKeyDescription(d) {
54204       return {
54205           value: d.value,
54206           title: d.description || d.value
54207       };
54208   }
54209
54210
54211   function roleKey(d) {
54212       return {
54213           value: d.role,
54214           title: d.role
54215       };
54216   }
54217
54218
54219   // sort keys with ':' lower than keys without ':'
54220   function sortKeys(a, b) {
54221       return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
54222           : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
54223           : 0;
54224   }
54225
54226
54227   var debouncedRequest$1 = debounce(request$2, 300, { leading: false });
54228
54229   function request$2(url, params, exactMatch, callback, loaded) {
54230       if (_inflight$1[url]) return;
54231
54232       if (checkCache(url, params, exactMatch, callback)) return;
54233
54234       _inflight$1[url] = d3_json(url, function (err, data) {
54235           delete _inflight$1[url];
54236           loaded(err, data);
54237       });
54238   }
54239
54240
54241   function checkCache(url, params, exactMatch, callback) {
54242       var rp = params.rp || 25;
54243       var testQuery = params.query || '';
54244       var testUrl = url;
54245
54246       do {
54247           var hit = _taginfoCache[testUrl];
54248
54249           // exact match, or shorter match yielding fewer than max results (rp)
54250           if (hit && (url === testUrl || hit.length < rp)) {
54251               callback(null, hit);
54252               return true;
54253           }
54254
54255           // don't try to shorten the query
54256           if (exactMatch || !testQuery.length) return false;
54257
54258           // do shorten the query to see if we already have a cached result
54259           // that has returned fewer than max results (rp)
54260           testQuery = testQuery.slice(0, -1);
54261           testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
54262       } while (testQuery.length >= 0);
54263
54264       return false;
54265   }
54266
54267
54268   var serviceTaginfo = {
54269
54270       init: function() {
54271           _inflight$1 = {};
54272           _taginfoCache = {};
54273           _popularKeys = {
54274               postal_code: true   // #5377
54275           };
54276
54277           // Fetch popular keys.  We'll exclude these from `values`
54278           // lookups because they stress taginfo, and they aren't likely
54279           // to yield meaningful autocomplete results.. see #3955
54280           var params = {
54281               rp: 100,
54282               sortname: 'values_all',
54283               sortorder: 'desc',
54284               page: 1,
54285               debounce: false,
54286               lang: currentLocale
54287           };
54288           this.keys(params, function(err, data) {
54289               if (err) return;
54290               data.forEach(function(d) {
54291                   if (d.value === 'opening_hours') return;  // exception
54292                   _popularKeys[d.value] = true;
54293               });
54294           });
54295       },
54296
54297
54298       reset: function() {
54299           forEach(_inflight$1, function(req) { req.abort(); });
54300           _inflight$1 = {};
54301       },
54302
54303
54304       keys: function(params, callback) {
54305           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
54306           params = clean(setSort(params));
54307           params = assignIn({
54308               rp: 10,
54309               sortname: 'count_all',
54310               sortorder: 'desc',
54311               page: 1,
54312               lang: currentLocale
54313           }, params);
54314
54315           var url = apibase$4 + 'keys/all?' + utilQsString(params);
54316           doRequest(url, params, false, callback, function(err, d) {
54317               if (err) {
54318                   callback(err);
54319               } else {
54320                   var f = filterKeys(params.filter);
54321                   var result = d.data.filter(f).sort(sortKeys).map(valKey);
54322                   _taginfoCache[url] = result;
54323                   callback(null, result);
54324               }
54325           });
54326       },
54327
54328
54329       multikeys: function(params, callback) {
54330           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
54331           params = clean(setSort(params));
54332           params = assignIn({
54333               rp: 25,
54334               sortname: 'count_all',
54335               sortorder: 'desc',
54336               page: 1,
54337               lang: currentLocale
54338           }, params);
54339
54340           var prefix = params.query;
54341           var url = apibase$4 + 'keys/all?' + utilQsString(params);
54342           doRequest(url, params, true, callback, function(err, d) {
54343               if (err) {
54344                   callback(err);
54345               } else {
54346                   var f = filterMultikeys(prefix);
54347                   var result = d.data.filter(f).map(valKey);
54348                   _taginfoCache[url] = result;
54349                   callback(null, result);
54350               }
54351           });
54352       },
54353
54354
54355       values: function(params, callback) {
54356           // Exclude popular keys from values lookups.. see #3955
54357           var key = params.key;
54358           if (key && _popularKeys[key]) {
54359               callback(null, []);
54360               return;
54361           }
54362
54363           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
54364           params = clean(setSort(setFilter(params)));
54365           params = assignIn({
54366               rp: 25,
54367               sortname: 'count_all',
54368               sortorder: 'desc',
54369               page: 1,
54370               lang: currentLocale
54371           }, params);
54372
54373           var url = apibase$4 + 'key/values?' + utilQsString(params);
54374           doRequest(url, params, false, callback, function(err, d) {
54375               if (err) {
54376                   callback(err);
54377               } else {
54378                   // In most cases we prefer taginfo value results with lowercase letters.
54379                   // A few OSM keys expect values to contain uppercase values (see #3377).
54380                   // This is not an exhaustive list (e.g. `name` also has uppercase values)
54381                   // but these are the fields where taginfo value lookup is most useful.
54382                   var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times/;
54383                   var allowUpperCase = (params.key.match(re) !== null);
54384                   var f = filterValues(allowUpperCase);
54385
54386                   var result = d.data.filter(f).map(valKeyDescription);
54387                   _taginfoCache[url] = result;
54388                   callback(null, result);
54389               }
54390           });
54391       },
54392
54393
54394       roles: function(params, callback) {
54395           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
54396           var geometry = params.geometry;
54397           params = clean(setSortMembers(params));
54398           params = assignIn({
54399               rp: 25,
54400               sortname: 'count_all_members',
54401               sortorder: 'desc',
54402               page: 1,
54403               lang: currentLocale
54404           }, params);
54405
54406           var url = apibase$4 + 'relation/roles?' + utilQsString(params);
54407           doRequest(url, params, true, callback, function(err, d) {
54408               if (err) {
54409                   callback(err);
54410               } else {
54411                   var f = filterRoles(geometry);
54412                   var result = d.data.filter(f).map(roleKey);
54413                   _taginfoCache[url] = result;
54414                   callback(null, result);
54415               }
54416           });
54417       },
54418
54419
54420       docs: function(params, callback) {
54421           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
54422           params = clean(setSort(params));
54423
54424           var path = 'key/wiki_pages?';
54425           if (params.value) {
54426               path = 'tag/wiki_pages?';
54427           } else if (params.rtype) {
54428               path = 'relation/wiki_pages?';
54429           }
54430
54431           var url = apibase$4 + path + utilQsString(params);
54432           doRequest(url, params, true, callback, function(err, d) {
54433               if (err) {
54434                   callback(err);
54435               } else {
54436                   _taginfoCache[url] = d.data;
54437                   callback(null, d.data);
54438               }
54439           });
54440       },
54441
54442
54443       apibase: function(_) {
54444           if (!arguments.length) return apibase$4;
54445           apibase$4 = _;
54446           return this;
54447       }
54448
54449   };
54450
54451   var helpers = createCommonjsModule(function (module, exports) {
54452   Object.defineProperty(exports, "__esModule", { value: true });
54453   /**
54454    * @module helpers
54455    */
54456   /**
54457    * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
54458    *
54459    * @memberof helpers
54460    * @type {number}
54461    */
54462   exports.earthRadius = 6371008.8;
54463   /**
54464    * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
54465    *
54466    * @memberof helpers
54467    * @type {Object}
54468    */
54469   exports.factors = {
54470       centimeters: exports.earthRadius * 100,
54471       centimetres: exports.earthRadius * 100,
54472       degrees: exports.earthRadius / 111325,
54473       feet: exports.earthRadius * 3.28084,
54474       inches: exports.earthRadius * 39.370,
54475       kilometers: exports.earthRadius / 1000,
54476       kilometres: exports.earthRadius / 1000,
54477       meters: exports.earthRadius,
54478       metres: exports.earthRadius,
54479       miles: exports.earthRadius / 1609.344,
54480       millimeters: exports.earthRadius * 1000,
54481       millimetres: exports.earthRadius * 1000,
54482       nauticalmiles: exports.earthRadius / 1852,
54483       radians: 1,
54484       yards: exports.earthRadius / 1.0936,
54485   };
54486   /**
54487    * Units of measurement factors based on 1 meter.
54488    *
54489    * @memberof helpers
54490    * @type {Object}
54491    */
54492   exports.unitsFactors = {
54493       centimeters: 100,
54494       centimetres: 100,
54495       degrees: 1 / 111325,
54496       feet: 3.28084,
54497       inches: 39.370,
54498       kilometers: 1 / 1000,
54499       kilometres: 1 / 1000,
54500       meters: 1,
54501       metres: 1,
54502       miles: 1 / 1609.344,
54503       millimeters: 1000,
54504       millimetres: 1000,
54505       nauticalmiles: 1 / 1852,
54506       radians: 1 / exports.earthRadius,
54507       yards: 1 / 1.0936,
54508   };
54509   /**
54510    * Area of measurement factors based on 1 square meter.
54511    *
54512    * @memberof helpers
54513    * @type {Object}
54514    */
54515   exports.areaFactors = {
54516       acres: 0.000247105,
54517       centimeters: 10000,
54518       centimetres: 10000,
54519       feet: 10.763910417,
54520       inches: 1550.003100006,
54521       kilometers: 0.000001,
54522       kilometres: 0.000001,
54523       meters: 1,
54524       metres: 1,
54525       miles: 3.86e-7,
54526       millimeters: 1000000,
54527       millimetres: 1000000,
54528       yards: 1.195990046,
54529   };
54530   /**
54531    * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
54532    *
54533    * @name feature
54534    * @param {Geometry} geometry input geometry
54535    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54536    * @param {Object} [options={}] Optional Parameters
54537    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54538    * @param {string|number} [options.id] Identifier associated with the Feature
54539    * @returns {Feature} a GeoJSON Feature
54540    * @example
54541    * var geometry = {
54542    *   "type": "Point",
54543    *   "coordinates": [110, 50]
54544    * };
54545    *
54546    * var feature = turf.feature(geometry);
54547    *
54548    * //=feature
54549    */
54550   function feature(geom, properties, options) {
54551       if (options === void 0) { options = {}; }
54552       var feat = { type: "Feature" };
54553       if (options.id === 0 || options.id) {
54554           feat.id = options.id;
54555       }
54556       if (options.bbox) {
54557           feat.bbox = options.bbox;
54558       }
54559       feat.properties = properties || {};
54560       feat.geometry = geom;
54561       return feat;
54562   }
54563   exports.feature = feature;
54564   /**
54565    * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
54566    * For GeometryCollection type use `helpers.geometryCollection`
54567    *
54568    * @name geometry
54569    * @param {string} type Geometry Type
54570    * @param {Array<any>} coordinates Coordinates
54571    * @param {Object} [options={}] Optional Parameters
54572    * @returns {Geometry} a GeoJSON Geometry
54573    * @example
54574    * var type = "Point";
54575    * var coordinates = [110, 50];
54576    * var geometry = turf.geometry(type, coordinates);
54577    * // => geometry
54578    */
54579   function geometry(type, coordinates, options) {
54580       if (options === void 0) { options = {}; }
54581       switch (type) {
54582           case "Point": return point(coordinates).geometry;
54583           case "LineString": return lineString(coordinates).geometry;
54584           case "Polygon": return polygon(coordinates).geometry;
54585           case "MultiPoint": return multiPoint(coordinates).geometry;
54586           case "MultiLineString": return multiLineString(coordinates).geometry;
54587           case "MultiPolygon": return multiPolygon(coordinates).geometry;
54588           default: throw new Error(type + " is invalid");
54589       }
54590   }
54591   exports.geometry = geometry;
54592   /**
54593    * Creates a {@link Point} {@link Feature} from a Position.
54594    *
54595    * @name point
54596    * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
54597    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54598    * @param {Object} [options={}] Optional Parameters
54599    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54600    * @param {string|number} [options.id] Identifier associated with the Feature
54601    * @returns {Feature<Point>} a Point feature
54602    * @example
54603    * var point = turf.point([-75.343, 39.984]);
54604    *
54605    * //=point
54606    */
54607   function point(coordinates, properties, options) {
54608       if (options === void 0) { options = {}; }
54609       var geom = {
54610           type: "Point",
54611           coordinates: coordinates,
54612       };
54613       return feature(geom, properties, options);
54614   }
54615   exports.point = point;
54616   /**
54617    * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
54618    *
54619    * @name points
54620    * @param {Array<Array<number>>} coordinates an array of Points
54621    * @param {Object} [properties={}] Translate these properties to each Feature
54622    * @param {Object} [options={}] Optional Parameters
54623    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
54624    * associated with the FeatureCollection
54625    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
54626    * @returns {FeatureCollection<Point>} Point Feature
54627    * @example
54628    * var points = turf.points([
54629    *   [-75, 39],
54630    *   [-80, 45],
54631    *   [-78, 50]
54632    * ]);
54633    *
54634    * //=points
54635    */
54636   function points(coordinates, properties, options) {
54637       if (options === void 0) { options = {}; }
54638       return featureCollection(coordinates.map(function (coords) {
54639           return point(coords, properties);
54640       }), options);
54641   }
54642   exports.points = points;
54643   /**
54644    * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
54645    *
54646    * @name polygon
54647    * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
54648    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54649    * @param {Object} [options={}] Optional Parameters
54650    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54651    * @param {string|number} [options.id] Identifier associated with the Feature
54652    * @returns {Feature<Polygon>} Polygon Feature
54653    * @example
54654    * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
54655    *
54656    * //=polygon
54657    */
54658   function polygon(coordinates, properties, options) {
54659       if (options === void 0) { options = {}; }
54660       for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
54661           var ring = coordinates_1[_i];
54662           if (ring.length < 4) {
54663               throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
54664           }
54665           for (var j = 0; j < ring[ring.length - 1].length; j++) {
54666               // Check if first point of Polygon contains two numbers
54667               if (ring[ring.length - 1][j] !== ring[0][j]) {
54668                   throw new Error("First and last Position are not equivalent.");
54669               }
54670           }
54671       }
54672       var geom = {
54673           type: "Polygon",
54674           coordinates: coordinates,
54675       };
54676       return feature(geom, properties, options);
54677   }
54678   exports.polygon = polygon;
54679   /**
54680    * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
54681    *
54682    * @name polygons
54683    * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
54684    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54685    * @param {Object} [options={}] Optional Parameters
54686    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54687    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
54688    * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
54689    * @example
54690    * var polygons = turf.polygons([
54691    *   [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
54692    *   [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
54693    * ]);
54694    *
54695    * //=polygons
54696    */
54697   function polygons(coordinates, properties, options) {
54698       if (options === void 0) { options = {}; }
54699       return featureCollection(coordinates.map(function (coords) {
54700           return polygon(coords, properties);
54701       }), options);
54702   }
54703   exports.polygons = polygons;
54704   /**
54705    * Creates a {@link LineString} {@link Feature} from an Array of Positions.
54706    *
54707    * @name lineString
54708    * @param {Array<Array<number>>} coordinates an array of Positions
54709    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54710    * @param {Object} [options={}] Optional Parameters
54711    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54712    * @param {string|number} [options.id] Identifier associated with the Feature
54713    * @returns {Feature<LineString>} LineString Feature
54714    * @example
54715    * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
54716    * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
54717    *
54718    * //=linestring1
54719    * //=linestring2
54720    */
54721   function lineString(coordinates, properties, options) {
54722       if (options === void 0) { options = {}; }
54723       if (coordinates.length < 2) {
54724           throw new Error("coordinates must be an array of two or more positions");
54725       }
54726       var geom = {
54727           type: "LineString",
54728           coordinates: coordinates,
54729       };
54730       return feature(geom, properties, options);
54731   }
54732   exports.lineString = lineString;
54733   /**
54734    * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
54735    *
54736    * @name lineStrings
54737    * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
54738    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54739    * @param {Object} [options={}] Optional Parameters
54740    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
54741    * associated with the FeatureCollection
54742    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
54743    * @returns {FeatureCollection<LineString>} LineString FeatureCollection
54744    * @example
54745    * var linestrings = turf.lineStrings([
54746    *   [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
54747    *   [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
54748    * ]);
54749    *
54750    * //=linestrings
54751    */
54752   function lineStrings(coordinates, properties, options) {
54753       if (options === void 0) { options = {}; }
54754       return featureCollection(coordinates.map(function (coords) {
54755           return lineString(coords, properties);
54756       }), options);
54757   }
54758   exports.lineStrings = lineStrings;
54759   /**
54760    * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
54761    *
54762    * @name featureCollection
54763    * @param {Feature[]} features input features
54764    * @param {Object} [options={}] Optional Parameters
54765    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54766    * @param {string|number} [options.id] Identifier associated with the Feature
54767    * @returns {FeatureCollection} FeatureCollection of Features
54768    * @example
54769    * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
54770    * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
54771    * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
54772    *
54773    * var collection = turf.featureCollection([
54774    *   locationA,
54775    *   locationB,
54776    *   locationC
54777    * ]);
54778    *
54779    * //=collection
54780    */
54781   function featureCollection(features, options) {
54782       if (options === void 0) { options = {}; }
54783       var fc = { type: "FeatureCollection" };
54784       if (options.id) {
54785           fc.id = options.id;
54786       }
54787       if (options.bbox) {
54788           fc.bbox = options.bbox;
54789       }
54790       fc.features = features;
54791       return fc;
54792   }
54793   exports.featureCollection = featureCollection;
54794   /**
54795    * Creates a {@link Feature<MultiLineString>} based on a
54796    * coordinate array. Properties can be added optionally.
54797    *
54798    * @name multiLineString
54799    * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
54800    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54801    * @param {Object} [options={}] Optional Parameters
54802    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54803    * @param {string|number} [options.id] Identifier associated with the Feature
54804    * @returns {Feature<MultiLineString>} a MultiLineString feature
54805    * @throws {Error} if no coordinates are passed
54806    * @example
54807    * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
54808    *
54809    * //=multiLine
54810    */
54811   function multiLineString(coordinates, properties, options) {
54812       if (options === void 0) { options = {}; }
54813       var geom = {
54814           type: "MultiLineString",
54815           coordinates: coordinates,
54816       };
54817       return feature(geom, properties, options);
54818   }
54819   exports.multiLineString = multiLineString;
54820   /**
54821    * Creates a {@link Feature<MultiPoint>} based on a
54822    * coordinate array. Properties can be added optionally.
54823    *
54824    * @name multiPoint
54825    * @param {Array<Array<number>>} coordinates an array of Positions
54826    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54827    * @param {Object} [options={}] Optional Parameters
54828    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54829    * @param {string|number} [options.id] Identifier associated with the Feature
54830    * @returns {Feature<MultiPoint>} a MultiPoint feature
54831    * @throws {Error} if no coordinates are passed
54832    * @example
54833    * var multiPt = turf.multiPoint([[0,0],[10,10]]);
54834    *
54835    * //=multiPt
54836    */
54837   function multiPoint(coordinates, properties, options) {
54838       if (options === void 0) { options = {}; }
54839       var geom = {
54840           type: "MultiPoint",
54841           coordinates: coordinates,
54842       };
54843       return feature(geom, properties, options);
54844   }
54845   exports.multiPoint = multiPoint;
54846   /**
54847    * Creates a {@link Feature<MultiPolygon>} based on a
54848    * coordinate array. Properties can be added optionally.
54849    *
54850    * @name multiPolygon
54851    * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
54852    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54853    * @param {Object} [options={}] Optional Parameters
54854    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54855    * @param {string|number} [options.id] Identifier associated with the Feature
54856    * @returns {Feature<MultiPolygon>} a multipolygon feature
54857    * @throws {Error} if no coordinates are passed
54858    * @example
54859    * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
54860    *
54861    * //=multiPoly
54862    *
54863    */
54864   function multiPolygon(coordinates, properties, options) {
54865       if (options === void 0) { options = {}; }
54866       var geom = {
54867           type: "MultiPolygon",
54868           coordinates: coordinates,
54869       };
54870       return feature(geom, properties, options);
54871   }
54872   exports.multiPolygon = multiPolygon;
54873   /**
54874    * Creates a {@link Feature<GeometryCollection>} based on a
54875    * coordinate array. Properties can be added optionally.
54876    *
54877    * @name geometryCollection
54878    * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
54879    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54880    * @param {Object} [options={}] Optional Parameters
54881    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54882    * @param {string|number} [options.id] Identifier associated with the Feature
54883    * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
54884    * @example
54885    * var pt = turf.geometry("Point", [100, 0]);
54886    * var line = turf.geometry("LineString", [[101, 0], [102, 1]]);
54887    * var collection = turf.geometryCollection([pt, line]);
54888    *
54889    * // => collection
54890    */
54891   function geometryCollection(geometries, properties, options) {
54892       if (options === void 0) { options = {}; }
54893       var geom = {
54894           type: "GeometryCollection",
54895           geometries: geometries,
54896       };
54897       return feature(geom, properties, options);
54898   }
54899   exports.geometryCollection = geometryCollection;
54900   /**
54901    * Round number to precision
54902    *
54903    * @param {number} num Number
54904    * @param {number} [precision=0] Precision
54905    * @returns {number} rounded number
54906    * @example
54907    * turf.round(120.4321)
54908    * //=120
54909    *
54910    * turf.round(120.4321, 2)
54911    * //=120.43
54912    */
54913   function round(num, precision) {
54914       if (precision === void 0) { precision = 0; }
54915       if (precision && !(precision >= 0)) {
54916           throw new Error("precision must be a positive number");
54917       }
54918       var multiplier = Math.pow(10, precision || 0);
54919       return Math.round(num * multiplier) / multiplier;
54920   }
54921   exports.round = round;
54922   /**
54923    * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
54924    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
54925    *
54926    * @name radiansToLength
54927    * @param {number} radians in radians across the sphere
54928    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
54929    * meters, kilometres, kilometers.
54930    * @returns {number} distance
54931    */
54932   function radiansToLength(radians, units) {
54933       if (units === void 0) { units = "kilometers"; }
54934       var factor = exports.factors[units];
54935       if (!factor) {
54936           throw new Error(units + " units is invalid");
54937       }
54938       return radians * factor;
54939   }
54940   exports.radiansToLength = radiansToLength;
54941   /**
54942    * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
54943    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
54944    *
54945    * @name lengthToRadians
54946    * @param {number} distance in real units
54947    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
54948    * meters, kilometres, kilometers.
54949    * @returns {number} radians
54950    */
54951   function lengthToRadians(distance, units) {
54952       if (units === void 0) { units = "kilometers"; }
54953       var factor = exports.factors[units];
54954       if (!factor) {
54955           throw new Error(units + " units is invalid");
54956       }
54957       return distance / factor;
54958   }
54959   exports.lengthToRadians = lengthToRadians;
54960   /**
54961    * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
54962    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
54963    *
54964    * @name lengthToDegrees
54965    * @param {number} distance in real units
54966    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
54967    * meters, kilometres, kilometers.
54968    * @returns {number} degrees
54969    */
54970   function lengthToDegrees(distance, units) {
54971       return radiansToDegrees(lengthToRadians(distance, units));
54972   }
54973   exports.lengthToDegrees = lengthToDegrees;
54974   /**
54975    * Converts any bearing angle from the north line direction (positive clockwise)
54976    * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
54977    *
54978    * @name bearingToAzimuth
54979    * @param {number} bearing angle, between -180 and +180 degrees
54980    * @returns {number} angle between 0 and 360 degrees
54981    */
54982   function bearingToAzimuth(bearing) {
54983       var angle = bearing % 360;
54984       if (angle < 0) {
54985           angle += 360;
54986       }
54987       return angle;
54988   }
54989   exports.bearingToAzimuth = bearingToAzimuth;
54990   /**
54991    * Converts an angle in radians to degrees
54992    *
54993    * @name radiansToDegrees
54994    * @param {number} radians angle in radians
54995    * @returns {number} degrees between 0 and 360 degrees
54996    */
54997   function radiansToDegrees(radians) {
54998       var degrees = radians % (2 * Math.PI);
54999       return degrees * 180 / Math.PI;
55000   }
55001   exports.radiansToDegrees = radiansToDegrees;
55002   /**
55003    * Converts an angle in degrees to radians
55004    *
55005    * @name degreesToRadians
55006    * @param {number} degrees angle between 0 and 360 degrees
55007    * @returns {number} angle in radians
55008    */
55009   function degreesToRadians(degrees) {
55010       var radians = degrees % 360;
55011       return radians * Math.PI / 180;
55012   }
55013   exports.degreesToRadians = degreesToRadians;
55014   /**
55015    * Converts a length to the requested unit.
55016    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
55017    *
55018    * @param {number} length to be converted
55019    * @param {Units} [originalUnit="kilometers"] of the length
55020    * @param {Units} [finalUnit="kilometers"] returned unit
55021    * @returns {number} the converted length
55022    */
55023   function convertLength(length, originalUnit, finalUnit) {
55024       if (originalUnit === void 0) { originalUnit = "kilometers"; }
55025       if (finalUnit === void 0) { finalUnit = "kilometers"; }
55026       if (!(length >= 0)) {
55027           throw new Error("length must be a positive number");
55028       }
55029       return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);
55030   }
55031   exports.convertLength = convertLength;
55032   /**
55033    * Converts a area to the requested unit.
55034    * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
55035    * @param {number} area to be converted
55036    * @param {Units} [originalUnit="meters"] of the distance
55037    * @param {Units} [finalUnit="kilometers"] returned unit
55038    * @returns {number} the converted distance
55039    */
55040   function convertArea(area, originalUnit, finalUnit) {
55041       if (originalUnit === void 0) { originalUnit = "meters"; }
55042       if (finalUnit === void 0) { finalUnit = "kilometers"; }
55043       if (!(area >= 0)) {
55044           throw new Error("area must be a positive number");
55045       }
55046       var startFactor = exports.areaFactors[originalUnit];
55047       if (!startFactor) {
55048           throw new Error("invalid original units");
55049       }
55050       var finalFactor = exports.areaFactors[finalUnit];
55051       if (!finalFactor) {
55052           throw new Error("invalid final units");
55053       }
55054       return (area / startFactor) * finalFactor;
55055   }
55056   exports.convertArea = convertArea;
55057   /**
55058    * isNumber
55059    *
55060    * @param {*} num Number to validate
55061    * @returns {boolean} true/false
55062    * @example
55063    * turf.isNumber(123)
55064    * //=true
55065    * turf.isNumber('foo')
55066    * //=false
55067    */
55068   function isNumber(num) {
55069       return !isNaN(num) && num !== null && !Array.isArray(num) && !/^\s*$/.test(num);
55070   }
55071   exports.isNumber = isNumber;
55072   /**
55073    * isObject
55074    *
55075    * @param {*} input variable to validate
55076    * @returns {boolean} true/false
55077    * @example
55078    * turf.isObject({elevation: 10})
55079    * //=true
55080    * turf.isObject('foo')
55081    * //=false
55082    */
55083   function isObject(input) {
55084       return (!!input) && (input.constructor === Object);
55085   }
55086   exports.isObject = isObject;
55087   /**
55088    * Validate BBox
55089    *
55090    * @private
55091    * @param {Array<number>} bbox BBox to validate
55092    * @returns {void}
55093    * @throws Error if BBox is not valid
55094    * @example
55095    * validateBBox([-180, -40, 110, 50])
55096    * //=OK
55097    * validateBBox([-180, -40])
55098    * //=Error
55099    * validateBBox('Foo')
55100    * //=Error
55101    * validateBBox(5)
55102    * //=Error
55103    * validateBBox(null)
55104    * //=Error
55105    * validateBBox(undefined)
55106    * //=Error
55107    */
55108   function validateBBox(bbox) {
55109       if (!bbox) {
55110           throw new Error("bbox is required");
55111       }
55112       if (!Array.isArray(bbox)) {
55113           throw new Error("bbox must be an Array");
55114       }
55115       if (bbox.length !== 4 && bbox.length !== 6) {
55116           throw new Error("bbox must be an Array of 4 or 6 numbers");
55117       }
55118       bbox.forEach(function (num) {
55119           if (!isNumber(num)) {
55120               throw new Error("bbox must only contain numbers");
55121           }
55122       });
55123   }
55124   exports.validateBBox = validateBBox;
55125   /**
55126    * Validate Id
55127    *
55128    * @private
55129    * @param {string|number} id Id to validate
55130    * @returns {void}
55131    * @throws Error if Id is not valid
55132    * @example
55133    * validateId([-180, -40, 110, 50])
55134    * //=Error
55135    * validateId([-180, -40])
55136    * //=Error
55137    * validateId('Foo')
55138    * //=OK
55139    * validateId(5)
55140    * //=OK
55141    * validateId(null)
55142    * //=Error
55143    * validateId(undefined)
55144    * //=Error
55145    */
55146   function validateId(id) {
55147       if (!id) {
55148           throw new Error("id is required");
55149       }
55150       if (["string", "number"].indexOf(typeof id) === -1) {
55151           throw new Error("id must be a number or a string");
55152       }
55153   }
55154   exports.validateId = validateId;
55155   // Deprecated methods
55156   function radians2degrees() {
55157       throw new Error("method has been renamed to `radiansToDegrees`");
55158   }
55159   exports.radians2degrees = radians2degrees;
55160   function degrees2radians() {
55161       throw new Error("method has been renamed to `degreesToRadians`");
55162   }
55163   exports.degrees2radians = degrees2radians;
55164   function distanceToDegrees() {
55165       throw new Error("method has been renamed to `lengthToDegrees`");
55166   }
55167   exports.distanceToDegrees = distanceToDegrees;
55168   function distanceToRadians() {
55169       throw new Error("method has been renamed to `lengthToRadians`");
55170   }
55171   exports.distanceToRadians = distanceToRadians;
55172   function radiansToDistance() {
55173       throw new Error("method has been renamed to `radiansToLength`");
55174   }
55175   exports.radiansToDistance = radiansToDistance;
55176   function bearingToAngle() {
55177       throw new Error("method has been renamed to `bearingToAzimuth`");
55178   }
55179   exports.bearingToAngle = bearingToAngle;
55180   function convertDistance() {
55181       throw new Error("method has been renamed to `convertLength`");
55182   }
55183   exports.convertDistance = convertDistance;
55184   });
55185
55186   unwrapExports(helpers);
55187   var helpers_1 = helpers.earthRadius;
55188   var helpers_2 = helpers.factors;
55189   var helpers_3 = helpers.unitsFactors;
55190   var helpers_4 = helpers.areaFactors;
55191   var helpers_5 = helpers.feature;
55192   var helpers_6 = helpers.geometry;
55193   var helpers_7 = helpers.point;
55194   var helpers_8 = helpers.points;
55195   var helpers_9 = helpers.polygon;
55196   var helpers_10 = helpers.polygons;
55197   var helpers_11 = helpers.lineString;
55198   var helpers_12 = helpers.lineStrings;
55199   var helpers_13 = helpers.featureCollection;
55200   var helpers_14 = helpers.multiLineString;
55201   var helpers_15 = helpers.multiPoint;
55202   var helpers_16 = helpers.multiPolygon;
55203   var helpers_17 = helpers.geometryCollection;
55204   var helpers_18 = helpers.round;
55205   var helpers_19 = helpers.radiansToLength;
55206   var helpers_20 = helpers.lengthToRadians;
55207   var helpers_21 = helpers.lengthToDegrees;
55208   var helpers_22 = helpers.bearingToAzimuth;
55209   var helpers_23 = helpers.radiansToDegrees;
55210   var helpers_24 = helpers.degreesToRadians;
55211   var helpers_25 = helpers.convertLength;
55212   var helpers_26 = helpers.convertArea;
55213   var helpers_27 = helpers.isNumber;
55214   var helpers_28 = helpers.isObject;
55215   var helpers_29 = helpers.validateBBox;
55216   var helpers_30 = helpers.validateId;
55217   var helpers_31 = helpers.radians2degrees;
55218   var helpers_32 = helpers.degrees2radians;
55219   var helpers_33 = helpers.distanceToDegrees;
55220   var helpers_34 = helpers.distanceToRadians;
55221   var helpers_35 = helpers.radiansToDistance;
55222   var helpers_36 = helpers.bearingToAngle;
55223   var helpers_37 = helpers.convertDistance;
55224
55225   var invariant = createCommonjsModule(function (module, exports) {
55226   Object.defineProperty(exports, "__esModule", { value: true });
55227
55228   /**
55229    * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.
55230    *
55231    * @name getCoord
55232    * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers
55233    * @returns {Array<number>} coordinates
55234    * @example
55235    * var pt = turf.point([10, 10]);
55236    *
55237    * var coord = turf.getCoord(pt);
55238    * //= [10, 10]
55239    */
55240   function getCoord(coord) {
55241       if (!coord) {
55242           throw new Error("coord is required");
55243       }
55244       if (!Array.isArray(coord)) {
55245           if (coord.type === "Feature" && coord.geometry !== null && coord.geometry.type === "Point") {
55246               return coord.geometry.coordinates;
55247           }
55248           if (coord.type === "Point") {
55249               return coord.coordinates;
55250           }
55251       }
55252       if (Array.isArray(coord) && coord.length >= 2 && !Array.isArray(coord[0]) && !Array.isArray(coord[1])) {
55253           return coord;
55254       }
55255       throw new Error("coord must be GeoJSON Point or an Array of numbers");
55256   }
55257   exports.getCoord = getCoord;
55258   /**
55259    * Unwrap coordinates from a Feature, Geometry Object or an Array
55260    *
55261    * @name getCoords
55262    * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array
55263    * @returns {Array<any>} coordinates
55264    * @example
55265    * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);
55266    *
55267    * var coords = turf.getCoords(poly);
55268    * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]
55269    */
55270   function getCoords(coords) {
55271       if (Array.isArray(coords)) {
55272           return coords;
55273       }
55274       // Feature
55275       if (coords.type === "Feature") {
55276           if (coords.geometry !== null) {
55277               return coords.geometry.coordinates;
55278           }
55279       }
55280       else {
55281           // Geometry
55282           if (coords.coordinates) {
55283               return coords.coordinates;
55284           }
55285       }
55286       throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array");
55287   }
55288   exports.getCoords = getCoords;
55289   /**
55290    * Checks if coordinates contains a number
55291    *
55292    * @name containsNumber
55293    * @param {Array<any>} coordinates GeoJSON Coordinates
55294    * @returns {boolean} true if Array contains a number
55295    */
55296   function containsNumber(coordinates) {
55297       if (coordinates.length > 1 && helpers.isNumber(coordinates[0]) && helpers.isNumber(coordinates[1])) {
55298           return true;
55299       }
55300       if (Array.isArray(coordinates[0]) && coordinates[0].length) {
55301           return containsNumber(coordinates[0]);
55302       }
55303       throw new Error("coordinates must only contain numbers");
55304   }
55305   exports.containsNumber = containsNumber;
55306   /**
55307    * Enforce expectations about types of GeoJSON objects for Turf.
55308    *
55309    * @name geojsonType
55310    * @param {GeoJSON} value any GeoJSON object
55311    * @param {string} type expected GeoJSON type
55312    * @param {string} name name of calling function
55313    * @throws {Error} if value is not the expected type.
55314    */
55315   function geojsonType(value, type, name) {
55316       if (!type || !name) {
55317           throw new Error("type and name required");
55318       }
55319       if (!value || value.type !== type) {
55320           throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + value.type);
55321       }
55322   }
55323   exports.geojsonType = geojsonType;
55324   /**
55325    * Enforce expectations about types of {@link Feature} inputs for Turf.
55326    * Internally this uses {@link geojsonType} to judge geometry types.
55327    *
55328    * @name featureOf
55329    * @param {Feature} feature a feature with an expected geometry type
55330    * @param {string} type expected GeoJSON type
55331    * @param {string} name name of calling function
55332    * @throws {Error} error if value is not the expected type.
55333    */
55334   function featureOf(feature, type, name) {
55335       if (!feature) {
55336           throw new Error("No feature passed");
55337       }
55338       if (!name) {
55339           throw new Error(".featureOf() requires a name");
55340       }
55341       if (!feature || feature.type !== "Feature" || !feature.geometry) {
55342           throw new Error("Invalid input to " + name + ", Feature with geometry required");
55343       }
55344       if (!feature.geometry || feature.geometry.type !== type) {
55345           throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
55346       }
55347   }
55348   exports.featureOf = featureOf;
55349   /**
55350    * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.
55351    * Internally this uses {@link geojsonType} to judge geometry types.
55352    *
55353    * @name collectionOf
55354    * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged
55355    * @param {string} type expected GeoJSON type
55356    * @param {string} name name of calling function
55357    * @throws {Error} if value is not the expected type.
55358    */
55359   function collectionOf(featureCollection, type, name) {
55360       if (!featureCollection) {
55361           throw new Error("No featureCollection passed");
55362       }
55363       if (!name) {
55364           throw new Error(".collectionOf() requires a name");
55365       }
55366       if (!featureCollection || featureCollection.type !== "FeatureCollection") {
55367           throw new Error("Invalid input to " + name + ", FeatureCollection required");
55368       }
55369       for (var _i = 0, _a = featureCollection.features; _i < _a.length; _i++) {
55370           var feature = _a[_i];
55371           if (!feature || feature.type !== "Feature" || !feature.geometry) {
55372               throw new Error("Invalid input to " + name + ", Feature with geometry required");
55373           }
55374           if (!feature.geometry || feature.geometry.type !== type) {
55375               throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
55376           }
55377       }
55378   }
55379   exports.collectionOf = collectionOf;
55380   /**
55381    * Get Geometry from Feature or Geometry Object
55382    *
55383    * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object
55384    * @returns {Geometry|null} GeoJSON Geometry Object
55385    * @throws {Error} if geojson is not a Feature or Geometry Object
55386    * @example
55387    * var point = {
55388    *   "type": "Feature",
55389    *   "properties": {},
55390    *   "geometry": {
55391    *     "type": "Point",
55392    *     "coordinates": [110, 40]
55393    *   }
55394    * }
55395    * var geom = turf.getGeom(point)
55396    * //={"type": "Point", "coordinates": [110, 40]}
55397    */
55398   function getGeom(geojson) {
55399       if (geojson.type === "Feature") {
55400           return geojson.geometry;
55401       }
55402       return geojson;
55403   }
55404   exports.getGeom = getGeom;
55405   /**
55406    * Get GeoJSON object's type, Geometry type is prioritize.
55407    *
55408    * @param {GeoJSON} geojson GeoJSON object
55409    * @param {string} [name="geojson"] name of the variable to display in error message
55410    * @returns {string} GeoJSON type
55411    * @example
55412    * var point = {
55413    *   "type": "Feature",
55414    *   "properties": {},
55415    *   "geometry": {
55416    *     "type": "Point",
55417    *     "coordinates": [110, 40]
55418    *   }
55419    * }
55420    * var geom = turf.getType(point)
55421    * //="Point"
55422    */
55423   function getType(geojson, name) {
55424       if (geojson.type === "FeatureCollection") {
55425           return "FeatureCollection";
55426       }
55427       if (geojson.type === "GeometryCollection") {
55428           return "GeometryCollection";
55429       }
55430       if (geojson.type === "Feature" && geojson.geometry !== null) {
55431           return geojson.geometry.type;
55432       }
55433       return geojson.type;
55434   }
55435   exports.getType = getType;
55436   });
55437
55438   unwrapExports(invariant);
55439   var invariant_1 = invariant.getCoord;
55440   var invariant_2 = invariant.getCoords;
55441   var invariant_3 = invariant.containsNumber;
55442   var invariant_4 = invariant.geojsonType;
55443   var invariant_5 = invariant.featureOf;
55444   var invariant_6 = invariant.collectionOf;
55445   var invariant_7 = invariant.getGeom;
55446   var invariant_8 = invariant.getType;
55447
55448   var lineclip_1$1 = lineclip$1;
55449   var default_1$1 = lineclip$1;
55450
55451   lineclip$1.polyline = lineclip$1;
55452   lineclip$1.polygon = polygonclip$1;
55453
55454
55455   // Cohen-Sutherland line clippign algorithm, adapted to efficiently
55456   // handle polylines rather than just segments
55457
55458   function lineclip$1(points, bbox, result) {
55459
55460       var len = points.length,
55461           codeA = bitCode$1(points[0], bbox),
55462           part = [],
55463           i, a, b, codeB, lastCode;
55464
55465       if (!result) result = [];
55466
55467       for (i = 1; i < len; i++) {
55468           a = points[i - 1];
55469           b = points[i];
55470           codeB = lastCode = bitCode$1(b, bbox);
55471
55472           while (true) {
55473
55474               if (!(codeA | codeB)) { // accept
55475                   part.push(a);
55476
55477                   if (codeB !== lastCode) { // segment went outside
55478                       part.push(b);
55479
55480                       if (i < len - 1) { // start a new line
55481                           result.push(part);
55482                           part = [];
55483                       }
55484                   } else if (i === len - 1) {
55485                       part.push(b);
55486                   }
55487                   break;
55488
55489               } else if (codeA & codeB) { // trivial reject
55490                   break;
55491
55492               } else if (codeA) { // a outside, intersect with clip edge
55493                   a = intersect$2(a, b, codeA, bbox);
55494                   codeA = bitCode$1(a, bbox);
55495
55496               } else { // b outside
55497                   b = intersect$2(a, b, codeB, bbox);
55498                   codeB = bitCode$1(b, bbox);
55499               }
55500           }
55501
55502           codeA = lastCode;
55503       }
55504
55505       if (part.length) result.push(part);
55506
55507       return result;
55508   }
55509
55510   // Sutherland-Hodgeman polygon clipping algorithm
55511
55512   function polygonclip$1(points, bbox) {
55513
55514       var result, edge, prev, prevInside, i, p, inside;
55515
55516       // clip against each side of the clip rectangle
55517       for (edge = 1; edge <= 8; edge *= 2) {
55518           result = [];
55519           prev = points[points.length - 1];
55520           prevInside = !(bitCode$1(prev, bbox) & edge);
55521
55522           for (i = 0; i < points.length; i++) {
55523               p = points[i];
55524               inside = !(bitCode$1(p, bbox) & edge);
55525
55526               // if segment goes through the clip window, add an intersection
55527               if (inside !== prevInside) result.push(intersect$2(prev, p, edge, bbox));
55528
55529               if (inside) result.push(p); // add a point if it's inside
55530
55531               prev = p;
55532               prevInside = inside;
55533           }
55534
55535           points = result;
55536
55537           if (!points.length) break;
55538       }
55539
55540       return result;
55541   }
55542
55543   // intersect a segment against one of the 4 lines that make up the bbox
55544
55545   function intersect$2(a, b, edge, bbox) {
55546       return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
55547              edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
55548              edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
55549              edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
55550              null;
55551   }
55552
55553   // bit code reflects the point position relative to the bbox:
55554
55555   //         left  mid  right
55556   //    top  1001  1000  1010
55557   //    mid  0001  0000  0010
55558   // bottom  0101  0100  0110
55559
55560   function bitCode$1(p, bbox) {
55561       var code = 0;
55562
55563       if (p[0] < bbox[0]) code |= 1; // left
55564       else if (p[0] > bbox[2]) code |= 2; // right
55565
55566       if (p[1] < bbox[1]) code |= 4; // bottom
55567       else if (p[1] > bbox[3]) code |= 8; // top
55568
55569       return code;
55570   }
55571   lineclip_1$1.default = default_1$1;
55572
55573   var bboxClip_1 = createCommonjsModule(function (module, exports) {
55574   var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
55575       if (mod && mod.__esModule) return mod;
55576       var result = {};
55577       if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
55578       result["default"] = mod;
55579       return result;
55580   };
55581   Object.defineProperty(exports, "__esModule", { value: true });
55582
55583
55584   var lineclip = __importStar(lineclip_1$1);
55585   /**
55586    * Takes a {@link Feature} and a bbox and clips the feature to the bbox using
55587    * [lineclip](https://github.com/mapbox/lineclip).
55588    * May result in degenerate edges when clipping Polygons.
55589    *
55590    * @name bboxClip
55591    * @param {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature feature to clip to the bbox
55592    * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order
55593    * @returns {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} clipped Feature
55594    * @example
55595    * var bbox = [0, 0, 10, 10];
55596    * var poly = turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]);
55597    *
55598    * var clipped = turf.bboxClip(poly, bbox);
55599    *
55600    * //addToMap
55601    * var addToMap = [bbox, poly, clipped]
55602    */
55603   function bboxClip(feature, bbox) {
55604       var geom = invariant.getGeom(feature);
55605       var type = geom.type;
55606       var properties = feature.type === "Feature" ? feature.properties : {};
55607       var coords = geom.coordinates;
55608       switch (type) {
55609           case "LineString":
55610           case "MultiLineString":
55611               var lines_1 = [];
55612               if (type === "LineString") {
55613                   coords = [coords];
55614               }
55615               coords.forEach(function (line) {
55616                   lineclip.polyline(line, bbox, lines_1);
55617               });
55618               if (lines_1.length === 1) {
55619                   return helpers.lineString(lines_1[0], properties);
55620               }
55621               return helpers.multiLineString(lines_1, properties);
55622           case "Polygon":
55623               return helpers.polygon(clipPolygon(coords, bbox), properties);
55624           case "MultiPolygon":
55625               return helpers.multiPolygon(coords.map(function (poly) {
55626                   return clipPolygon(poly, bbox);
55627               }), properties);
55628           default:
55629               throw new Error("geometry " + type + " not supported");
55630       }
55631   }
55632   exports.default = bboxClip;
55633   function clipPolygon(rings, bbox) {
55634       var outRings = [];
55635       for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) {
55636           var ring = rings_1[_i];
55637           var clipped = lineclip.polygon(ring, bbox);
55638           if (clipped.length > 0) {
55639               if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) {
55640                   clipped.push(clipped[0]);
55641               }
55642               if (clipped.length >= 4) {
55643                   outRings.push(clipped);
55644               }
55645           }
55646       }
55647       return outRings;
55648   }
55649   });
55650
55651   var turf_bboxClip = unwrapExports(bboxClip_1);
55652
55653   var martinez_umd = createCommonjsModule(function (module, exports) {
55654   /**
55655    * martinez v0.5.0
55656    * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor
55657    *
55658    * @author Alex Milevski <info@w8r.name>
55659    * @license MIT
55660    * @preserve
55661    */
55662
55663   (function (global, factory) {
55664     factory(exports);
55665   }(commonjsGlobal, (function (exports) {
55666     function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
55667
55668     var SplayTree = function SplayTree(compare, noDuplicates) {
55669       if ( compare === void 0 ) compare = DEFAULT_COMPARE;
55670       if ( noDuplicates === void 0 ) noDuplicates = false;
55671
55672       this._compare = compare;
55673       this._root = null;
55674       this._size = 0;
55675       this._noDuplicates = !!noDuplicates;
55676     };
55677
55678     var prototypeAccessors = { size: { configurable: true } };
55679
55680
55681     SplayTree.prototype.rotateLeft = function rotateLeft (x) {
55682       var y = x.right;
55683       if (y) {
55684         x.right = y.left;
55685         if (y.left) { y.left.parent = x; }
55686         y.parent = x.parent;
55687       }
55688
55689       if (!x.parent)              { this._root = y; }
55690       else if (x === x.parent.left) { x.parent.left = y; }
55691       else                        { x.parent.right = y; }
55692       if (y) { y.left = x; }
55693       x.parent = y;
55694     };
55695
55696
55697     SplayTree.prototype.rotateRight = function rotateRight (x) {
55698       var y = x.left;
55699       if (y) {
55700         x.left = y.right;
55701         if (y.right) { y.right.parent = x; }
55702         y.parent = x.parent;
55703       }
55704
55705       if (!x.parent)             { this._root = y; }
55706       else if(x === x.parent.left) { x.parent.left = y; }
55707       else                       { x.parent.right = y; }
55708       if (y) { y.right = x; }
55709       x.parent = y;
55710     };
55711
55712
55713     SplayTree.prototype._splay = function _splay (x) {
55714         var this$1 = this;
55715
55716       while (x.parent) {
55717         var p = x.parent;
55718         if (!p.parent) {
55719           if (p.left === x) { this$1.rotateRight(p); }
55720           else            { this$1.rotateLeft(p); }
55721         } else if (p.left === x && p.parent.left === p) {
55722           this$1.rotateRight(p.parent);
55723           this$1.rotateRight(p);
55724         } else if (p.right === x && p.parent.right === p) {
55725           this$1.rotateLeft(p.parent);
55726           this$1.rotateLeft(p);
55727         } else if (p.left === x && p.parent.right === p) {
55728           this$1.rotateRight(p);
55729           this$1.rotateLeft(p);
55730         } else {
55731           this$1.rotateLeft(p);
55732           this$1.rotateRight(p);
55733         }
55734       }
55735     };
55736
55737
55738     SplayTree.prototype.splay = function splay (x) {
55739         var this$1 = this;
55740
55741       var p, gp, ggp, l, r;
55742
55743       while (x.parent) {
55744         p = x.parent;
55745         gp = p.parent;
55746
55747         if (gp && gp.parent) {
55748           ggp = gp.parent;
55749           if (ggp.left === gp) { ggp.left= x; }
55750           else               { ggp.right = x; }
55751           x.parent = ggp;
55752         } else {
55753           x.parent = null;
55754           this$1._root = x;
55755         }
55756
55757         l = x.left; r = x.right;
55758
55759         if (x === p.left) { // left
55760           if (gp) {
55761             if (gp.left === p) {
55762               /* zig-zig */
55763               if (p.right) {
55764                 gp.left = p.right;
55765                 gp.left.parent = gp;
55766               } else { gp.left = null; }
55767
55768               p.right = gp;
55769               gp.parent = p;
55770             } else {
55771               /* zig-zag */
55772               if (l) {
55773                 gp.right = l;
55774                 l.parent = gp;
55775               } else { gp.right = null; }
55776
55777               x.left  = gp;
55778               gp.parent = x;
55779             }
55780           }
55781           if (r) {
55782             p.left = r;
55783             r.parent = p;
55784           } else { p.left = null; }
55785
55786           x.right= p;
55787           p.parent = x;
55788         } else { // right
55789           if (gp) {
55790             if (gp.right === p) {
55791               /* zig-zig */
55792               if (p.left) {
55793                 gp.right = p.left;
55794                 gp.right.parent = gp;
55795               } else { gp.right = null; }
55796
55797               p.left = gp;
55798               gp.parent = p;
55799             } else {
55800               /* zig-zag */
55801               if (r) {
55802                 gp.left = r;
55803                 r.parent = gp;
55804               } else { gp.left = null; }
55805
55806               x.right = gp;
55807               gp.parent = x;
55808             }
55809           }
55810           if (l) {
55811             p.right = l;
55812             l.parent = p;
55813           } else { p.right = null; }
55814
55815           x.left = p;
55816           p.parent = x;
55817         }
55818       }
55819     };
55820
55821
55822     SplayTree.prototype.replace = function replace (u, v) {
55823       if (!u.parent) { this._root = v; }
55824       else if (u === u.parent.left) { u.parent.left = v; }
55825       else { u.parent.right = v; }
55826       if (v) { v.parent = u.parent; }
55827     };
55828
55829
55830     SplayTree.prototype.minNode = function minNode (u) {
55831         if ( u === void 0 ) u = this._root;
55832
55833       if (u) { while (u.left) { u = u.left; } }
55834       return u;
55835     };
55836
55837
55838     SplayTree.prototype.maxNode = function maxNode (u) {
55839         if ( u === void 0 ) u = this._root;
55840
55841       if (u) { while (u.right) { u = u.right; } }
55842       return u;
55843     };
55844
55845
55846     SplayTree.prototype.insert = function insert (key, data) {
55847       var z = this._root;
55848       var p = null;
55849       var comp = this._compare;
55850       var cmp;
55851
55852       if (this._noDuplicates) {
55853         while (z) {
55854           p = z;
55855           cmp = comp(z.key, key);
55856           if (cmp === 0) { return; }
55857           else if (comp(z.key, key) < 0) { z = z.right; }
55858           else { z = z.left; }
55859         }
55860       } else {
55861         while (z) {
55862           p = z;
55863           if (comp(z.key, key) < 0) { z = z.right; }
55864           else { z = z.left; }
55865         }
55866       }
55867
55868       z = { key: key, data: data, left: null, right: null, parent: p };
55869
55870       if (!p)                        { this._root = z; }
55871       else if (comp(p.key, z.key) < 0) { p.right = z; }
55872       else                           { p.left= z; }
55873
55874       this.splay(z);
55875       this._size++;
55876       return z;
55877     };
55878
55879
55880     SplayTree.prototype.find = function find (key) {
55881       var z  = this._root;
55882       var comp = this._compare;
55883       while (z) {
55884         var cmp = comp(z.key, key);
55885         if    (cmp < 0) { z = z.right; }
55886         else if (cmp > 0) { z = z.left; }
55887         else            { return z; }
55888       }
55889       return null;
55890     };
55891
55892     /**
55893      * Whether the tree contains a node with the given key
55894      * @param{Key} key
55895      * @return {boolean} true/false
55896      */
55897     SplayTree.prototype.contains = function contains (key) {
55898       var node     = this._root;
55899       var comparator = this._compare;
55900       while (node){
55901         var cmp = comparator(key, node.key);
55902         if    (cmp === 0) { return true; }
55903         else if (cmp < 0) { node = node.left; }
55904         else              { node = node.right; }
55905       }
55906
55907       return false;
55908     };
55909
55910
55911     SplayTree.prototype.remove = function remove (key) {
55912       var z = this.find(key);
55913
55914       if (!z) { return false; }
55915
55916       this.splay(z);
55917
55918       if (!z.left) { this.replace(z, z.right); }
55919       else if (!z.right) { this.replace(z, z.left); }
55920       else {
55921         var y = this.minNode(z.right);
55922         if (y.parent !== z) {
55923           this.replace(y, y.right);
55924           y.right = z.right;
55925           y.right.parent = y;
55926         }
55927         this.replace(z, y);
55928         y.left = z.left;
55929         y.left.parent = y;
55930       }
55931
55932       this._size--;
55933       return true;
55934     };
55935
55936
55937     SplayTree.prototype.removeNode = function removeNode (z) {
55938       if (!z) { return false; }
55939
55940       this.splay(z);
55941
55942       if (!z.left) { this.replace(z, z.right); }
55943       else if (!z.right) { this.replace(z, z.left); }
55944       else {
55945         var y = this.minNode(z.right);
55946         if (y.parent !== z) {
55947           this.replace(y, y.right);
55948           y.right = z.right;
55949           y.right.parent = y;
55950         }
55951         this.replace(z, y);
55952         y.left = z.left;
55953         y.left.parent = y;
55954       }
55955
55956       this._size--;
55957       return true;
55958     };
55959
55960
55961     SplayTree.prototype.erase = function erase (key) {
55962       var z = this.find(key);
55963       if (!z) { return; }
55964
55965       this.splay(z);
55966
55967       var s = z.left;
55968       var t = z.right;
55969
55970       var sMax = null;
55971       if (s) {
55972         s.parent = null;
55973         sMax = this.maxNode(s);
55974         this.splay(sMax);
55975         this._root = sMax;
55976       }
55977       if (t) {
55978         if (s) { sMax.right = t; }
55979         else { this._root = t; }
55980         t.parent = sMax;
55981       }
55982
55983       this._size--;
55984     };
55985
55986     /**
55987      * Removes and returns the node with smallest key
55988      * @return {?Node}
55989      */
55990     SplayTree.prototype.pop = function pop () {
55991       var node = this._root, returnValue = null;
55992       if (node) {
55993         while (node.left) { node = node.left; }
55994         returnValue = { key: node.key, data: node.data };
55995         this.remove(node.key);
55996       }
55997       return returnValue;
55998     };
55999
56000
56001     /* eslint-disable class-methods-use-this */
56002
56003     /**
56004      * Successor node
56005      * @param{Node} node
56006      * @return {?Node}
56007      */
56008     SplayTree.prototype.next = function next (node) {
56009       var successor = node;
56010       if (successor) {
56011         if (successor.right) {
56012           successor = successor.right;
56013           while (successor && successor.left) { successor = successor.left; }
56014         } else {
56015           successor = node.parent;
56016           while (successor && successor.right === node) {
56017             node = successor; successor = successor.parent;
56018           }
56019         }
56020       }
56021       return successor;
56022     };
56023
56024
56025     /**
56026      * Predecessor node
56027      * @param{Node} node
56028      * @return {?Node}
56029      */
56030     SplayTree.prototype.prev = function prev (node) {
56031       var predecessor = node;
56032       if (predecessor) {
56033         if (predecessor.left) {
56034           predecessor = predecessor.left;
56035           while (predecessor && predecessor.right) { predecessor = predecessor.right; }
56036         } else {
56037           predecessor = node.parent;
56038           while (predecessor && predecessor.left === node) {
56039             node = predecessor;
56040             predecessor = predecessor.parent;
56041           }
56042         }
56043       }
56044       return predecessor;
56045     };
56046     /* eslint-enable class-methods-use-this */
56047
56048
56049     /**
56050      * @param{forEachCallback} callback
56051      * @return {SplayTree}
56052      */
56053     SplayTree.prototype.forEach = function forEach (callback) {
56054       var current = this._root;
56055       var s = [], done = false, i = 0;
56056
56057       while (!done) {
56058         // Reach the left most Node of the current Node
56059         if (current) {
56060           // Place pointer to a tree node on the stack
56061           // before traversing the node's left subtree
56062           s.push(current);
56063           current = current.left;
56064         } else {
56065           // BackTrack from the empty subtree and visit the Node
56066           // at the top of the stack; however, if the stack is
56067           // empty you are done
56068           if (s.length > 0) {
56069             current = s.pop();
56070             callback(current, i++);
56071
56072             // We have visited the node and its left
56073             // subtree. Now, it's right subtree's turn
56074             current = current.right;
56075           } else { done = true; }
56076         }
56077       }
56078       return this;
56079     };
56080
56081
56082     /**
56083      * Walk key range from `low` to `high`. Stops if `fn` returns a value.
56084      * @param{Key}    low
56085      * @param{Key}    high
56086      * @param{Function} fn
56087      * @param{*?}     ctx
56088      * @return {SplayTree}
56089      */
56090     SplayTree.prototype.range = function range (low, high, fn, ctx) {
56091         var this$1 = this;
56092
56093       var Q = [];
56094       var compare = this._compare;
56095       var node = this._root, cmp;
56096
56097       while (Q.length !== 0 || node) {
56098         if (node) {
56099           Q.push(node);
56100           node = node.left;
56101         } else {
56102           node = Q.pop();
56103           cmp = compare(node.key, high);
56104           if (cmp > 0) {
56105             break;
56106           } else if (compare(node.key, low) >= 0) {
56107             if (fn.call(ctx, node)) { return this$1; } // stop if smth is returned
56108           }
56109           node = node.right;
56110         }
56111       }
56112       return this;
56113     };
56114
56115     /**
56116      * Returns all keys in order
56117      * @return {Array<Key>}
56118      */
56119     SplayTree.prototype.keys = function keys () {
56120       var current = this._root;
56121       var s = [], r = [], done = false;
56122
56123       while (!done) {
56124         if (current) {
56125           s.push(current);
56126           current = current.left;
56127         } else {
56128           if (s.length > 0) {
56129             current = s.pop();
56130             r.push(current.key);
56131             current = current.right;
56132           } else { done = true; }
56133         }
56134       }
56135       return r;
56136     };
56137
56138
56139     /**
56140      * Returns `data` fields of all nodes in order.
56141      * @return {Array<Value>}
56142      */
56143     SplayTree.prototype.values = function values () {
56144       var current = this._root;
56145       var s = [], r = [], done = false;
56146
56147       while (!done) {
56148         if (current) {
56149           s.push(current);
56150           current = current.left;
56151         } else {
56152           if (s.length > 0) {
56153             current = s.pop();
56154             r.push(current.data);
56155             current = current.right;
56156           } else { done = true; }
56157         }
56158       }
56159       return r;
56160     };
56161
56162
56163     /**
56164      * Returns node at given index
56165      * @param{number} index
56166      * @return {?Node}
56167      */
56168     SplayTree.prototype.at = function at (index) {
56169       // removed after a consideration, more misleading than useful
56170       // index = index % this.size;
56171       // if (index < 0) index = this.size - index;
56172
56173       var current = this._root;
56174       var s = [], done = false, i = 0;
56175
56176       while (!done) {
56177         if (current) {
56178           s.push(current);
56179           current = current.left;
56180         } else {
56181           if (s.length > 0) {
56182             current = s.pop();
56183             if (i === index) { return current; }
56184             i++;
56185             current = current.right;
56186           } else { done = true; }
56187         }
56188       }
56189       return null;
56190     };
56191
56192     /**
56193      * Bulk-load items. Both array have to be same size
56194      * @param{Array<Key>}  keys
56195      * @param{Array<Value>}[values]
56196      * @param{Boolean}     [presort=false] Pre-sort keys and values, using
56197      *                                       tree's comparator. Sorting is done
56198      *                                       in-place
56199      * @return {AVLTree}
56200      */
56201     SplayTree.prototype.load = function load (keys, values, presort) {
56202         if ( keys === void 0 ) keys = [];
56203         if ( values === void 0 ) values = [];
56204         if ( presort === void 0 ) presort = false;
56205
56206       if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); }
56207       var size = keys.length;
56208       if (presort) { sort(keys, values, 0, size - 1, this._compare); }
56209       this._root = loadRecursive(null, keys, values, 0, size);
56210       this._size = size;
56211       return this;
56212     };
56213
56214
56215     SplayTree.prototype.min = function min () {
56216       var node = this.minNode(this._root);
56217       if (node) { return node.key; }
56218       else    { return null; }
56219     };
56220
56221
56222     SplayTree.prototype.max = function max () {
56223       var node = this.maxNode(this._root);
56224       if (node) { return node.key; }
56225       else    { return null; }
56226     };
56227
56228     SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
56229     prototypeAccessors.size.get = function () { return this._size; };
56230
56231
56232     /**
56233      * Create a tree and load it with items
56234      * @param{Array<Key>}        keys
56235      * @param{Array<Value>?}      [values]
56236
56237      * @param{Function?}          [comparator]
56238      * @param{Boolean?}           [presort=false] Pre-sort keys and values, using
56239      *                                             tree's comparator. Sorting is done
56240      *                                             in-place
56241      * @param{Boolean?}           [noDuplicates=false] Allow duplicates
56242      * @return {SplayTree}
56243      */
56244     SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) {
56245       return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
56246     };
56247
56248     Object.defineProperties( SplayTree.prototype, prototypeAccessors );
56249
56250
56251     function loadRecursive (parent, keys, values, start, end) {
56252       var size = end - start;
56253       if (size > 0) {
56254         var middle = start + Math.floor(size / 2);
56255         var key    = keys[middle];
56256         var data   = values[middle];
56257         var node   = { key: key, data: data, parent: parent };
56258         node.left    = loadRecursive(node, keys, values, start, middle);
56259         node.right   = loadRecursive(node, keys, values, middle + 1, end);
56260         return node;
56261       }
56262       return null;
56263     }
56264
56265
56266     function sort(keys, values, left, right, compare) {
56267       if (left >= right) { return; }
56268
56269       var pivot = keys[(left + right) >> 1];
56270       var i = left - 1;
56271       var j = right + 1;
56272
56273       while (true) {
56274         do { i++; } while (compare(keys[i], pivot) < 0);
56275         do { j--; } while (compare(keys[j], pivot) > 0);
56276         if (i >= j) { break; }
56277
56278         var tmp = keys[i];
56279         keys[i] = keys[j];
56280         keys[j] = tmp;
56281
56282         tmp = values[i];
56283         values[i] = values[j];
56284         values[j] = tmp;
56285       }
56286
56287       sort(keys, values,  left,     j, compare);
56288       sort(keys, values, j + 1, right, compare);
56289     }
56290
56291     var NORMAL               = 0;
56292     var NON_CONTRIBUTING     = 1;
56293     var SAME_TRANSITION      = 2;
56294     var DIFFERENT_TRANSITION = 3;
56295
56296     var INTERSECTION = 0;
56297     var UNION        = 1;
56298     var DIFFERENCE   = 2;
56299     var XOR          = 3;
56300
56301     /**
56302      * @param  {SweepEvent} event
56303      * @param  {SweepEvent} prev
56304      * @param  {Operation} operation
56305      */
56306     function computeFields (event, prev, operation) {
56307       // compute inOut and otherInOut fields
56308       if (prev === null) {
56309         event.inOut      = false;
56310         event.otherInOut = true;
56311
56312       // previous line segment in sweepline belongs to the same polygon
56313       } else {
56314         if (event.isSubject === prev.isSubject) {
56315           event.inOut      = !prev.inOut;
56316           event.otherInOut = prev.otherInOut;
56317
56318         // previous line segment in sweepline belongs to the clipping polygon
56319         } else {
56320           event.inOut      = !prev.otherInOut;
56321           event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut;
56322         }
56323
56324         // compute prevInResult field
56325         if (prev) {
56326           event.prevInResult = (!inResult(prev, operation) || prev.isVertical())
56327             ? prev.prevInResult : prev;
56328         }
56329       }
56330
56331       // check if the line segment belongs to the Boolean operation
56332       event.inResult = inResult(event, operation);
56333     }
56334
56335
56336     /* eslint-disable indent */
56337     function inResult(event, operation) {
56338       switch (event.type) {
56339         case NORMAL:
56340           switch (operation) {
56341             case INTERSECTION:
56342               return !event.otherInOut;
56343             case UNION:
56344               return event.otherInOut;
56345             case DIFFERENCE:
56346               // return (event.isSubject && !event.otherInOut) ||
56347               //         (!event.isSubject && event.otherInOut);
56348               return (event.isSubject && event.otherInOut) ||
56349                       (!event.isSubject && !event.otherInOut);
56350             case XOR:
56351               return true;
56352           }
56353           break;
56354         case SAME_TRANSITION:
56355           return operation === INTERSECTION || operation === UNION;
56356         case DIFFERENT_TRANSITION:
56357           return operation === DIFFERENCE;
56358         case NON_CONTRIBUTING:
56359           return false;
56360       }
56361       return false;
56362     }
56363     /* eslint-enable indent */
56364
56365     var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
56366
56367       /**
56368        * Is left endpoint?
56369        * @type {Boolean}
56370        */
56371       this.left = left;
56372
56373       /**
56374        * @type {Array.<Number>}
56375        */
56376       this.point = point;
56377
56378       /**
56379        * Other edge reference
56380        * @type {SweepEvent}
56381        */
56382       this.otherEvent = otherEvent;
56383
56384       /**
56385        * Belongs to source or clipping polygon
56386        * @type {Boolean}
56387        */
56388       this.isSubject = isSubject;
56389
56390       /**
56391        * Edge contribution type
56392        * @type {Number}
56393        */
56394       this.type = edgeType || NORMAL;
56395
56396
56397       /**
56398        * In-out transition for the sweepline crossing polygon
56399        * @type {Boolean}
56400        */
56401       this.inOut = false;
56402
56403
56404       /**
56405        * @type {Boolean}
56406        */
56407       this.otherInOut = false;
56408
56409       /**
56410        * Previous event in result?
56411        * @type {SweepEvent}
56412        */
56413       this.prevInResult = null;
56414
56415       /**
56416        * Does event belong to result?
56417        * @type {Boolean}
56418        */
56419       this.inResult = false;
56420
56421
56422       // connection step
56423
56424       /**
56425        * @type {Boolean}
56426        */
56427       this.resultInOut = false;
56428
56429       this.isExteriorRing = true;
56430     };
56431
56432
56433     /**
56434      * @param{Array.<Number>}p
56435      * @return {Boolean}
56436      */
56437     SweepEvent.prototype.isBelow = function isBelow (p) {
56438       var p0 = this.point, p1 = this.otherEvent.point;
56439       return this.left
56440         ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0
56441         // signedArea(this.point, this.otherEvent.point, p) > 0 :
56442         : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0;
56443         //signedArea(this.otherEvent.point, this.point, p) > 0;
56444     };
56445
56446
56447     /**
56448      * @param{Array.<Number>}p
56449      * @return {Boolean}
56450      */
56451     SweepEvent.prototype.isAbove = function isAbove (p) {
56452       return !this.isBelow(p);
56453     };
56454
56455
56456     /**
56457      * @return {Boolean}
56458      */
56459     SweepEvent.prototype.isVertical = function isVertical () {
56460       return this.point[0] === this.otherEvent.point[0];
56461     };
56462
56463
56464     SweepEvent.prototype.clone = function clone () {
56465       var copy = new SweepEvent(
56466         this.point, this.left, this.otherEvent, this.isSubject, this.type);
56467
56468       copy.inResult     = this.inResult;
56469       copy.prevInResult = this.prevInResult;
56470       copy.isExteriorRing = this.isExteriorRing;
56471       copy.inOut        = this.inOut;
56472       copy.otherInOut   = this.otherInOut;
56473
56474       return copy;
56475     };
56476
56477     function equals(p1, p2) {
56478       if (p1[0] === p2[0]) {
56479         if (p1[1] === p2[1]) {
56480           return true;
56481         } else {
56482           return false;
56483         }
56484       }
56485       return false;
56486     }
56487
56488     // const EPSILON = 1e-9;
56489     // const abs = Math.abs;
56490     // TODO https://github.com/w8r/martinez/issues/6#issuecomment-262847164
56491     // Precision problem.
56492     //
56493     // module.exports = function equals(p1, p2) {
56494     //   return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
56495     // };
56496
56497     /**
56498      * Signed area of the triangle (p0, p1, p2)
56499      * @param  {Array.<Number>} p0
56500      * @param  {Array.<Number>} p1
56501      * @param  {Array.<Number>} p2
56502      * @return {Number}
56503      */
56504     function signedArea(p0, p1, p2) {
56505       return (p0[0] - p2[0]) * (p1[1] - p2[1]) - (p1[0] - p2[0]) * (p0[1] - p2[1]);
56506     }
56507
56508     /**
56509      * @param  {SweepEvent} e1
56510      * @param  {SweepEvent} e2
56511      * @return {Number}
56512      */
56513     function compareEvents(e1, e2) {
56514       var p1 = e1.point;
56515       var p2 = e2.point;
56516
56517       // Different x-coordinate
56518       if (p1[0] > p2[0]) { return 1; }
56519       if (p1[0] < p2[0]) { return -1; }
56520
56521       // Different points, but same x-coordinate
56522       // Event with lower y-coordinate is processed first
56523       if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
56524
56525       return specialCases(e1, e2, p1, p2);
56526     }
56527
56528
56529     /* eslint-disable no-unused-vars */
56530     function specialCases(e1, e2, p1, p2) {
56531       // Same coordinates, but one is a left endpoint and the other is
56532       // a right endpoint. The right endpoint is processed first
56533       if (e1.left !== e2.left)
56534         { return e1.left ? 1 : -1; }
56535
56536       // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
56537       // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
56538       // Same coordinates, both events
56539       // are left endpoints or right endpoints.
56540       // not collinear
56541       if (signedArea(p1, e1.otherEvent.point, e2.otherEvent.point) !== 0) {
56542         // the event associate to the bottom segment is processed first
56543         return (!e1.isBelow(e2.otherEvent.point)) ? 1 : -1;
56544       }
56545
56546       return (!e1.isSubject && e2.isSubject) ? 1 : -1;
56547     }
56548     /* eslint-enable no-unused-vars */
56549
56550     /**
56551      * @param  {SweepEvent} se
56552      * @param  {Array.<Number>} p
56553      * @param  {Queue} queue
56554      * @return {Queue}
56555      */
56556     function divideSegment(se, p, queue)  {
56557       var r = new SweepEvent(p, false, se,            se.isSubject);
56558       var l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
56559
56560       /* eslint-disable no-console */
56561       if (equals(se.point, se.otherEvent.point)) {
56562
56563         console.warn('what is that, a collapsed segment?', se);
56564       }
56565       /* eslint-enable no-console */
56566
56567       r.contourId = l.contourId = se.contourId;
56568
56569       // avoid a rounding error. The left event would be processed after the right event
56570       if (compareEvents(l, se.otherEvent) > 0) {
56571         se.otherEvent.left = true;
56572         l.left = false;
56573       }
56574
56575       // avoid a rounding error. The left event would be processed after the right event
56576       // if (compareEvents(se, r) > 0) {}
56577
56578       se.otherEvent.otherEvent = l;
56579       se.otherEvent = r;
56580
56581       queue.push(l);
56582       queue.push(r);
56583
56584       return queue;
56585     }
56586
56587     //const EPS = 1e-9;
56588
56589     /**
56590      * Finds the magnitude of the cross product of two vectors (if we pretend
56591      * they're in three dimensions)
56592      *
56593      * @param {Object} a First vector
56594      * @param {Object} b Second vector
56595      * @private
56596      * @returns {Number} The magnitude of the cross product
56597      */
56598     function crossProduct(a, b) {
56599       return (a[0] * b[1]) - (a[1] * b[0]);
56600     }
56601
56602     /**
56603      * Finds the dot product of two vectors.
56604      *
56605      * @param {Object} a First vector
56606      * @param {Object} b Second vector
56607      * @private
56608      * @returns {Number} The dot product
56609      */
56610     function dotProduct(a, b) {
56611       return (a[0] * b[0]) + (a[1] * b[1]);
56612     }
56613
56614     /**
56615      * Finds the intersection (if any) between two line segments a and b, given the
56616      * line segments' end points a1, a2 and b1, b2.
56617      *
56618      * This algorithm is based on Schneider and Eberly.
56619      * http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf
56620      * Page 244.
56621      *
56622      * @param {Array.<Number>} a1 point of first line
56623      * @param {Array.<Number>} a2 point of first line
56624      * @param {Array.<Number>} b1 point of second line
56625      * @param {Array.<Number>} b2 point of second line
56626      * @param {Boolean=}       noEndpointTouch whether to skip single touchpoints
56627      *                                         (meaning connected segments) as
56628      *                                         intersections
56629      * @returns {Array.<Array.<Number>>|Null} If the lines intersect, the point of
56630      * intersection. If they overlap, the two end points of the overlapping segment.
56631      * Otherwise, null.
56632      */
56633     function intersection (a1, a2, b1, b2, noEndpointTouch) {
56634       // The algorithm expects our lines in the form P + sd, where P is a point,
56635       // s is on the interval [0, 1], and d is a vector.
56636       // We are passed two points. P can be the first point of each pair. The
56637       // vector, then, could be thought of as the distance (in x and y components)
56638       // from the first point to the second point.
56639       // So first, let's make our vectors:
56640       var va = [a2[0] - a1[0], a2[1] - a1[1]];
56641       var vb = [b2[0] - b1[0], b2[1] - b1[1]];
56642       // We also define a function to convert back to regular point form:
56643
56644       /* eslint-disable arrow-body-style */
56645
56646       function toPoint(p, s, d) {
56647         return [
56648           p[0] + s * d[0],
56649           p[1] + s * d[1]
56650         ];
56651       }
56652
56653       /* eslint-enable arrow-body-style */
56654
56655       // The rest is pretty much a straight port of the algorithm.
56656       var e = [b1[0] - a1[0], b1[1] - a1[1]];
56657       var kross    = crossProduct(va, vb);
56658       var sqrKross = kross * kross;
56659       var sqrLenA  = dotProduct(va, va);
56660       //const sqrLenB  = dotProduct(vb, vb);
56661
56662       // Check for line intersection. This works because of the properties of the
56663       // cross product -- specifically, two vectors are parallel if and only if the
56664       // cross product is the 0 vector. The full calculation involves relative error
56665       // to account for possible very small line segments. See Schneider & Eberly
56666       // for details.
56667       if (sqrKross > 0/* EPS * sqrLenB * sqLenA */) {
56668         // If they're not parallel, then (because these are line segments) they
56669         // still might not actually intersect. This code checks that the
56670         // intersection point of the lines is actually on both line segments.
56671         var s = crossProduct(e, vb) / kross;
56672         if (s < 0 || s > 1) {
56673           // not on line segment a
56674           return null;
56675         }
56676         var t = crossProduct(e, va) / kross;
56677         if (t < 0 || t > 1) {
56678           // not on line segment b
56679           return null;
56680         }
56681         if (s === 0 || s === 1) {
56682           // on an endpoint of line segment a
56683           return noEndpointTouch ? null : [toPoint(a1, s, va)];
56684         }
56685         if (t === 0 || t === 1) {
56686           // on an endpoint of line segment b
56687           return noEndpointTouch ? null : [toPoint(b1, t, vb)];
56688         }
56689         return [toPoint(a1, s, va)];
56690       }
56691
56692       // If we've reached this point, then the lines are either parallel or the
56693       // same, but the segments could overlap partially or fully, or not at all.
56694       // So we need to find the overlap, if any. To do that, we can use e, which is
56695       // the (vector) difference between the two initial points. If this is parallel
56696       // with the line itself, then the two lines are the same line, and there will
56697       // be overlap.
56698       //const sqrLenE = dotProduct(e, e);
56699       kross = crossProduct(e, va);
56700       sqrKross = kross * kross;
56701
56702       if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) {
56703       // Lines are just parallel, not the same. No overlap.
56704         return null;
56705       }
56706
56707       var sa = dotProduct(va, e) / sqrLenA;
56708       var sb = sa + dotProduct(va, vb) / sqrLenA;
56709       var smin = Math.min(sa, sb);
56710       var smax = Math.max(sa, sb);
56711
56712       // this is, essentially, the FindIntersection acting on floats from
56713       // Schneider & Eberly, just inlined into this function.
56714       if (smin <= 1 && smax >= 0) {
56715
56716         // overlap on an end point
56717         if (smin === 1) {
56718           return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)];
56719         }
56720
56721         if (smax === 0) {
56722           return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
56723         }
56724
56725         if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
56726
56727         // There's overlap on a segment -- two points of intersection. Return both.
56728         return [
56729           toPoint(a1, smin > 0 ? smin : 0, va),
56730           toPoint(a1, smax < 1 ? smax : 1, va)
56731         ];
56732       }
56733
56734       return null;
56735     }
56736
56737     /**
56738      * @param  {SweepEvent} se1
56739      * @param  {SweepEvent} se2
56740      * @param  {Queue}      queue
56741      * @return {Number}
56742      */
56743     function possibleIntersection (se1, se2, queue) {
56744       // that disallows self-intersecting polygons,
56745       // did cost us half a day, so I'll leave it
56746       // out of respect
56747       // if (se1.isSubject === se2.isSubject) return;
56748       var inter = intersection(
56749         se1.point, se1.otherEvent.point,
56750         se2.point, se2.otherEvent.point
56751       );
56752
56753       var nintersections = inter ? inter.length : 0;
56754       if (nintersections === 0) { return 0; } // no intersection
56755
56756       // the line segments intersect at an endpoint of both line segments
56757       if ((nintersections === 1) &&
56758           (equals(se1.point, se2.point) ||
56759            equals(se1.otherEvent.point, se2.otherEvent.point))) {
56760         return 0;
56761       }
56762
56763       if (nintersections === 2 && se1.isSubject === se2.isSubject) {
56764         // if(se1.contourId === se2.contourId){
56765         // console.warn('Edges of the same polygon overlap',
56766         //   se1.point, se1.otherEvent.point, se2.point, se2.otherEvent.point);
56767         // }
56768         //throw new Error('Edges of the same polygon overlap');
56769         return 0;
56770       }
56771
56772       // The line segments associated to se1 and se2 intersect
56773       if (nintersections === 1) {
56774
56775         // if the intersection point is not an endpoint of se1
56776         if (!equals(se1.point, inter[0]) && !equals(se1.otherEvent.point, inter[0])) {
56777           divideSegment(se1, inter[0], queue);
56778         }
56779
56780         // if the intersection point is not an endpoint of se2
56781         if (!equals(se2.point, inter[0]) && !equals(se2.otherEvent.point, inter[0])) {
56782           divideSegment(se2, inter[0], queue);
56783         }
56784         return 1;
56785       }
56786
56787       // The line segments associated to se1 and se2 overlap
56788       var events        = [];
56789       var leftCoincide  = false;
56790       var rightCoincide = false;
56791
56792       if (equals(se1.point, se2.point)) {
56793         leftCoincide = true; // linked
56794       } else if (compareEvents(se1, se2) === 1) {
56795         events.push(se2, se1);
56796       } else {
56797         events.push(se1, se2);
56798       }
56799
56800       if (equals(se1.otherEvent.point, se2.otherEvent.point)) {
56801         rightCoincide = true;
56802       } else if (compareEvents(se1.otherEvent, se2.otherEvent) === 1) {
56803         events.push(se2.otherEvent, se1.otherEvent);
56804       } else {
56805         events.push(se1.otherEvent, se2.otherEvent);
56806       }
56807
56808       if ((leftCoincide && rightCoincide) || leftCoincide) {
56809         // both line segments are equal or share the left endpoint
56810         se2.type = NON_CONTRIBUTING;
56811         se1.type = (se2.inOut === se1.inOut)
56812           ? SAME_TRANSITION : DIFFERENT_TRANSITION;
56813
56814         if (leftCoincide && !rightCoincide) {
56815           // honestly no idea, but changing events selection from [2, 1]
56816           // to [0, 1] fixes the overlapping self-intersecting polygons issue
56817           divideSegment(events[1].otherEvent, events[0].point, queue);
56818         }
56819         return 2;
56820       }
56821
56822       // the line segments share the right endpoint
56823       if (rightCoincide) {
56824         divideSegment(events[0], events[1].point, queue);
56825         return 3;
56826       }
56827
56828       // no line segment includes totally the other one
56829       if (events[0] !== events[3].otherEvent) {
56830         divideSegment(events[0], events[1].point, queue);
56831         divideSegment(events[1], events[2].point, queue);
56832         return 3;
56833       }
56834
56835       // one line segment includes the other one
56836       divideSegment(events[0], events[1].point, queue);
56837       divideSegment(events[3].otherEvent, events[2].point, queue);
56838
56839       return 3;
56840     }
56841
56842     /**
56843      * @param  {SweepEvent} le1
56844      * @param  {SweepEvent} le2
56845      * @return {Number}
56846      */
56847     function compareSegments(le1, le2) {
56848       if (le1 === le2) { return 0; }
56849
56850       // Segments are not collinear
56851       if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
56852         signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
56853
56854         // If they share their left endpoint use the right endpoint to sort
56855         if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
56856
56857         // Different left endpoint: use the left endpoint to sort
56858         if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
56859
56860         // has the line segment associated to e1 been inserted
56861         // into S after the line segment associated to e2 ?
56862         if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
56863
56864         // The line segment associated to e2 has been inserted
56865         // into S after the line segment associated to e1
56866         return le1.isBelow(le2.point) ? -1 : 1;
56867       }
56868
56869       if (le1.isSubject === le2.isSubject) { // same polygon
56870         var p1 = le1.point, p2 = le2.point;
56871         if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
56872           p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
56873           if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
56874           else { return le1.contourId > le2.contourId ? 1 : -1; }
56875         }
56876       } else { // Segments are collinear, but belong to separate polygons
56877         return le1.isSubject ? -1 : 1;
56878       }
56879
56880       return compareEvents(le1, le2) === 1 ? 1 : -1;
56881     }
56882
56883     function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
56884       var sweepLine = new SplayTree(compareSegments);
56885       var sortedEvents = [];
56886
56887       var rightbound = Math.min(sbbox[2], cbbox[2]);
56888
56889       var prev, next, begin;
56890
56891       while (eventQueue.length !== 0) {
56892         var event = eventQueue.pop();
56893         sortedEvents.push(event);
56894
56895         // optimization by bboxes for intersection and difference goes here
56896         if ((operation === INTERSECTION && event.point[0] > rightbound) ||
56897             (operation === DIFFERENCE   && event.point[0] > sbbox[2])) {
56898           break;
56899         }
56900
56901         if (event.left) {
56902           next  = prev = sweepLine.insert(event);
56903           begin = sweepLine.minNode();
56904
56905           if (prev !== begin) { prev = sweepLine.prev(prev); }
56906           else                { prev = null; }
56907
56908           next = sweepLine.next(next);
56909
56910           var prevEvent = prev ? prev.key : null;
56911           var prevprevEvent = (void 0);
56912           computeFields(event, prevEvent, operation);
56913           if (next) {
56914             if (possibleIntersection(event, next.key, eventQueue) === 2) {
56915               computeFields(event, prevEvent, operation);
56916               computeFields(event, next.key, operation);
56917             }
56918           }
56919
56920           if (prev) {
56921             if (possibleIntersection(prev.key, event, eventQueue) === 2) {
56922               var prevprev = prev;
56923               if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
56924               else                    { prevprev = null; }
56925
56926               prevprevEvent = prevprev ? prevprev.key : null;
56927               computeFields(prevEvent, prevprevEvent, operation);
56928               computeFields(event,     prevEvent,     operation);
56929             }
56930           }
56931         } else {
56932           event = event.otherEvent;
56933           next = prev = sweepLine.find(event);
56934
56935           if (prev && next) {
56936
56937             if (prev !== begin) { prev = sweepLine.prev(prev); }
56938             else                { prev = null; }
56939
56940             next = sweepLine.next(next);
56941             sweepLine.remove(event);
56942
56943             if (next && prev) {
56944               possibleIntersection(prev.key, next.key, eventQueue);
56945             }
56946           }
56947         }
56948       }
56949       return sortedEvents;
56950     }
56951
56952     /**
56953      * @param  {Array.<SweepEvent>} sortedEvents
56954      * @return {Array.<SweepEvent>}
56955      */
56956     function orderEvents(sortedEvents) {
56957       var event, i, len, tmp;
56958       var resultEvents = [];
56959       for (i = 0, len = sortedEvents.length; i < len; i++) {
56960         event = sortedEvents[i];
56961         if ((event.left && event.inResult) ||
56962           (!event.left && event.otherEvent.inResult)) {
56963           resultEvents.push(event);
56964         }
56965       }
56966       // Due to overlapping edges the resultEvents array can be not wholly sorted
56967       var sorted = false;
56968       while (!sorted) {
56969         sorted = true;
56970         for (i = 0, len = resultEvents.length; i < len; i++) {
56971           if ((i + 1) < len &&
56972             compareEvents(resultEvents[i], resultEvents[i + 1]) === 1) {
56973             tmp = resultEvents[i];
56974             resultEvents[i] = resultEvents[i + 1];
56975             resultEvents[i + 1] = tmp;
56976             sorted = false;
56977           }
56978         }
56979       }
56980
56981
56982       for (i = 0, len = resultEvents.length; i < len; i++) {
56983         event = resultEvents[i];
56984         event.pos = i;
56985       }
56986
56987       // imagine, the right event is found in the beginning of the queue,
56988       // when his left counterpart is not marked yet
56989       for (i = 0, len = resultEvents.length; i < len; i++) {
56990         event = resultEvents[i];
56991         if (!event.left) {
56992           tmp = event.pos;
56993           event.pos = event.otherEvent.pos;
56994           event.otherEvent.pos = tmp;
56995         }
56996       }
56997
56998       return resultEvents;
56999     }
57000
57001
57002     /**
57003      * @param  {Number} pos
57004      * @param  {Array.<SweepEvent>} resultEvents
57005      * @param  {Object>}    processed
57006      * @return {Number}
57007      */
57008     function nextPos(pos, resultEvents, processed, origIndex) {
57009       var p, p1;
57010       var newPos = pos + 1;
57011       var length = resultEvents.length;
57012
57013       p  = resultEvents[pos].point;
57014
57015       if (newPos < length)
57016         { p1 = resultEvents[newPos].point; }
57017
57018
57019       // while in range and not the current one by value
57020       while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
57021         if (!processed[newPos]) {
57022           return newPos;
57023         } else   {
57024           newPos++;
57025         }
57026         p1 = resultEvents[newPos].point;
57027       }
57028
57029       newPos = pos - 1;
57030
57031       while (processed[newPos] && newPos >= origIndex) {
57032         newPos--;
57033       }
57034       return newPos;
57035     }
57036
57037
57038     /**
57039      * @param  {Array.<SweepEvent>} sortedEvents
57040      * @return {Array.<*>} polygons
57041      */
57042     function connectEdges(sortedEvents, operation) {
57043       var i, len;
57044       var resultEvents = orderEvents(sortedEvents);
57045
57046       // "false"-filled array
57047       var processed = {};
57048       var result = [];
57049       var event;
57050
57051       for (i = 0, len = resultEvents.length; i < len; i++) {
57052         if (processed[i]) { continue; }
57053         var contour = [[]];
57054
57055         if (!resultEvents[i].isExteriorRing) {
57056           if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length === 0) {
57057             result.push(contour);
57058           } else if (result.length === 0) {
57059             result.push([[contour]]);
57060           } else {
57061             result[result.length - 1].push(contour[0]);
57062           }
57063         } else if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length > 1) {
57064           result[result.length - 1].push(contour[0]);
57065         } else {
57066           result.push(contour);
57067         }
57068
57069         var ringId = result.length - 1;
57070         var pos = i;
57071
57072         var initial = resultEvents[i].point;
57073         contour[0].push(initial);
57074
57075         while (pos >= i) {
57076           event = resultEvents[pos];
57077           processed[pos] = true;
57078
57079           if (event.left) {
57080             event.resultInOut = false;
57081             event.contourId   = ringId;
57082           } else {
57083             event.otherEvent.resultInOut = true;
57084             event.otherEvent.contourId   = ringId;
57085           }
57086
57087           pos = event.pos;
57088           processed[pos] = true;
57089           contour[0].push(resultEvents[pos].point);
57090           pos = nextPos(pos, resultEvents, processed, i);
57091         }
57092
57093         pos = pos === -1 ? i : pos;
57094
57095         event = resultEvents[pos];
57096         processed[pos] = processed[event.pos] = true;
57097         event.otherEvent.resultInOut = true;
57098         event.otherEvent.contourId   = ringId;
57099       }
57100
57101       // Handle if the result is a polygon (eg not multipoly)
57102       // Commented it again, let's see what do we mean by that
57103       // if (result.length === 1) result = result[0];
57104       return result;
57105     }
57106
57107     var tinyqueue = TinyQueue;
57108     var default_1 = TinyQueue;
57109
57110     function TinyQueue(data, compare) {
57111         var this$1 = this;
57112
57113         if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
57114
57115         this.data = data || [];
57116         this.length = this.data.length;
57117         this.compare = compare || defaultCompare;
57118
57119         if (this.length > 0) {
57120             for (var i = (this.length >> 1) - 1; i >= 0; i--) { this$1._down(i); }
57121         }
57122     }
57123
57124     function defaultCompare(a, b) {
57125         return a < b ? -1 : a > b ? 1 : 0;
57126     }
57127
57128     TinyQueue.prototype = {
57129
57130         push: function (item) {
57131             this.data.push(item);
57132             this.length++;
57133             this._up(this.length - 1);
57134         },
57135
57136         pop: function () {
57137             if (this.length === 0) { return undefined; }
57138
57139             var top = this.data[0];
57140             this.length--;
57141
57142             if (this.length > 0) {
57143                 this.data[0] = this.data[this.length];
57144                 this._down(0);
57145             }
57146             this.data.pop();
57147
57148             return top;
57149         },
57150
57151         peek: function () {
57152             return this.data[0];
57153         },
57154
57155         _up: function (pos) {
57156             var data = this.data;
57157             var compare = this.compare;
57158             var item = data[pos];
57159
57160             while (pos > 0) {
57161                 var parent = (pos - 1) >> 1;
57162                 var current = data[parent];
57163                 if (compare(item, current) >= 0) { break; }
57164                 data[pos] = current;
57165                 pos = parent;
57166             }
57167
57168             data[pos] = item;
57169         },
57170
57171         _down: function (pos) {
57172             var this$1 = this;
57173
57174             var data = this.data;
57175             var compare = this.compare;
57176             var halfLength = this.length >> 1;
57177             var item = data[pos];
57178
57179             while (pos < halfLength) {
57180                 var left = (pos << 1) + 1;
57181                 var right = left + 1;
57182                 var best = data[left];
57183
57184                 if (right < this$1.length && compare(data[right], best) < 0) {
57185                     left = right;
57186                     best = data[right];
57187                 }
57188                 if (compare(best, item) >= 0) { break; }
57189
57190                 data[pos] = best;
57191                 pos = left;
57192             }
57193
57194             data[pos] = item;
57195         }
57196     };
57197     tinyqueue.default = default_1;
57198
57199     var max = Math.max;
57200     var min = Math.min;
57201
57202     var contourId = 0;
57203
57204
57205     function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
57206       var i, len, s1, s2, e1, e2;
57207       for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
57208         s1 = contourOrHole[i];
57209         s2 = contourOrHole[i + 1];
57210         e1 = new SweepEvent(s1, false, undefined, isSubject);
57211         e2 = new SweepEvent(s2, false, e1,        isSubject);
57212         e1.otherEvent = e2;
57213
57214         if (s1[0] === s2[0] && s1[1] === s2[1]) {
57215           continue; // skip collapsed edges, or it breaks
57216         }
57217
57218         e1.contourId = e2.contourId = depth;
57219         if (!isExteriorRing) {
57220           e1.isExteriorRing = false;
57221           e2.isExteriorRing = false;
57222         }
57223         if (compareEvents(e1, e2) > 0) {
57224           e2.left = true;
57225         } else {
57226           e1.left = true;
57227         }
57228
57229         var x = s1[0], y = s1[1];
57230         bbox[0] = min(bbox[0], x);
57231         bbox[1] = min(bbox[1], y);
57232         bbox[2] = max(bbox[2], x);
57233         bbox[3] = max(bbox[3], y);
57234
57235         // Pushing it so the queue is sorted from left to right,
57236         // with object on the left having the highest priority.
57237         Q.push(e1);
57238         Q.push(e2);
57239       }
57240     }
57241
57242
57243     function fillQueue(subject, clipping, sbbox, cbbox, operation) {
57244       var eventQueue = new tinyqueue(null, compareEvents);
57245       var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
57246
57247       for (i = 0, ii = subject.length; i < ii; i++) {
57248         polygonSet = subject[i];
57249         for (j = 0, jj = polygonSet.length; j < jj; j++) {
57250           isExteriorRing = j === 0;
57251           if (isExteriorRing) { contourId++; }
57252           processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
57253         }
57254       }
57255
57256       for (i = 0, ii = clipping.length; i < ii; i++) {
57257         polygonSet = clipping[i];
57258         for (j = 0, jj = polygonSet.length; j < jj; j++) {
57259           isExteriorRing = j === 0;
57260           if (operation === DIFFERENCE) { isExteriorRing = false; }
57261           if (isExteriorRing) { contourId++; }
57262           processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
57263         }
57264       }
57265
57266       return eventQueue;
57267     }
57268
57269     var EMPTY = [];
57270
57271
57272     function trivialOperation(subject, clipping, operation) {
57273       var result = null;
57274       if (subject.length * clipping.length === 0) {
57275         if        (operation === INTERSECTION) {
57276           result = EMPTY;
57277         } else if (operation === DIFFERENCE) {
57278           result = subject;
57279         } else if (operation === UNION ||
57280                    operation === XOR) {
57281           result = (subject.length === 0) ? clipping : subject;
57282         }
57283       }
57284       return result;
57285     }
57286
57287
57288     function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
57289       var result = null;
57290       if (sbbox[0] > cbbox[2] ||
57291           cbbox[0] > sbbox[2] ||
57292           sbbox[1] > cbbox[3] ||
57293           cbbox[1] > sbbox[3]) {
57294         if        (operation === INTERSECTION) {
57295           result = EMPTY;
57296         } else if (operation === DIFFERENCE) {
57297           result = subject;
57298         } else if (operation === UNION ||
57299                    operation === XOR) {
57300           result = subject.concat(clipping);
57301         }
57302       }
57303       return result;
57304     }
57305
57306
57307     function boolean(subject, clipping, operation) {
57308       if (typeof subject[0][0][0] === 'number') {
57309         subject = [subject];
57310       }
57311       if (typeof clipping[0][0][0] === 'number') {
57312         clipping = [clipping];
57313       }
57314       var trivial = trivialOperation(subject, clipping, operation);
57315       if (trivial) {
57316         return trivial === EMPTY ? null : trivial;
57317       }
57318       var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
57319       var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
57320
57321       //console.time('fill queue');
57322       var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
57323       //console.timeEnd('fill queue');
57324
57325       trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
57326       if (trivial) {
57327         return trivial === EMPTY ? null : trivial;
57328       }
57329       //console.time('subdivide edges');
57330       var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
57331       //console.timeEnd('subdivide edges');
57332
57333       //console.time('connect vertices');
57334       var result = connectEdges(sortedEvents, operation);
57335       //console.timeEnd('connect vertices');
57336       return result;
57337     }
57338
57339     function union (subject, clipping) {
57340       return boolean(subject, clipping, UNION);
57341     }
57342
57343     function diff (subject, clipping) {
57344       return boolean(subject, clipping, DIFFERENCE);
57345     }
57346
57347     function xor (subject, clipping){
57348       return boolean(subject, clipping, XOR);
57349     }
57350
57351     function intersection$1 (subject, clipping) {
57352       return boolean(subject, clipping, INTERSECTION);
57353     }
57354
57355     /**
57356      * @enum {Number}
57357      */
57358     var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR };
57359
57360     exports.union = union;
57361     exports.diff = diff;
57362     exports.xor = xor;
57363     exports.intersection = intersection$1;
57364     exports.operations = operations;
57365
57366     Object.defineProperty(exports, '__esModule', { value: true });
57367
57368   })));
57369
57370   });
57371
57372   var martinez = unwrapExports(martinez_umd);
57373
57374   var read$6 = function (buffer, offset, isLE, mLen, nBytes) {
57375     var e, m;
57376     var eLen = (nBytes * 8) - mLen - 1;
57377     var eMax = (1 << eLen) - 1;
57378     var eBias = eMax >> 1;
57379     var nBits = -7;
57380     var i = isLE ? (nBytes - 1) : 0;
57381     var d = isLE ? -1 : 1;
57382     var s = buffer[offset + i];
57383
57384     i += d;
57385
57386     e = s & ((1 << (-nBits)) - 1);
57387     s >>= (-nBits);
57388     nBits += eLen;
57389     for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
57390
57391     m = e & ((1 << (-nBits)) - 1);
57392     e >>= (-nBits);
57393     nBits += mLen;
57394     for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
57395
57396     if (e === 0) {
57397       e = 1 - eBias;
57398     } else if (e === eMax) {
57399       return m ? NaN : ((s ? -1 : 1) * Infinity)
57400     } else {
57401       m = m + Math.pow(2, mLen);
57402       e = e - eBias;
57403     }
57404     return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
57405   };
57406
57407   var write$6 = function (buffer, value, offset, isLE, mLen, nBytes) {
57408     var e, m, c;
57409     var eLen = (nBytes * 8) - mLen - 1;
57410     var eMax = (1 << eLen) - 1;
57411     var eBias = eMax >> 1;
57412     var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
57413     var i = isLE ? 0 : (nBytes - 1);
57414     var d = isLE ? 1 : -1;
57415     var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
57416
57417     value = Math.abs(value);
57418
57419     if (isNaN(value) || value === Infinity) {
57420       m = isNaN(value) ? 1 : 0;
57421       e = eMax;
57422     } else {
57423       e = Math.floor(Math.log(value) / Math.LN2);
57424       if (value * (c = Math.pow(2, -e)) < 1) {
57425         e--;
57426         c *= 2;
57427       }
57428       if (e + eBias >= 1) {
57429         value += rt / c;
57430       } else {
57431         value += rt * Math.pow(2, 1 - eBias);
57432       }
57433       if (value * c >= 2) {
57434         e++;
57435         c /= 2;
57436       }
57437
57438       if (e + eBias >= eMax) {
57439         m = 0;
57440         e = eMax;
57441       } else if (e + eBias >= 1) {
57442         m = ((value * c) - 1) * Math.pow(2, mLen);
57443         e = e + eBias;
57444       } else {
57445         m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
57446         e = 0;
57447       }
57448     }
57449
57450     for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
57451
57452     e = (e << mLen) | m;
57453     eLen += mLen;
57454     for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
57455
57456     buffer[offset + i - d] |= s * 128;
57457   };
57458
57459   var ieee754 = {
57460         read: read$6,
57461         write: write$6
57462   };
57463
57464   var pbf = Pbf;
57465
57466
57467
57468   function Pbf(buf) {
57469       this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
57470       this.pos = 0;
57471       this.type = 0;
57472       this.length = this.buf.length;
57473   }
57474
57475   Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
57476   Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
57477   Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
57478   Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
57479
57480   var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
57481       SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
57482
57483   Pbf.prototype = {
57484
57485       destroy: function() {
57486           this.buf = null;
57487       },
57488
57489       // === READING =================================================================
57490
57491       readFields: function(readField, result, end) {
57492           end = end || this.length;
57493
57494           while (this.pos < end) {
57495               var val = this.readVarint(),
57496                   tag = val >> 3,
57497                   startPos = this.pos;
57498
57499               this.type = val & 0x7;
57500               readField(tag, result, this);
57501
57502               if (this.pos === startPos) this.skip(val);
57503           }
57504           return result;
57505       },
57506
57507       readMessage: function(readField, result) {
57508           return this.readFields(readField, result, this.readVarint() + this.pos);
57509       },
57510
57511       readFixed32: function() {
57512           var val = readUInt32(this.buf, this.pos);
57513           this.pos += 4;
57514           return val;
57515       },
57516
57517       readSFixed32: function() {
57518           var val = readInt32(this.buf, this.pos);
57519           this.pos += 4;
57520           return val;
57521       },
57522
57523       // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
57524
57525       readFixed64: function() {
57526           var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
57527           this.pos += 8;
57528           return val;
57529       },
57530
57531       readSFixed64: function() {
57532           var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
57533           this.pos += 8;
57534           return val;
57535       },
57536
57537       readFloat: function() {
57538           var val = ieee754.read(this.buf, this.pos, true, 23, 4);
57539           this.pos += 4;
57540           return val;
57541       },
57542
57543       readDouble: function() {
57544           var val = ieee754.read(this.buf, this.pos, true, 52, 8);
57545           this.pos += 8;
57546           return val;
57547       },
57548
57549       readVarint: function(isSigned) {
57550           var buf = this.buf,
57551               val, b;
57552
57553           b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
57554           b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
57555           b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
57556           b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
57557           b = buf[this.pos];   val |= (b & 0x0f) << 28;
57558
57559           return readVarintRemainder(val, isSigned, this);
57560       },
57561
57562       readVarint64: function() { // for compatibility with v2.0.1
57563           return this.readVarint(true);
57564       },
57565
57566       readSVarint: function() {
57567           var num = this.readVarint();
57568           return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
57569       },
57570
57571       readBoolean: function() {
57572           return Boolean(this.readVarint());
57573       },
57574
57575       readString: function() {
57576           var end = this.readVarint() + this.pos,
57577               str = readUtf8(this.buf, this.pos, end);
57578           this.pos = end;
57579           return str;
57580       },
57581
57582       readBytes: function() {
57583           var end = this.readVarint() + this.pos,
57584               buffer = this.buf.subarray(this.pos, end);
57585           this.pos = end;
57586           return buffer;
57587       },
57588
57589       // verbose for performance reasons; doesn't affect gzipped size
57590
57591       readPackedVarint: function(arr, isSigned) {
57592           var end = readPackedEnd(this);
57593           arr = arr || [];
57594           while (this.pos < end) arr.push(this.readVarint(isSigned));
57595           return arr;
57596       },
57597       readPackedSVarint: function(arr) {
57598           var end = readPackedEnd(this);
57599           arr = arr || [];
57600           while (this.pos < end) arr.push(this.readSVarint());
57601           return arr;
57602       },
57603       readPackedBoolean: function(arr) {
57604           var end = readPackedEnd(this);
57605           arr = arr || [];
57606           while (this.pos < end) arr.push(this.readBoolean());
57607           return arr;
57608       },
57609       readPackedFloat: function(arr) {
57610           var end = readPackedEnd(this);
57611           arr = arr || [];
57612           while (this.pos < end) arr.push(this.readFloat());
57613           return arr;
57614       },
57615       readPackedDouble: function(arr) {
57616           var end = readPackedEnd(this);
57617           arr = arr || [];
57618           while (this.pos < end) arr.push(this.readDouble());
57619           return arr;
57620       },
57621       readPackedFixed32: function(arr) {
57622           var end = readPackedEnd(this);
57623           arr = arr || [];
57624           while (this.pos < end) arr.push(this.readFixed32());
57625           return arr;
57626       },
57627       readPackedSFixed32: function(arr) {
57628           var end = readPackedEnd(this);
57629           arr = arr || [];
57630           while (this.pos < end) arr.push(this.readSFixed32());
57631           return arr;
57632       },
57633       readPackedFixed64: function(arr) {
57634           var end = readPackedEnd(this);
57635           arr = arr || [];
57636           while (this.pos < end) arr.push(this.readFixed64());
57637           return arr;
57638       },
57639       readPackedSFixed64: function(arr) {
57640           var end = readPackedEnd(this);
57641           arr = arr || [];
57642           while (this.pos < end) arr.push(this.readSFixed64());
57643           return arr;
57644       },
57645
57646       skip: function(val) {
57647           var type = val & 0x7;
57648           if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
57649           else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
57650           else if (type === Pbf.Fixed32) this.pos += 4;
57651           else if (type === Pbf.Fixed64) this.pos += 8;
57652           else throw new Error('Unimplemented type: ' + type);
57653       },
57654
57655       // === WRITING =================================================================
57656
57657       writeTag: function(tag, type) {
57658           this.writeVarint((tag << 3) | type);
57659       },
57660
57661       realloc: function(min) {
57662           var length = this.length || 16;
57663
57664           while (length < this.pos + min) length *= 2;
57665
57666           if (length !== this.length) {
57667               var buf = new Uint8Array(length);
57668               buf.set(this.buf);
57669               this.buf = buf;
57670               this.length = length;
57671           }
57672       },
57673
57674       finish: function() {
57675           this.length = this.pos;
57676           this.pos = 0;
57677           return this.buf.subarray(0, this.length);
57678       },
57679
57680       writeFixed32: function(val) {
57681           this.realloc(4);
57682           writeInt32(this.buf, val, this.pos);
57683           this.pos += 4;
57684       },
57685
57686       writeSFixed32: function(val) {
57687           this.realloc(4);
57688           writeInt32(this.buf, val, this.pos);
57689           this.pos += 4;
57690       },
57691
57692       writeFixed64: function(val) {
57693           this.realloc(8);
57694           writeInt32(this.buf, val & -1, this.pos);
57695           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
57696           this.pos += 8;
57697       },
57698
57699       writeSFixed64: function(val) {
57700           this.realloc(8);
57701           writeInt32(this.buf, val & -1, this.pos);
57702           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
57703           this.pos += 8;
57704       },
57705
57706       writeVarint: function(val) {
57707           val = +val || 0;
57708
57709           if (val > 0xfffffff || val < 0) {
57710               writeBigVarint(val, this);
57711               return;
57712           }
57713
57714           this.realloc(4);
57715
57716           this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
57717           this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
57718           this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
57719           this.buf[this.pos++] =   (val >>> 7) & 0x7f;
57720       },
57721
57722       writeSVarint: function(val) {
57723           this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
57724       },
57725
57726       writeBoolean: function(val) {
57727           this.writeVarint(Boolean(val));
57728       },
57729
57730       writeString: function(str) {
57731           str = String(str);
57732           this.realloc(str.length * 4);
57733
57734           this.pos++; // reserve 1 byte for short string length
57735
57736           var startPos = this.pos;
57737           // write the string directly to the buffer and see how much was written
57738           this.pos = writeUtf8(this.buf, str, this.pos);
57739           var len = this.pos - startPos;
57740
57741           if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
57742
57743           // finally, write the message length in the reserved place and restore the position
57744           this.pos = startPos - 1;
57745           this.writeVarint(len);
57746           this.pos += len;
57747       },
57748
57749       writeFloat: function(val) {
57750           this.realloc(4);
57751           ieee754.write(this.buf, val, this.pos, true, 23, 4);
57752           this.pos += 4;
57753       },
57754
57755       writeDouble: function(val) {
57756           this.realloc(8);
57757           ieee754.write(this.buf, val, this.pos, true, 52, 8);
57758           this.pos += 8;
57759       },
57760
57761       writeBytes: function(buffer) {
57762           var len = buffer.length;
57763           this.writeVarint(len);
57764           this.realloc(len);
57765           for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
57766       },
57767
57768       writeRawMessage: function(fn, obj) {
57769           this.pos++; // reserve 1 byte for short message length
57770
57771           // write the message directly to the buffer and see how much was written
57772           var startPos = this.pos;
57773           fn(obj, this);
57774           var len = this.pos - startPos;
57775
57776           if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
57777
57778           // finally, write the message length in the reserved place and restore the position
57779           this.pos = startPos - 1;
57780           this.writeVarint(len);
57781           this.pos += len;
57782       },
57783
57784       writeMessage: function(tag, fn, obj) {
57785           this.writeTag(tag, Pbf.Bytes);
57786           this.writeRawMessage(fn, obj);
57787       },
57788
57789       writePackedVarint:   function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr);   },
57790       writePackedSVarint:  function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr);  },
57791       writePackedBoolean:  function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr);  },
57792       writePackedFloat:    function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr);    },
57793       writePackedDouble:   function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr);   },
57794       writePackedFixed32:  function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr);  },
57795       writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); },
57796       writePackedFixed64:  function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr);  },
57797       writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); },
57798
57799       writeBytesField: function(tag, buffer) {
57800           this.writeTag(tag, Pbf.Bytes);
57801           this.writeBytes(buffer);
57802       },
57803       writeFixed32Field: function(tag, val) {
57804           this.writeTag(tag, Pbf.Fixed32);
57805           this.writeFixed32(val);
57806       },
57807       writeSFixed32Field: function(tag, val) {
57808           this.writeTag(tag, Pbf.Fixed32);
57809           this.writeSFixed32(val);
57810       },
57811       writeFixed64Field: function(tag, val) {
57812           this.writeTag(tag, Pbf.Fixed64);
57813           this.writeFixed64(val);
57814       },
57815       writeSFixed64Field: function(tag, val) {
57816           this.writeTag(tag, Pbf.Fixed64);
57817           this.writeSFixed64(val);
57818       },
57819       writeVarintField: function(tag, val) {
57820           this.writeTag(tag, Pbf.Varint);
57821           this.writeVarint(val);
57822       },
57823       writeSVarintField: function(tag, val) {
57824           this.writeTag(tag, Pbf.Varint);
57825           this.writeSVarint(val);
57826       },
57827       writeStringField: function(tag, str) {
57828           this.writeTag(tag, Pbf.Bytes);
57829           this.writeString(str);
57830       },
57831       writeFloatField: function(tag, val) {
57832           this.writeTag(tag, Pbf.Fixed32);
57833           this.writeFloat(val);
57834       },
57835       writeDoubleField: function(tag, val) {
57836           this.writeTag(tag, Pbf.Fixed64);
57837           this.writeDouble(val);
57838       },
57839       writeBooleanField: function(tag, val) {
57840           this.writeVarintField(tag, Boolean(val));
57841       }
57842   };
57843
57844   function readVarintRemainder(l, s, p) {
57845       var buf = p.buf,
57846           h, b;
57847
57848       b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
57849       b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
57850       b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
57851       b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
57852       b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
57853       b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
57854
57855       throw new Error('Expected varint not more than 10 bytes');
57856   }
57857
57858   function readPackedEnd(pbf) {
57859       return pbf.type === Pbf.Bytes ?
57860           pbf.readVarint() + pbf.pos : pbf.pos + 1;
57861   }
57862
57863   function toNum(low, high, isSigned) {
57864       if (isSigned) {
57865           return high * 0x100000000 + (low >>> 0);
57866       }
57867
57868       return ((high >>> 0) * 0x100000000) + (low >>> 0);
57869   }
57870
57871   function writeBigVarint(val, pbf) {
57872       var low, high;
57873
57874       if (val >= 0) {
57875           low  = (val % 0x100000000) | 0;
57876           high = (val / 0x100000000) | 0;
57877       } else {
57878           low  = ~(-val % 0x100000000);
57879           high = ~(-val / 0x100000000);
57880
57881           if (low ^ 0xffffffff) {
57882               low = (low + 1) | 0;
57883           } else {
57884               low = 0;
57885               high = (high + 1) | 0;
57886           }
57887       }
57888
57889       if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
57890           throw new Error('Given varint doesn\'t fit into 10 bytes');
57891       }
57892
57893       pbf.realloc(10);
57894
57895       writeBigVarintLow(low, high, pbf);
57896       writeBigVarintHigh(high, pbf);
57897   }
57898
57899   function writeBigVarintLow(low, high, pbf) {
57900       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
57901       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
57902       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
57903       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
57904       pbf.buf[pbf.pos]   = low & 0x7f;
57905   }
57906
57907   function writeBigVarintHigh(high, pbf) {
57908       var lsb = (high & 0x07) << 4;
57909
57910       pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
57911       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
57912       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
57913       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
57914       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
57915       pbf.buf[pbf.pos++]  = high & 0x7f;
57916   }
57917
57918   function makeRoomForExtraLength(startPos, len, pbf) {
57919       var extraLen =
57920           len <= 0x3fff ? 1 :
57921           len <= 0x1fffff ? 2 :
57922           len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7));
57923
57924       // if 1 byte isn't enough for encoding message length, shift the data to the right
57925       pbf.realloc(extraLen);
57926       for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
57927   }
57928
57929   function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
57930   function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
57931   function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
57932   function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
57933   function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
57934   function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
57935   function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
57936   function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
57937   function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
57938
57939   // Buffer code below from https://github.com/feross/buffer, MIT-licensed
57940
57941   function readUInt32(buf, pos) {
57942       return ((buf[pos]) |
57943           (buf[pos + 1] << 8) |
57944           (buf[pos + 2] << 16)) +
57945           (buf[pos + 3] * 0x1000000);
57946   }
57947
57948   function writeInt32(buf, val, pos) {
57949       buf[pos] = val;
57950       buf[pos + 1] = (val >>> 8);
57951       buf[pos + 2] = (val >>> 16);
57952       buf[pos + 3] = (val >>> 24);
57953   }
57954
57955   function readInt32(buf, pos) {
57956       return ((buf[pos]) |
57957           (buf[pos + 1] << 8) |
57958           (buf[pos + 2] << 16)) +
57959           (buf[pos + 3] << 24);
57960   }
57961
57962   function readUtf8(buf, pos, end) {
57963       var str = '';
57964       var i = pos;
57965
57966       while (i < end) {
57967           var b0 = buf[i];
57968           var c = null; // codepoint
57969           var bytesPerSequence =
57970               b0 > 0xEF ? 4 :
57971               b0 > 0xDF ? 3 :
57972               b0 > 0xBF ? 2 : 1;
57973
57974           if (i + bytesPerSequence > end) break;
57975
57976           var b1, b2, b3;
57977
57978           if (bytesPerSequence === 1) {
57979               if (b0 < 0x80) {
57980                   c = b0;
57981               }
57982           } else if (bytesPerSequence === 2) {
57983               b1 = buf[i + 1];
57984               if ((b1 & 0xC0) === 0x80) {
57985                   c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
57986                   if (c <= 0x7F) {
57987                       c = null;
57988                   }
57989               }
57990           } else if (bytesPerSequence === 3) {
57991               b1 = buf[i + 1];
57992               b2 = buf[i + 2];
57993               if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
57994                   c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
57995                   if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
57996                       c = null;
57997                   }
57998               }
57999           } else if (bytesPerSequence === 4) {
58000               b1 = buf[i + 1];
58001               b2 = buf[i + 2];
58002               b3 = buf[i + 3];
58003               if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
58004                   c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
58005                   if (c <= 0xFFFF || c >= 0x110000) {
58006                       c = null;
58007                   }
58008               }
58009           }
58010
58011           if (c === null) {
58012               c = 0xFFFD;
58013               bytesPerSequence = 1;
58014
58015           } else if (c > 0xFFFF) {
58016               c -= 0x10000;
58017               str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
58018               c = 0xDC00 | c & 0x3FF;
58019           }
58020
58021           str += String.fromCharCode(c);
58022           i += bytesPerSequence;
58023       }
58024
58025       return str;
58026   }
58027
58028   function writeUtf8(buf, str, pos) {
58029       for (var i = 0, c, lead; i < str.length; i++) {
58030           c = str.charCodeAt(i); // code point
58031
58032           if (c > 0xD7FF && c < 0xE000) {
58033               if (lead) {
58034                   if (c < 0xDC00) {
58035                       buf[pos++] = 0xEF;
58036                       buf[pos++] = 0xBF;
58037                       buf[pos++] = 0xBD;
58038                       lead = c;
58039                       continue;
58040                   } else {
58041                       c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
58042                       lead = null;
58043                   }
58044               } else {
58045                   if (c > 0xDBFF || (i + 1 === str.length)) {
58046                       buf[pos++] = 0xEF;
58047                       buf[pos++] = 0xBF;
58048                       buf[pos++] = 0xBD;
58049                   } else {
58050                       lead = c;
58051                   }
58052                   continue;
58053               }
58054           } else if (lead) {
58055               buf[pos++] = 0xEF;
58056               buf[pos++] = 0xBF;
58057               buf[pos++] = 0xBD;
58058               lead = null;
58059           }
58060
58061           if (c < 0x80) {
58062               buf[pos++] = c;
58063           } else {
58064               if (c < 0x800) {
58065                   buf[pos++] = c >> 0x6 | 0xC0;
58066               } else {
58067                   if (c < 0x10000) {
58068                       buf[pos++] = c >> 0xC | 0xE0;
58069                   } else {
58070                       buf[pos++] = c >> 0x12 | 0xF0;
58071                       buf[pos++] = c >> 0xC & 0x3F | 0x80;
58072                   }
58073                   buf[pos++] = c >> 0x6 & 0x3F | 0x80;
58074               }
58075               buf[pos++] = c & 0x3F | 0x80;
58076           }
58077       }
58078       return pos;
58079   }
58080
58081   var pointGeometry = Point;
58082
58083   /**
58084    * A standalone point geometry with useful accessor, comparison, and
58085    * modification methods.
58086    *
58087    * @class Point
58088    * @param {Number} x the x-coordinate. this could be longitude or screen
58089    * pixels, or any other sort of unit.
58090    * @param {Number} y the y-coordinate. this could be latitude or screen
58091    * pixels, or any other sort of unit.
58092    * @example
58093    * var point = new Point(-77, 38);
58094    */
58095   function Point(x, y) {
58096       this.x = x;
58097       this.y = y;
58098   }
58099
58100   Point.prototype = {
58101
58102       /**
58103        * Clone this point, returning a new point that can be modified
58104        * without affecting the old one.
58105        * @return {Point} the clone
58106        */
58107       clone: function() { return new Point(this.x, this.y); },
58108
58109       /**
58110        * Add this point's x & y coordinates to another point,
58111        * yielding a new point.
58112        * @param {Point} p the other point
58113        * @return {Point} output point
58114        */
58115       add:     function(p) { return this.clone()._add(p); },
58116
58117       /**
58118        * Subtract this point's x & y coordinates to from point,
58119        * yielding a new point.
58120        * @param {Point} p the other point
58121        * @return {Point} output point
58122        */
58123       sub:     function(p) { return this.clone()._sub(p); },
58124
58125       /**
58126        * Multiply this point's x & y coordinates by point,
58127        * yielding a new point.
58128        * @param {Point} p the other point
58129        * @return {Point} output point
58130        */
58131       multByPoint:    function(p) { return this.clone()._multByPoint(p); },
58132
58133       /**
58134        * Divide this point's x & y coordinates by point,
58135        * yielding a new point.
58136        * @param {Point} p the other point
58137        * @return {Point} output point
58138        */
58139       divByPoint:     function(p) { return this.clone()._divByPoint(p); },
58140
58141       /**
58142        * Multiply this point's x & y coordinates by a factor,
58143        * yielding a new point.
58144        * @param {Point} k factor
58145        * @return {Point} output point
58146        */
58147       mult:    function(k) { return this.clone()._mult(k); },
58148
58149       /**
58150        * Divide this point's x & y coordinates by a factor,
58151        * yielding a new point.
58152        * @param {Point} k factor
58153        * @return {Point} output point
58154        */
58155       div:     function(k) { return this.clone()._div(k); },
58156
58157       /**
58158        * Rotate this point around the 0, 0 origin by an angle a,
58159        * given in radians
58160        * @param {Number} a angle to rotate around, in radians
58161        * @return {Point} output point
58162        */
58163       rotate:  function(a) { return this.clone()._rotate(a); },
58164
58165       /**
58166        * Rotate this point around p point by an angle a,
58167        * given in radians
58168        * @param {Number} a angle to rotate around, in radians
58169        * @param {Point} p Point to rotate around
58170        * @return {Point} output point
58171        */
58172       rotateAround:  function(a,p) { return this.clone()._rotateAround(a,p); },
58173
58174       /**
58175        * Multiply this point by a 4x1 transformation matrix
58176        * @param {Array<Number>} m transformation matrix
58177        * @return {Point} output point
58178        */
58179       matMult: function(m) { return this.clone()._matMult(m); },
58180
58181       /**
58182        * Calculate this point but as a unit vector from 0, 0, meaning
58183        * that the distance from the resulting point to the 0, 0
58184        * coordinate will be equal to 1 and the angle from the resulting
58185        * point to the 0, 0 coordinate will be the same as before.
58186        * @return {Point} unit vector point
58187        */
58188       unit:    function() { return this.clone()._unit(); },
58189
58190       /**
58191        * Compute a perpendicular point, where the new y coordinate
58192        * is the old x coordinate and the new x coordinate is the old y
58193        * coordinate multiplied by -1
58194        * @return {Point} perpendicular point
58195        */
58196       perp:    function() { return this.clone()._perp(); },
58197
58198       /**
58199        * Return a version of this point with the x & y coordinates
58200        * rounded to integers.
58201        * @return {Point} rounded point
58202        */
58203       round:   function() { return this.clone()._round(); },
58204
58205       /**
58206        * Return the magitude of this point: this is the Euclidean
58207        * distance from the 0, 0 coordinate to this point's x and y
58208        * coordinates.
58209        * @return {Number} magnitude
58210        */
58211       mag: function() {
58212           return Math.sqrt(this.x * this.x + this.y * this.y);
58213       },
58214
58215       /**
58216        * Judge whether this point is equal to another point, returning
58217        * true or false.
58218        * @param {Point} other the other point
58219        * @return {boolean} whether the points are equal
58220        */
58221       equals: function(other) {
58222           return this.x === other.x &&
58223                  this.y === other.y;
58224       },
58225
58226       /**
58227        * Calculate the distance from this point to another point
58228        * @param {Point} p the other point
58229        * @return {Number} distance
58230        */
58231       dist: function(p) {
58232           return Math.sqrt(this.distSqr(p));
58233       },
58234
58235       /**
58236        * Calculate the distance from this point to another point,
58237        * without the square root step. Useful if you're comparing
58238        * relative distances.
58239        * @param {Point} p the other point
58240        * @return {Number} distance
58241        */
58242       distSqr: function(p) {
58243           var dx = p.x - this.x,
58244               dy = p.y - this.y;
58245           return dx * dx + dy * dy;
58246       },
58247
58248       /**
58249        * Get the angle from the 0, 0 coordinate to this point, in radians
58250        * coordinates.
58251        * @return {Number} angle
58252        */
58253       angle: function() {
58254           return Math.atan2(this.y, this.x);
58255       },
58256
58257       /**
58258        * Get the angle from this point to another point, in radians
58259        * @param {Point} b the other point
58260        * @return {Number} angle
58261        */
58262       angleTo: function(b) {
58263           return Math.atan2(this.y - b.y, this.x - b.x);
58264       },
58265
58266       /**
58267        * Get the angle between this point and another point, in radians
58268        * @param {Point} b the other point
58269        * @return {Number} angle
58270        */
58271       angleWith: function(b) {
58272           return this.angleWithSep(b.x, b.y);
58273       },
58274
58275       /*
58276        * Find the angle of the two vectors, solving the formula for
58277        * the cross product a x b = |a||b|sin(θ) for θ.
58278        * @param {Number} x the x-coordinate
58279        * @param {Number} y the y-coordinate
58280        * @return {Number} the angle in radians
58281        */
58282       angleWithSep: function(x, y) {
58283           return Math.atan2(
58284               this.x * y - this.y * x,
58285               this.x * x + this.y * y);
58286       },
58287
58288       _matMult: function(m) {
58289           var x = m[0] * this.x + m[1] * this.y,
58290               y = m[2] * this.x + m[3] * this.y;
58291           this.x = x;
58292           this.y = y;
58293           return this;
58294       },
58295
58296       _add: function(p) {
58297           this.x += p.x;
58298           this.y += p.y;
58299           return this;
58300       },
58301
58302       _sub: function(p) {
58303           this.x -= p.x;
58304           this.y -= p.y;
58305           return this;
58306       },
58307
58308       _mult: function(k) {
58309           this.x *= k;
58310           this.y *= k;
58311           return this;
58312       },
58313
58314       _div: function(k) {
58315           this.x /= k;
58316           this.y /= k;
58317           return this;
58318       },
58319
58320       _multByPoint: function(p) {
58321           this.x *= p.x;
58322           this.y *= p.y;
58323           return this;
58324       },
58325
58326       _divByPoint: function(p) {
58327           this.x /= p.x;
58328           this.y /= p.y;
58329           return this;
58330       },
58331
58332       _unit: function() {
58333           this._div(this.mag());
58334           return this;
58335       },
58336
58337       _perp: function() {
58338           var y = this.y;
58339           this.y = this.x;
58340           this.x = -y;
58341           return this;
58342       },
58343
58344       _rotate: function(angle) {
58345           var cos = Math.cos(angle),
58346               sin = Math.sin(angle),
58347               x = cos * this.x - sin * this.y,
58348               y = sin * this.x + cos * this.y;
58349           this.x = x;
58350           this.y = y;
58351           return this;
58352       },
58353
58354       _rotateAround: function(angle, p) {
58355           var cos = Math.cos(angle),
58356               sin = Math.sin(angle),
58357               x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),
58358               y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);
58359           this.x = x;
58360           this.y = y;
58361           return this;
58362       },
58363
58364       _round: function() {
58365           this.x = Math.round(this.x);
58366           this.y = Math.round(this.y);
58367           return this;
58368       }
58369   };
58370
58371   /**
58372    * Construct a point from an array if necessary, otherwise if the input
58373    * is already a Point, or an unknown type, return it unchanged
58374    * @param {Array<Number>|Point|*} a any kind of input value
58375    * @return {Point} constructed point, or passed-through value.
58376    * @example
58377    * // this
58378    * var point = Point.convert([0, 1]);
58379    * // is equivalent to
58380    * var point = new Point(0, 1);
58381    */
58382   Point.convert = function (a) {
58383       if (a instanceof Point) {
58384           return a;
58385       }
58386       if (Array.isArray(a)) {
58387           return new Point(a[0], a[1]);
58388       }
58389       return a;
58390   };
58391
58392   var vectortilefeature = VectorTileFeature;
58393
58394   function VectorTileFeature(pbf, end, extent, keys, values) {
58395       // Public
58396       this.properties = {};
58397       this.extent = extent;
58398       this.type = 0;
58399
58400       // Private
58401       this._pbf = pbf;
58402       this._geometry = -1;
58403       this._keys = keys;
58404       this._values = values;
58405
58406       pbf.readFields(readFeature, this, end);
58407   }
58408
58409   function readFeature(tag, feature, pbf) {
58410       if (tag == 1) feature.id = pbf.readVarint();
58411       else if (tag == 2) readTag(pbf, feature);
58412       else if (tag == 3) feature.type = pbf.readVarint();
58413       else if (tag == 4) feature._geometry = pbf.pos;
58414   }
58415
58416   function readTag(pbf, feature) {
58417       var end = pbf.readVarint() + pbf.pos;
58418
58419       while (pbf.pos < end) {
58420           var key = feature._keys[pbf.readVarint()],
58421               value = feature._values[pbf.readVarint()];
58422           feature.properties[key] = value;
58423       }
58424   }
58425
58426   VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
58427
58428   VectorTileFeature.prototype.loadGeometry = function() {
58429       var pbf = this._pbf;
58430       pbf.pos = this._geometry;
58431
58432       var end = pbf.readVarint() + pbf.pos,
58433           cmd = 1,
58434           length = 0,
58435           x = 0,
58436           y = 0,
58437           lines = [],
58438           line;
58439
58440       while (pbf.pos < end) {
58441           if (length <= 0) {
58442               var cmdLen = pbf.readVarint();
58443               cmd = cmdLen & 0x7;
58444               length = cmdLen >> 3;
58445           }
58446
58447           length--;
58448
58449           if (cmd === 1 || cmd === 2) {
58450               x += pbf.readSVarint();
58451               y += pbf.readSVarint();
58452
58453               if (cmd === 1) { // moveTo
58454                   if (line) lines.push(line);
58455                   line = [];
58456               }
58457
58458               line.push(new pointGeometry(x, y));
58459
58460           } else if (cmd === 7) {
58461
58462               // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
58463               if (line) {
58464                   line.push(line[0].clone()); // closePolygon
58465               }
58466
58467           } else {
58468               throw new Error('unknown command ' + cmd);
58469           }
58470       }
58471
58472       if (line) lines.push(line);
58473
58474       return lines;
58475   };
58476
58477   VectorTileFeature.prototype.bbox = function() {
58478       var pbf = this._pbf;
58479       pbf.pos = this._geometry;
58480
58481       var end = pbf.readVarint() + pbf.pos,
58482           cmd = 1,
58483           length = 0,
58484           x = 0,
58485           y = 0,
58486           x1 = Infinity,
58487           x2 = -Infinity,
58488           y1 = Infinity,
58489           y2 = -Infinity;
58490
58491       while (pbf.pos < end) {
58492           if (length <= 0) {
58493               var cmdLen = pbf.readVarint();
58494               cmd = cmdLen & 0x7;
58495               length = cmdLen >> 3;
58496           }
58497
58498           length--;
58499
58500           if (cmd === 1 || cmd === 2) {
58501               x += pbf.readSVarint();
58502               y += pbf.readSVarint();
58503               if (x < x1) x1 = x;
58504               if (x > x2) x2 = x;
58505               if (y < y1) y1 = y;
58506               if (y > y2) y2 = y;
58507
58508           } else if (cmd !== 7) {
58509               throw new Error('unknown command ' + cmd);
58510           }
58511       }
58512
58513       return [x1, y1, x2, y2];
58514   };
58515
58516   VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
58517       var size = this.extent * Math.pow(2, z),
58518           x0 = this.extent * x,
58519           y0 = this.extent * y,
58520           coords = this.loadGeometry(),
58521           type = VectorTileFeature.types[this.type],
58522           i, j;
58523
58524       function project(line) {
58525           for (var j = 0; j < line.length; j++) {
58526               var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;
58527               line[j] = [
58528                   (p.x + x0) * 360 / size - 180,
58529                   360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
58530               ];
58531           }
58532       }
58533
58534       switch (this.type) {
58535       case 1:
58536           var points = [];
58537           for (i = 0; i < coords.length; i++) {
58538               points[i] = coords[i][0];
58539           }
58540           coords = points;
58541           project(coords);
58542           break;
58543
58544       case 2:
58545           for (i = 0; i < coords.length; i++) {
58546               project(coords[i]);
58547           }
58548           break;
58549
58550       case 3:
58551           coords = classifyRings(coords);
58552           for (i = 0; i < coords.length; i++) {
58553               for (j = 0; j < coords[i].length; j++) {
58554                   project(coords[i][j]);
58555               }
58556           }
58557           break;
58558       }
58559
58560       if (coords.length === 1) {
58561           coords = coords[0];
58562       } else {
58563           type = 'Multi' + type;
58564       }
58565
58566       var result = {
58567           type: "Feature",
58568           geometry: {
58569               type: type,
58570               coordinates: coords
58571           },
58572           properties: this.properties
58573       };
58574
58575       if ('id' in this) {
58576           result.id = this.id;
58577       }
58578
58579       return result;
58580   };
58581
58582   // classifies an array of rings into polygons with outer rings and holes
58583
58584   function classifyRings(rings) {
58585       var len = rings.length;
58586
58587       if (len <= 1) return [rings];
58588
58589       var polygons = [],
58590           polygon,
58591           ccw;
58592
58593       for (var i = 0; i < len; i++) {
58594           var area = signedArea(rings[i]);
58595           if (area === 0) continue;
58596
58597           if (ccw === undefined) ccw = area < 0;
58598
58599           if (ccw === area < 0) {
58600               if (polygon) polygons.push(polygon);
58601               polygon = [rings[i]];
58602
58603           } else {
58604               polygon.push(rings[i]);
58605           }
58606       }
58607       if (polygon) polygons.push(polygon);
58608
58609       return polygons;
58610   }
58611
58612   function signedArea(ring) {
58613       var sum = 0;
58614       for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
58615           p1 = ring[i];
58616           p2 = ring[j];
58617           sum += (p2.x - p1.x) * (p1.y + p2.y);
58618       }
58619       return sum;
58620   }
58621
58622   var vectortilelayer = VectorTileLayer;
58623
58624   function VectorTileLayer(pbf, end) {
58625       // Public
58626       this.version = 1;
58627       this.name = null;
58628       this.extent = 4096;
58629       this.length = 0;
58630
58631       // Private
58632       this._pbf = pbf;
58633       this._keys = [];
58634       this._values = [];
58635       this._features = [];
58636
58637       pbf.readFields(readLayer, this, end);
58638
58639       this.length = this._features.length;
58640   }
58641
58642   function readLayer(tag, layer, pbf) {
58643       if (tag === 15) layer.version = pbf.readVarint();
58644       else if (tag === 1) layer.name = pbf.readString();
58645       else if (tag === 5) layer.extent = pbf.readVarint();
58646       else if (tag === 2) layer._features.push(pbf.pos);
58647       else if (tag === 3) layer._keys.push(pbf.readString());
58648       else if (tag === 4) layer._values.push(readValueMessage(pbf));
58649   }
58650
58651   function readValueMessage(pbf) {
58652       var value = null,
58653           end = pbf.readVarint() + pbf.pos;
58654
58655       while (pbf.pos < end) {
58656           var tag = pbf.readVarint() >> 3;
58657
58658           value = tag === 1 ? pbf.readString() :
58659               tag === 2 ? pbf.readFloat() :
58660               tag === 3 ? pbf.readDouble() :
58661               tag === 4 ? pbf.readVarint64() :
58662               tag === 5 ? pbf.readVarint() :
58663               tag === 6 ? pbf.readSVarint() :
58664               tag === 7 ? pbf.readBoolean() : null;
58665       }
58666
58667       return value;
58668   }
58669
58670   // return feature `i` from this layer as a `VectorTileFeature`
58671   VectorTileLayer.prototype.feature = function(i) {
58672       if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
58673
58674       this._pbf.pos = this._features[i];
58675
58676       var end = this._pbf.readVarint() + this._pbf.pos;
58677       return new vectortilefeature(this._pbf, end, this.extent, this._keys, this._values);
58678   };
58679
58680   var vectortile = VectorTile;
58681
58682   function VectorTile(pbf, end) {
58683       this.layers = pbf.readFields(readTile, {}, end);
58684   }
58685
58686   function readTile(tag, layers, pbf) {
58687       if (tag === 3) {
58688           var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos);
58689           if (layer.length) layers[layer.name] = layer;
58690       }
58691   }
58692
58693   var VectorTile$1 = vectortile;
58694   var VectorTileFeature$1 = vectortilefeature;
58695   var VectorTileLayer$1 = vectortilelayer;
58696
58697   var vectorTile = {
58698         VectorTile: VectorTile$1,
58699         VectorTileFeature: VectorTileFeature$1,
58700         VectorTileLayer: VectorTileLayer$1
58701   };
58702
58703   var tiler$6 = utilTiler().tileSize(512).margin(1);
58704   var dispatch$7 = dispatch('loadedData');
58705   var _vtCache;
58706
58707
58708   function abortRequest$6(i) {
58709       i.abort();
58710   }
58711
58712
58713   function vtToGeoJSON(data, tile, mergeCache) {
58714       var vectorTile$1 = new vectorTile.VectorTile(new pbf(data.response));
58715       var layers = Object.keys(vectorTile$1.layers);
58716       if (!Array.isArray(layers)) { layers = [layers]; }
58717
58718       var features = [];
58719       layers.forEach(function(layerID) {
58720           var layer = vectorTile$1.layers[layerID];
58721           if (layer) {
58722               for (var i = 0; i < layer.length; i++) {
58723                   var feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
58724                   var geometry = feature.geometry;
58725
58726                   // Treat all Polygons as MultiPolygons
58727                   if (geometry.type === 'Polygon') {
58728                       geometry.type = 'MultiPolygon';
58729                       geometry.coordinates = [geometry.coordinates];
58730                   }
58731
58732                   // Clip to tile bounds
58733                   if (geometry.type === 'MultiPolygon') {
58734                       var isClipped = false;
58735                       var featureClip = turf_bboxClip(feature, tile.extent.rectangle());
58736                       if (!isEqual(feature.geometry, featureClip.geometry)) {
58737                           // feature = featureClip;
58738                           isClipped = true;
58739                       }
58740                       if (!feature.geometry.coordinates.length) continue;   // not actually on this tile
58741                       if (!feature.geometry.coordinates[0].length) continue;   // not actually on this tile
58742                   }
58743
58744                   // Generate some unique IDs and add some metadata
58745                   var featurehash = utilHashcode(fastJsonStableStringify(feature));
58746                   var propertyhash = utilHashcode(fastJsonStableStringify(feature.properties || {}));
58747                   feature.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, '_');
58748                   feature.__featurehash__ = featurehash;
58749                   feature.__propertyhash__ = propertyhash;
58750                   features.push(feature);
58751
58752                   // Clipped Polygons at same zoom with identical properties can get merged
58753                   if (isClipped && geometry.type === 'MultiPolygon') {
58754                       var merged = mergeCache[propertyhash];
58755                       if (merged && merged.length) {
58756                           var other = merged[0];
58757                           var coords = martinez.union(
58758                               feature.geometry.coordinates, other.geometry.coordinates
58759                           );
58760
58761                           if (!coords || !coords.length) {
58762                               continue;  // something failed in martinez union
58763                           }
58764
58765                           merged.push(feature);
58766                           for (var j = 0; j < merged.length; j++) {      // all these features get...
58767                               merged[j].geometry.coordinates = coords;   // same coords
58768                               merged[j].__featurehash__ = featurehash;   // same hash, so deduplication works
58769                           }
58770                       } else {
58771                           mergeCache[propertyhash] = [feature];
58772                       }
58773                   }
58774               }
58775           }
58776       });
58777
58778       return features;
58779   }
58780
58781
58782   function loadTile(source, tile) {
58783       if (source.loaded[tile.id] || source.inflight[tile.id]) return;
58784
58785       var url = source.template
58786           .replace('{x}', tile.xyz[0])
58787           .replace('{y}', tile.xyz[1])
58788           // TMS-flipped y coordinate
58789           .replace(/\{[t-]y\}/, Math.pow(2, tile.xyz[2]) - tile.xyz[1] - 1)
58790           .replace(/\{z(oom)?\}/, tile.xyz[2])
58791           .replace(/\{switch:([^}]+)\}/, function(s, r) {
58792               var subdomains = r.split(',');
58793               return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length];
58794           });
58795
58796       source.inflight[tile.id] = request(url)
58797           .responseType('arraybuffer')
58798           .get(function(err, data) {
58799               source.loaded[tile.id] = [];
58800               delete source.inflight[tile.id];
58801               if (err || !data) return;
58802
58803               var z = tile.xyz[2];
58804               if (!source.canMerge[z]) {
58805                   source.canMerge[z] = {};  // initialize mergeCache
58806               }
58807
58808               source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]);
58809               dispatch$7.call('loadedData');
58810           });
58811   }
58812
58813
58814   var serviceVectorTile = {
58815
58816       init: function() {
58817           if (!_vtCache) {
58818               this.reset();
58819           }
58820
58821           this.event = utilRebind(this, dispatch$7, 'on');
58822       },
58823
58824
58825       reset: function() {
58826           for (var sourceID in _vtCache) {
58827               var source = _vtCache[sourceID];
58828               if (source && source.inflight) {
58829                   forEach(source.inflight, abortRequest$6);
58830               }
58831           }
58832
58833           _vtCache = {};
58834       },
58835
58836
58837       addSource: function(sourceID, template) {
58838           _vtCache[sourceID] = { template: template, inflight: {}, loaded: {}, canMerge: {} };
58839           return _vtCache[sourceID];
58840       },
58841
58842
58843       data: function(sourceID, projection) {
58844           var source = _vtCache[sourceID];
58845           if (!source) return [];
58846
58847           var tiles = tiler$6.getTiles(projection);
58848           var seen = {};
58849           var results = [];
58850
58851           for (var i = 0; i < tiles.length; i++) {
58852               var features = source.loaded[tiles[i].id];
58853               if (!features || !features.length) continue;
58854
58855               for (var j = 0; j < features.length; j++) {
58856                   var feature = features[j];
58857                   var hash = feature.__featurehash__;
58858                   if (seen[hash]) continue;
58859                   seen[hash] = true;
58860
58861                   // return a shallow clone, because the hash may change
58862                   // later if this feature gets merged with another
58863                   results.push(clone(feature));
58864               }
58865           }
58866
58867           return results;
58868       },
58869
58870
58871       loadTiles: function(sourceID, template, projection) {
58872           var source = _vtCache[sourceID];
58873           if (!source) {
58874               source = this.addSource(sourceID, template);
58875           }
58876
58877           var tiles = tiler$6.getTiles(projection);
58878
58879           // abort inflight requests that are no longer needed
58880           forEach(source.inflight, function(v, k) {
58881               var wanted = find$1(tiles, function(tile) { return k === tile.id; });
58882
58883               if (!wanted) {
58884                   abortRequest$6(v);
58885                   delete source.inflight[k];
58886               }
58887           });
58888
58889           tiles.forEach(function(tile) {
58890               loadTile(source, tile);
58891           });
58892       },
58893
58894
58895       cache: function() {
58896           return _vtCache;
58897       }
58898
58899   };
58900
58901   var apibase$5 = 'https://www.wikidata.org/w/api.php?';
58902   var _wikidataCache = {};
58903
58904   var serviceWikidata = {
58905
58906       init: function() {},
58907
58908       reset: function() {
58909           _wikidataCache = {};
58910       },
58911
58912
58913       // Given a Wikipedia language and article title, return an array of
58914       // corresponding Wikidata entities.
58915       itemsByTitle: function(lang, title, callback) {
58916           if (!title) {
58917               callback('No title', {});
58918               return;
58919           }
58920
58921           lang = lang || 'en';
58922
58923           d3_json(apibase$5 + utilQsString({
58924               action: 'wbgetentities',
58925               format: 'json',
58926               formatversion: 2,
58927               sites: lang.replace(/-/g, '_') + 'wiki',
58928               titles: title,
58929               languages: 'en', // shrink response by filtering to one language
58930               origin: '*'
58931           }), function(err, data) {
58932               if (data && data.error) {
58933                   err = data.error;
58934               }
58935               if (err) {
58936                   callback(err, {});
58937               } else {
58938                   callback(null, data.entities || {});
58939               }
58940           });
58941       },
58942
58943
58944       entityByQID: function(qid, callback) {
58945           if (!qid) {
58946               callback('No qid', {});
58947               return;
58948           }
58949           if (_wikidataCache[qid]) {
58950               callback(null, _wikidataCache[qid]);
58951               return;
58952           }
58953
58954           var langs = uniq([
58955               currentLocale.toLowerCase(),
58956               currentLocale.split('-', 2)[0].toLowerCase(),
58957               'en'
58958           ]);
58959
58960           d3_json(apibase$5 + utilQsString({
58961               action: 'wbgetentities',
58962               format: 'json',
58963               formatversion: 2,
58964               ids: qid,
58965               props: 'labels|descriptions|claims|sitelinks',
58966               sitefilter: langs.map(function(d) { return d + 'wiki'; }).join('|'),
58967               languages: langs.join('|'),
58968               languagefallback: 1,
58969               origin: '*'
58970           }), function(err, data) {
58971               if (data && data.error) {
58972                   err = data.error;
58973               }
58974               if (err) {
58975                   callback(err, {});
58976               } else {
58977                   _wikidataCache[qid] = data.entities[qid];
58978                   callback(null, data.entities[qid] || {});
58979               }
58980           });
58981       },
58982
58983
58984       // Pass `params` object of the form:
58985       // {
58986       //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
58987       // }
58988       //
58989       // Get an result object used to display tag documentation
58990       // {
58991       //   title:        'string',
58992       //   description:  'string',
58993       //   editURL:      'string',
58994       //   imageURL:     'string',
58995       //   wiki:         { title: 'string', text: 'string', url: 'string' }
58996       // }
58997       //
58998       getDocs: function(params, callback) {
58999           this.entityByQID(params.qid, function(err, entity) {
59000               if (err || !entity) {
59001                   callback(err || 'No entity');
59002                   return;
59003               }
59004
59005               var i;
59006
59007               var description;
59008               if (entity.descriptions && Object.keys(entity.descriptions).length > 0) {
59009                   description = entity.descriptions[Object.keys(entity.descriptions)[0]].value;
59010               }
59011
59012               // prepare result
59013               var result = {
59014                   title: entity.id,
59015                   description: description,
59016                   editURL: 'https://www.wikidata.org/wiki/' + entity.id
59017               };
59018
59019               // add image
59020               if (entity.claims) {
59021                   var imageroot = 'https://commons.wikimedia.org/w/index.php';
59022                   var props = ['P154','P18'];  // logo image, image
59023                   var prop, image;
59024                   for (i = 0; i < props.length; i++) {
59025                       prop = entity.claims[props[i]];
59026                       if (prop && Object.keys(prop).length > 0) {
59027                           image = prop[Object.keys(prop)[0]].mainsnak.datavalue.value;
59028                           if (image) {
59029                               result.imageURL = imageroot + '?' + utilQsString({
59030                                   title: 'Special:Redirect/file/' + image,
59031                                   width: 400
59032                               });
59033                               break;
59034                           }
59035                       }
59036                   }
59037               }
59038
59039               if (entity.sitelinks) {
59040                   // must be one of these that we requested..
59041                   var langs = uniq([
59042                       currentLocale.toLowerCase(),
59043                       currentLocale.split('-', 2)[0].toLowerCase(),
59044                       'en'
59045                   ]);
59046                   var englishLocale = (currentLocale.split('-', 2)[0].toLowerCase() === 'en');
59047
59048                   for (i = 0; i < langs.length; i++) {   // check each, in order of preference
59049                       var w = langs[i] + 'wiki';
59050                       if (entity.sitelinks[w]) {
59051                           var title = entity.sitelinks[w].title;
59052                           var tKey = 'inspector.wiki_reference';
59053                           if (!englishLocale && langs[i] === 'en') {   // user's currentLocale isn't English but
59054                               tKey = 'inspector.wiki_en_reference';    // we are sending them to enwiki anyway..
59055                           }
59056
59057                           result.wiki = {
59058                               title: title,
59059                               text: tKey,
59060                               url: 'https://' + langs[i] + '.wikipedia.org/wiki/' + title.replace(/ /g, '_')
59061                           };
59062                           break;
59063                       }
59064                   }
59065               }
59066
59067               callback(null, result);
59068           });
59069       }
59070
59071   };
59072
59073   var endpoint = 'https://en.wikipedia.org/w/api.php?';
59074
59075   var serviceWikipedia = {
59076
59077       init: function() {},
59078       reset: function() {},
59079
59080
59081       search: function(lang, query, callback) {
59082           if (!query) {
59083               callback('', []);
59084               return;
59085           }
59086
59087           lang = lang || 'en';
59088           d3_json(endpoint.replace('en', lang) +
59089               utilQsString({
59090                   action: 'query',
59091                   list: 'search',
59092                   srlimit: '10',
59093                   srinfo: 'suggestion',
59094                   format: 'json',
59095                   origin: '*',
59096                   srsearch: query
59097               }), function(err, data) {
59098                   if (err || !data || !data.query || !data.query.search || data.error) {
59099                       callback('', []);
59100                   } else {
59101                       var results = data.query.search.map(function(d) { return d.title; });
59102                       callback(query, results);
59103                   }
59104               }
59105           );
59106       },
59107
59108
59109       suggestions: function(lang, query, callback) {
59110           if (!query) {
59111               callback('', []);
59112               return;
59113           }
59114
59115           lang = lang || 'en';
59116           d3_json(endpoint.replace('en', lang) +
59117               utilQsString({
59118                   action: 'opensearch',
59119                   namespace: 0,
59120                   suggest: '',
59121                   format: 'json',
59122                   origin: '*',
59123                   search: query
59124               }), function(err, data) {
59125                   if (err || !data || data.error) {
59126                       callback('', []);
59127                   } else {
59128                       callback(data[0], data[1] || []);
59129                   }
59130               }
59131           );
59132       },
59133
59134
59135       translations: function(lang, title, callback) {
59136           if (!title) {
59137               callback({});
59138               return;
59139           }
59140
59141           d3_json(endpoint.replace('en', lang) +
59142               utilQsString({
59143                   action: 'query',
59144                   prop: 'langlinks',
59145                   format: 'json',
59146                   origin: '*',
59147                   lllimit: 500,
59148                   titles: title
59149               }), function(err, data) {
59150                   if (err || !data || !data.query || !data.query.pages || data.error) {
59151                       callback({});
59152                   } else {
59153                       var list = data.query.pages[Object.keys(data.query.pages)[0]],
59154                           translations = {};
59155                       if (list && list.langlinks) {
59156                           list.langlinks.forEach(function(d) {
59157                               translations[d.lang] = d['*'];
59158                           });
59159                       }
59160                       callback(translations);
59161                   }
59162               }
59163           );
59164       }
59165
59166   };
59167
59168   var services = {
59169       geocoder: serviceNominatim,
59170       keepRight: serviceKeepRight,
59171       improveOSM: serviceImproveOSM,
59172       mapillary: serviceMapillary,
59173       openstreetcam: serviceOpenstreetcam,
59174       osm: serviceOsm,
59175       osmWikibase: serviceOsmWikibase,
59176       maprules: serviceMapRules,
59177       streetside: serviceStreetside,
59178       taginfo: serviceTaginfo,
59179       vectorTile: serviceVectorTile,
59180       wikidata: serviceWikidata,
59181       wikipedia: serviceWikipedia
59182   };
59183
59184   function modeAddNote(context) {
59185       var mode = {
59186           id: 'add-note',
59187           button: 'note',
59188           title: t('modes.add_note.title'),
59189           description: t('modes.add_note.description'),
59190           key: '4'
59191       };
59192
59193       var behavior = behaviorDraw(context)
59194           .tail(t('modes.add_note.tail'))
59195           .on('click', add)
59196           .on('cancel', cancel)
59197           .on('finish', cancel);
59198
59199
59200       function add(loc) {
59201           var osm = services.osm;
59202           if (!osm) return;
59203
59204           var note = osmNote({ loc: loc, status: 'open', comments: [] });
59205           osm.replaceNote(note);
59206
59207           // force a reraw (there is no history change that would otherwise do this)
59208           context.pan([0,0]);
59209
59210           context
59211               .selectedNoteID(note.id)
59212               .enter(modeSelectNote(context, note.id).newFeature(true));
59213       }
59214
59215
59216       function cancel() {
59217           context.enter(modeBrowse(context));
59218       }
59219
59220
59221       mode.enter = function() {
59222           context.install(behavior);
59223       };
59224
59225
59226       mode.exit = function() {
59227           context.uninstall(behavior);
59228       };
59229
59230
59231       return mode;
59232   }
59233
59234   function modeDragNode(context) {
59235       var mode = {
59236           id: 'drag-node',
59237           button: 'browse'
59238       };
59239       var hover = behaviorHover(context).altDisables(true)
59240           .on('hover', context.ui().sidebar.hover);
59241       var edit = behaviorEdit(context);
59242
59243       var _nudgeInterval;
59244       var _restoreSelectedIDs = [];
59245       var _wasMidpoint = false;
59246       var _isCancelled = false;
59247       var _activeEntity;
59248       var _startLoc;
59249       var _lastLoc;
59250
59251
59252       function startNudge(entity, nudge) {
59253           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
59254           _nudgeInterval = window.setInterval(function() {
59255               context.pan(nudge);
59256               doMove(entity, nudge);
59257           }, 50);
59258       }
59259
59260
59261       function stopNudge() {
59262           if (_nudgeInterval) {
59263               window.clearInterval(_nudgeInterval);
59264               _nudgeInterval = null;
59265           }
59266       }
59267
59268
59269       function moveAnnotation(entity) {
59270           return t('operations.move.annotation.' + entity.geometry(context.graph()));
59271       }
59272
59273
59274       function connectAnnotation(nodeEntity, targetEntity) {
59275           var nodeGeometry = nodeEntity.geometry(context.graph());
59276           var targetGeometry = targetEntity.geometry(context.graph());
59277           if (nodeGeometry === 'vertex' && targetGeometry === 'vertex') {
59278               var nodeParentWayIDs = context.graph().parentWays(nodeEntity);
59279               var targetParentWayIDs = context.graph().parentWays(targetEntity);
59280               var sharedParentWays = intersection(nodeParentWayIDs, targetParentWayIDs);
59281               // if both vertices are part of the same way
59282               if (sharedParentWays.length !== 0) {
59283                   // if the nodes are next to each other, they are merged
59284                   if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) {
59285                       return t('operations.connect.annotation.from_vertex.to_adjacent_vertex');
59286                   }
59287                   return t('operations.connect.annotation.from_vertex.to_sibling_vertex');
59288               }
59289           }
59290           return t('operations.connect.annotation.from_' + nodeGeometry + '.to_' + targetGeometry);
59291       }
59292
59293
59294       function shouldSnapToNode(target) {
59295           return _activeEntity.geometry(context.graph()) !== 'vertex' ||
59296               context.presets().allowsVertex(target, context.graph());
59297       }
59298
59299
59300       function origin(entity) {
59301           return context.projection(entity.loc);
59302       }
59303
59304
59305       function keydown() {
59306           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
59307               if (context.surface().classed('nope')) {
59308                   context.surface()
59309                       .classed('nope-suppressed', true);
59310               }
59311               context.surface()
59312                   .classed('nope', false)
59313                   .classed('nope-disabled', true);
59314           }
59315       }
59316
59317
59318       function keyup() {
59319           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
59320               if (context.surface().classed('nope-suppressed')) {
59321                   context.surface()
59322                       .classed('nope', true);
59323               }
59324               context.surface()
59325                   .classed('nope-suppressed', false)
59326                   .classed('nope-disabled', false);
59327           }
59328       }
59329
59330
59331       function start(entity) {
59332           _wasMidpoint = entity.type === 'midpoint';
59333           var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
59334           _isCancelled = event.sourceEvent.shiftKey || hasHidden;
59335
59336
59337           if (_isCancelled) {
59338               if (hasHidden) {
59339                   uiFlash()
59340                       .duration(4000)
59341                       .text(t('modes.drag_node.connected_to_hidden'))();
59342               }
59343               return drag.cancel();
59344           }
59345
59346           if (_wasMidpoint) {
59347               var midpoint = entity;
59348               entity = osmNode();
59349               context.perform(actionAddMidpoint(midpoint, entity));
59350               entity = context.entity(entity.id);   // get post-action entity
59351
59352               var vertex = context.surface().selectAll('.' + entity.id);
59353               drag.target(vertex.node(), entity);
59354
59355           } else {
59356               context.perform(actionNoop());
59357           }
59358
59359           _activeEntity = entity;
59360           _startLoc = entity.loc;
59361
59362           hover.ignoreVertex(entity.geometry(context.graph()) === 'vertex');
59363
59364           context.surface().selectAll('.' + _activeEntity.id)
59365               .classed('active', true);
59366
59367           context.enter(mode);
59368       }
59369
59370
59371       // related code
59372       // - `behavior/draw.js` `datum()`
59373       function datum() {
59374           var event$1 = event && event.sourceEvent;
59375           if (!event$1 || event$1.altKey) {
59376               return {};
59377           } else {
59378               // When dragging, snap only to touch targets..
59379               // (this excludes area fills and active drawing elements)
59380               var d = event$1.target.__data__;
59381               return (d && d.properties && d.properties.target) ? d : {};
59382           }
59383       }
59384
59385
59386       function doMove(entity, nudge) {
59387           nudge = nudge || [0, 0];
59388
59389           var currPoint = (event && event.point) || context.projection(_lastLoc);
59390           var currMouse = geoVecSubtract(currPoint, nudge);
59391           var loc = context.projection.invert(currMouse);
59392
59393           if (!_nudgeInterval) {   // If not nudging at the edge of the viewport, try to snap..
59394               // related code
59395               // - `mode/drag_node.js`     `doMode()`
59396               // - `behavior/draw.js`      `click()`
59397               // - `behavior/draw_way.js`  `move()`
59398               var d = datum();
59399               var target = d && d.properties && d.properties.entity;
59400               var targetLoc = target && target.loc;
59401               var targetNodes = d && d.properties && d.properties.nodes;
59402               var edge;
59403
59404               if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
59405                   if (shouldSnapToNode(target)) {
59406                       loc = targetLoc;
59407                   }
59408
59409               } else if (targetNodes) {   // snap to way - a line target with `.nodes`
59410                   edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
59411                   if (edge) {
59412                       loc = edge.loc;
59413                   }
59414               }
59415           }
59416
59417           context.replace(
59418               actionMoveNode(entity.id, loc)
59419           );
59420
59421           // Below here: validations
59422           var isInvalid = false;
59423
59424           // Check if this connection to `target` could cause relations to break..
59425           if (target) {
59426               isInvalid = hasRelationConflict(entity, target, edge, context.graph());
59427           }
59428
59429           // Check if this drag causes the geometry to break..
59430           if (!isInvalid) {
59431               isInvalid = hasInvalidGeometry(entity, context.graph());
59432           }
59433
59434
59435           var nope = context.surface().classed('nope');
59436           if (isInvalid === 'relation' || isInvalid === 'restriction') {
59437               if (!nope) {   // about to nope - show hint
59438                   uiFlash()
59439                       .duration(4000)
59440                       .text(t('operations.connect.' + isInvalid,
59441                           { relation: context.presets().item('type/restriction').name() }
59442                       ))();
59443               }
59444           } else {
59445               if (nope) {   // about to un-nope, remove hint
59446                   uiFlash()
59447                       .duration(1)
59448                       .text('')();
59449               }
59450           }
59451
59452
59453           var nopeDisabled = context.surface().classed('nope-disabled');
59454           if (nopeDisabled) {
59455               context.surface()
59456                   .classed('nope', false)
59457                   .classed('nope-suppressed', isInvalid);
59458           } else {
59459               context.surface()
59460                   .classed('nope', isInvalid)
59461                   .classed('nope-suppressed', false);
59462           }
59463
59464           _lastLoc = loc;
59465       }
59466
59467
59468       // Uses `actionConnect.disabled()` to know whether this connection is ok..
59469       function hasRelationConflict(entity, target, edge, graph) {
59470           var testGraph = graph.update();  // copy
59471
59472           // if snapping to way - add midpoint there and consider that the target..
59473           if (edge) {
59474               var midpoint = osmNode();
59475               var action = actionAddMidpoint({
59476                   loc: edge.loc,
59477                   edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
59478               }, midpoint);
59479
59480               testGraph = action(testGraph);
59481               target = midpoint;
59482           }
59483
59484           // can we connect to it?
59485           var ids = [entity.id, target.id];
59486           return actionConnect(ids).disabled(testGraph);
59487       }
59488
59489
59490       function hasInvalidGeometry(entity, graph) {
59491           var parents = graph.parentWays(entity);
59492           var i, j, k;
59493
59494           for (i = 0; i < parents.length; i++) {
59495               var parent = parents[i];
59496               var nodes = [];
59497               var activeIndex = null;    // which multipolygon ring contains node being dragged
59498
59499               // test any parent multipolygons for valid geometry
59500               var relations = graph.parentRelations(parent);
59501               for (j = 0; j < relations.length; j++) {
59502                   if (!relations[j].isMultipolygon()) continue;
59503
59504                   var rings = osmJoinWays(relations[j].members, graph);
59505
59506                   // find active ring and test it for self intersections
59507                   for (k = 0; k < rings.length; k++) {
59508                       nodes = rings[k].nodes;
59509                       if (find$1(nodes, function(n) { return n.id === entity.id; })) {
59510                           activeIndex = k;
59511                           if (geoHasSelfIntersections(nodes, entity.id)) {
59512                               return true;
59513                           }
59514                       }
59515                       rings[k].coords = nodes.map(function(n) { return n.loc; });
59516                   }
59517
59518                   // test active ring for intersections with other rings in the multipolygon
59519                   for (k = 0; k < rings.length; k++) {
59520                       if (k === activeIndex) continue;
59521
59522                       // make sure active ring doesnt cross passive rings
59523                       if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
59524                           return true;
59525                       }
59526                   }
59527               }
59528
59529
59530               // If we still haven't tested this node's parent way for self-intersections.
59531               // (because it's not a member of a multipolygon), test it now.
59532               if (activeIndex === null) {
59533                   nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
59534                   if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
59535                       return true;
59536                   }
59537               }
59538
59539           }
59540
59541           return false;
59542       }
59543
59544
59545       function move(entity) {
59546           if (_isCancelled) return;
59547           event.sourceEvent.stopPropagation();
59548
59549           context.surface().classed('nope-disabled', event.sourceEvent.altKey);
59550
59551           _lastLoc = context.projection.invert(event.point);
59552
59553           doMove(entity);
59554           var nudge = geoViewportEdge(event.point, context.map().dimensions());
59555           if (nudge) {
59556               startNudge(entity, nudge);
59557           } else {
59558               stopNudge();
59559           }
59560       }
59561
59562       function end(entity) {
59563           if (_isCancelled) return;
59564
59565           var d = datum();
59566           var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
59567           var target = d && d.properties && d.properties.entity;   // entity to snap to
59568
59569           if (nope) {   // bounce back
59570               context.perform(
59571                   _actionBounceBack(entity.id, _startLoc)
59572               );
59573
59574           } else if (target && target.type === 'way') {
59575               var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
59576               context.replace(
59577                   actionAddMidpoint({
59578                       loc: choice.loc,
59579                       edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
59580                   }, entity),
59581                   connectAnnotation(entity, target)
59582               );
59583
59584           } else if (target && target.type === 'node' && shouldSnapToNode(target)) {
59585               context.replace(
59586                   actionConnect([target.id, entity.id]),
59587                   connectAnnotation(entity, target)
59588               );
59589
59590           } else if (_wasMidpoint) {
59591               context.replace(
59592                   actionNoop(),
59593                   t('operations.add.annotation.vertex')
59594               );
59595
59596           } else {
59597               context.replace(
59598                   actionNoop(),
59599                   moveAnnotation(entity)
59600               );
59601           }
59602
59603           var reselection = _restoreSelectedIDs.filter(function(id) {
59604               return context.graph().hasEntity(id);
59605           });
59606
59607           if (reselection.length) {
59608               context.enter(modeSelect(context, reselection));
59609           } else {
59610               context.enter(modeBrowse(context));
59611           }
59612       }
59613
59614
59615       function _actionBounceBack(nodeID, toLoc) {
59616           var moveNode = actionMoveNode(nodeID, toLoc);
59617           var action = function(graph, t) {
59618               // last time through, pop off the bounceback perform.
59619               // it will then overwrite the initial perform with a moveNode that does nothing
59620               if (t === 1) context.pop();
59621               return moveNode(graph, t);
59622           };
59623           action.transitionable = true;
59624           return action;
59625       }
59626
59627
59628       function cancel() {
59629           drag.cancel();
59630           context.enter(modeBrowse(context));
59631       }
59632
59633
59634       var drag = behaviorDrag()
59635           .selector('.layer-touch.points .target')
59636           .surface(select('#map').node())
59637           .origin(origin)
59638           .on('start', start)
59639           .on('move', move)
59640           .on('end', end);
59641
59642
59643       mode.enter = function() {
59644           context.install(hover);
59645           context.install(edit);
59646
59647           select(window)
59648               .on('keydown.drawWay', keydown)
59649               .on('keyup.drawWay', keyup);
59650
59651           context.history()
59652               .on('undone.drag-node', cancel);
59653       };
59654
59655
59656       mode.exit = function() {
59657           context.ui().sidebar.hover.cancel();
59658           context.uninstall(hover);
59659           context.uninstall(edit);
59660
59661           select(window)
59662               .on('keydown.hover', null)
59663               .on('keyup.hover', null);
59664
59665           context.history()
59666               .on('undone.drag-node', null);
59667
59668           _activeEntity = null;
59669
59670           context.surface()
59671               .classed('nope', false)
59672               .classed('nope-suppressed', false)
59673               .classed('nope-disabled', false)
59674               .selectAll('.active')
59675               .classed('active', false);
59676
59677           stopNudge();
59678       };
59679
59680
59681       mode.selectedIDs = function() {
59682           if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
59683           // no assign
59684           return mode;
59685       };
59686
59687
59688       mode.activeID = function() {
59689           if (!arguments.length) return _activeEntity && _activeEntity.id;
59690           // no assign
59691           return mode;
59692       };
59693
59694
59695       mode.restoreSelectedIDs = function(_) {
59696           if (!arguments.length) return _restoreSelectedIDs;
59697           _restoreSelectedIDs = _;
59698           return mode;
59699       };
59700
59701
59702       mode.behavior = drag;
59703
59704
59705       return mode;
59706   }
59707
59708   function modeDragNote(context) {
59709       var mode = {
59710           id: 'drag-note',
59711           button: 'browse'
59712       };
59713
59714       var edit = behaviorEdit(context);
59715
59716       var _nudgeInterval;
59717       var _lastLoc;
59718       var _note;    // most current note.. dragged note may have stale datum.
59719
59720
59721       function startNudge(nudge) {
59722           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
59723           _nudgeInterval = window.setInterval(function() {
59724               context.pan(nudge);
59725               doMove(nudge);
59726           }, 50);
59727       }
59728
59729
59730       function stopNudge() {
59731           if (_nudgeInterval) {
59732               window.clearInterval(_nudgeInterval);
59733               _nudgeInterval = null;
59734           }
59735       }
59736
59737
59738       function origin(note) {
59739           return context.projection(note.loc);
59740       }
59741
59742
59743       function start(note) {
59744           _note = note;
59745           var osm = services.osm;
59746           if (osm) {
59747               // Get latest note from cache.. The marker may have a stale datum bound to it
59748               // and dragging it around can sometimes delete the users note comment.
59749               _note = osm.getNote(_note.id);
59750           }
59751
59752           context.surface().selectAll('.note-' + _note.id)
59753               .classed('active', true);
59754
59755           context.perform(actionNoop());
59756           context.enter(mode);
59757           context.selectedNoteID(_note.id);
59758       }
59759
59760
59761       function move() {
59762           event.sourceEvent.stopPropagation();
59763           _lastLoc = context.projection.invert(event.point);
59764
59765           doMove();
59766           var nudge = geoViewportEdge(event.point, context.map().dimensions());
59767           if (nudge) {
59768               startNudge(nudge);
59769           } else {
59770               stopNudge();
59771           }
59772       }
59773
59774
59775       function doMove(nudge) {
59776           nudge = nudge || [0, 0];
59777
59778           var currPoint = (event && event.point) || context.projection(_lastLoc);
59779           var currMouse = geoVecSubtract(currPoint, nudge);
59780           var loc = context.projection.invert(currMouse);
59781
59782           _note = _note.move(loc);
59783
59784           var osm = services.osm;
59785           if (osm) {
59786               osm.replaceNote(_note);  // update note cache
59787           }
59788
59789           context.replace(actionNoop());   // trigger redraw
59790       }
59791
59792
59793       function end() {
59794           context.replace(actionNoop());   // trigger redraw
59795
59796           context
59797               .selectedNoteID(_note.id)
59798               .enter(modeSelectNote(context, _note.id));
59799       }
59800
59801
59802       var drag = behaviorDrag()
59803           .selector('.layer-touch.markers .target.note.new')
59804           .surface(select('#map').node())
59805           .origin(origin)
59806           .on('start', start)
59807           .on('move', move)
59808           .on('end', end);
59809
59810
59811       mode.enter = function() {
59812           context.install(edit);
59813       };
59814
59815
59816       mode.exit = function() {
59817           context.ui().sidebar.hover.cancel();
59818           context.uninstall(edit);
59819
59820           context.surface()
59821               .selectAll('.active')
59822               .classed('active', false);
59823
59824           stopNudge();
59825       };
59826
59827       mode.behavior = drag;
59828
59829       return mode;
59830   }
59831
59832   function modeBrowse(context) {
59833       var mode = {
59834           button: 'browse',
59835           id: 'browse',
59836           title: t('modes.browse.title'),
59837           description: t('modes.browse.description')
59838       }, sidebar;
59839
59840       var behaviors = [
59841           behaviorPaste(context),
59842           behaviorHover(context).on('hover', context.ui().sidebar.hover),
59843           behaviorSelect(context),
59844           behaviorLasso(context),
59845           modeDragNode(context).behavior,
59846           modeDragNote(context).behavior
59847       ];
59848
59849
59850       mode.enter = function() {
59851           behaviors.forEach(context.install);
59852
59853           // Get focus on the body.
59854           if (document.activeElement && document.activeElement.blur) {
59855               document.activeElement.blur();
59856           }
59857
59858           if (sidebar) {
59859               context.ui().sidebar.show(sidebar);
59860           } else {
59861               context.ui().sidebar.select(null);
59862           }
59863       };
59864
59865
59866       mode.exit = function() {
59867           context.ui().sidebar.hover.cancel();
59868           behaviors.forEach(context.uninstall);
59869
59870           if (sidebar) {
59871               context.ui().sidebar.hide();
59872           }
59873       };
59874
59875
59876       mode.sidebar = function(_) {
59877           if (!arguments.length) return sidebar;
59878           sidebar = _;
59879           return mode;
59880       };
59881
59882
59883       return mode;
59884   }
59885
59886   function modeDrawArea(context, wayID, startGraph, baselineGraph) {
59887       var mode = {
59888           button: 'area',
59889           id: 'draw-area'
59890       };
59891
59892       var behavior;
59893
59894       mode.wayID = wayID;
59895
59896       mode.enter = function() {
59897           var way = context.entity(wayID);
59898
59899           behavior = behaviorDrawWay(context, wayID, undefined, mode, startGraph, baselineGraph)
59900               .tail(t('modes.draw_area.tail'));
59901
59902           var addNode = behavior.addNode;
59903
59904           behavior.addNode = function(node, d) {
59905               var length = way.nodes.length;
59906               var penultimate = length > 2 ? way.nodes[length - 2] : null;
59907
59908               if (node.id === way.first() || node.id === penultimate) {
59909                   behavior.finish();
59910               } else {
59911                   addNode(node, d);
59912               }
59913           };
59914
59915           context.install(behavior);
59916       };
59917
59918
59919       mode.exit = function() {
59920           context.uninstall(behavior);
59921       };
59922
59923
59924       mode.selectedIDs = function() {
59925           return [wayID];
59926       };
59927
59928
59929       mode.activeID = function() {
59930           return (behavior && behavior.activeID()) || [];
59931       };
59932
59933
59934       return mode;
59935   }
59936
59937   function modeDrawLine(context, wayID, startGraph, baselineGraph, affix, continuing) {
59938       var mode = {
59939           button: 'line',
59940           id: 'draw-line'
59941       };
59942
59943       var behavior;
59944
59945       mode.wayID = wayID;
59946
59947       mode.isContinuing = continuing;
59948
59949       mode.enter = function() {
59950           var way = context.entity(wayID);
59951           var index = (affix === 'prefix') ? 0 : undefined;
59952           var headID = (affix === 'prefix') ? way.first() : way.last();
59953
59954           behavior = behaviorDrawWay(context, wayID, index, mode, startGraph, baselineGraph)
59955               .tail(t('modes.draw_line.tail'));
59956
59957           var addNode = behavior.addNode;
59958           behavior.addNode = function(node, d) {
59959               if (node.id === headID) {
59960                   behavior.finish();
59961               } else {
59962                   addNode(node, d);
59963               }
59964           };
59965
59966           context.install(behavior);
59967       };
59968
59969
59970       mode.exit = function() {
59971           context.uninstall(behavior);
59972       };
59973
59974
59975       mode.selectedIDs = function() {
59976           return [wayID];
59977       };
59978
59979
59980       mode.activeID = function() {
59981           return (behavior && behavior.activeID()) || [];
59982       };
59983
59984       return mode;
59985   }
59986
59987   function modeMove(context, entityIDs, baseGraph) {
59988       var mode = {
59989           id: 'move',
59990           button: 'browse'
59991       };
59992
59993       var keybinding = utilKeybinding('move');
59994       var behaviors = [
59995           behaviorEdit(context),
59996           operationCircularize(entityIDs, context).behavior,
59997           operationDelete(entityIDs, context).behavior,
59998           operationOrthogonalize(entityIDs, context).behavior,
59999           operationReflectLong(entityIDs, context).behavior,
60000           operationReflectShort(entityIDs, context).behavior,
60001           operationRotate(entityIDs, context).behavior
60002       ];
60003       var annotation = entityIDs.length === 1 ?
60004           t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
60005           t('operations.move.annotation.multiple');
60006
60007       var _prevGraph;
60008       var _cache;
60009       var _origin;
60010       var _nudgeInterval;
60011
60012
60013       function doMove(nudge) {
60014           nudge = nudge || [0, 0];
60015
60016           var fn;
60017           if (_prevGraph !== context.graph()) {
60018               _cache = {};
60019               _origin = context.map().mouseCoordinates();
60020               fn = context.perform;
60021           } else {
60022               fn = context.overwrite;
60023           }
60024
60025           var currMouse = context.mouse();
60026           var origMouse = context.projection(_origin);
60027           var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
60028
60029           fn(actionMove(entityIDs, delta, context.projection, _cache));
60030           _prevGraph = context.graph();
60031       }
60032
60033
60034       function startNudge(nudge) {
60035           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
60036           _nudgeInterval = window.setInterval(function() {
60037               context.pan(nudge);
60038               doMove(nudge);
60039           }, 50);
60040       }
60041
60042
60043       function stopNudge() {
60044           if (_nudgeInterval) {
60045               window.clearInterval(_nudgeInterval);
60046               _nudgeInterval = null;
60047           }
60048       }
60049
60050
60051       function move() {
60052           doMove();
60053           var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
60054           if (nudge) {
60055               startNudge(nudge);
60056           } else {
60057               stopNudge();
60058           }
60059       }
60060
60061
60062       function finish() {
60063           event.stopPropagation();
60064           context.replace(actionNoop(), annotation);
60065           context.enter(modeSelect(context, entityIDs));
60066           stopNudge();
60067       }
60068
60069
60070       function cancel() {
60071           if (baseGraph) {
60072               while (context.graph() !== baseGraph) context.pop();
60073               context.enter(modeBrowse(context));
60074           } else {
60075               context.pop();
60076               context.enter(modeSelect(context, entityIDs));
60077           }
60078           stopNudge();
60079       }
60080
60081
60082       function undone() {
60083           context.enter(modeBrowse(context));
60084       }
60085
60086
60087       mode.enter = function() {
60088           _origin = context.map().mouseCoordinates();
60089           _prevGraph = null;
60090           _cache = {};
60091
60092           context.features().forceVisible(entityIDs);
60093
60094           behaviors.forEach(context.install);
60095
60096           context.surface()
60097               .on('mousemove.move', move)
60098               .on('click.move', finish);
60099
60100           context.history()
60101               .on('undone.move', undone);
60102
60103           keybinding
60104               .on('⎋', cancel)
60105               .on('↩', finish);
60106
60107           select(document)
60108               .call(keybinding);
60109       };
60110
60111
60112       mode.exit = function() {
60113           stopNudge();
60114
60115           behaviors.forEach(function(behavior) {
60116               context.uninstall(behavior);
60117           });
60118
60119           context.surface()
60120               .on('mousemove.move', null)
60121               .on('click.move', null);
60122
60123           context.history()
60124               .on('undone.move', null);
60125
60126           select(document)
60127               .call(keybinding.unbind);
60128
60129           context.features().forceVisible([]);
60130       };
60131
60132
60133       mode.selectedIDs = function() {
60134           if (!arguments.length) return entityIDs;
60135           // no assign
60136           return mode;
60137       };
60138
60139
60140       return mode;
60141   }
60142
60143   function modeRotate(context, entityIDs) {
60144       var mode = {
60145           id: 'rotate',
60146           button: 'browse'
60147       };
60148
60149       var keybinding = utilKeybinding('rotate');
60150       var behaviors = [
60151           behaviorEdit(context),
60152           operationCircularize(entityIDs, context).behavior,
60153           operationDelete(entityIDs, context).behavior,
60154           operationMove(entityIDs, context).behavior,
60155           operationOrthogonalize(entityIDs, context).behavior,
60156           operationReflectLong(entityIDs, context).behavior,
60157           operationReflectShort(entityIDs, context).behavior
60158       ];
60159       var annotation = entityIDs.length === 1 ?
60160           t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
60161           t('operations.rotate.annotation.multiple');
60162
60163       var _prevGraph;
60164       var _prevAngle;
60165       var _prevTransform;
60166       var _pivot;
60167
60168
60169       function doRotate() {
60170           var fn;
60171           if (context.graph() !== _prevGraph) {
60172               fn = context.perform;
60173           } else {
60174               fn = context.replace;
60175           }
60176
60177           // projection changed, recalculate _pivot
60178           var projection = context.projection;
60179           var currTransform = projection.transform();
60180           if (!_prevTransform ||
60181               currTransform.k !== _prevTransform.k ||
60182               currTransform.x !== _prevTransform.x ||
60183               currTransform.y !== _prevTransform.y) {
60184
60185               var nodes = utilGetAllNodes(entityIDs, context.graph());
60186               var points = nodes.map(function(n) { return projection(n.loc); });
60187
60188               if (points.length === 1) {  // degenerate case
60189                   _pivot = points[0];
60190               } else if (points.length === 2) {
60191                   _pivot = geoVecInterp(points[0], points[1], 0.5);
60192               } else {
60193                   _pivot = d3_polygonCentroid(d3_polygonHull(points));
60194               }
60195               _prevAngle = undefined;
60196           }
60197
60198
60199           var currMouse = context.mouse();
60200           var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
60201
60202           if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
60203           var delta = currAngle - _prevAngle;
60204
60205           fn(actionRotate(entityIDs, _pivot, delta, projection));
60206
60207           _prevTransform = currTransform;
60208           _prevAngle = currAngle;
60209           _prevGraph = context.graph();
60210       }
60211
60212
60213       function finish() {
60214           event.stopPropagation();
60215           context.replace(actionNoop(), annotation);
60216           context.enter(modeSelect(context, entityIDs));
60217       }
60218
60219
60220       function cancel() {
60221           context.pop();
60222           context.enter(modeSelect(context, entityIDs));
60223       }
60224
60225
60226       function undone() {
60227           context.enter(modeBrowse(context));
60228       }
60229
60230
60231       mode.enter = function() {
60232           context.features().forceVisible(entityIDs);
60233
60234           behaviors.forEach(context.install);
60235
60236           context.surface()
60237               .on('mousemove.rotate', doRotate)
60238               .on('click.rotate', finish);
60239
60240           context.history()
60241               .on('undone.rotate', undone);
60242
60243           keybinding
60244               .on('⎋', cancel)
60245               .on('↩', finish);
60246
60247           select(document)
60248               .call(keybinding);
60249       };
60250
60251
60252       mode.exit = function() {
60253           behaviors.forEach(context.uninstall);
60254
60255           context.surface()
60256               .on('mousemove.rotate', null)
60257               .on('click.rotate', null);
60258
60259           context.history()
60260               .on('undone.rotate', null);
60261
60262           select(document)
60263               .call(keybinding.unbind);
60264
60265           context.features().forceVisible([]);
60266       };
60267
60268
60269       mode.selectedIDs = function() {
60270           if (!arguments.length) return entityIDs;
60271           // no assign
60272           return mode;
60273       };
60274
60275
60276       return mode;
60277   }
60278
60279   var _isSaving = false;
60280
60281
60282   function modeSave(context) {
60283       var mode = { id: 'save' };
60284       var keybinding = utilKeybinding('modeSave');
60285
60286       var loading = uiLoading(context)
60287           .message(t('save.uploading'))
60288           .blocking(true);
60289
60290       var commit = uiCommit(context)
60291           .on('cancel', cancel)
60292           .on('save', save);
60293
60294       var _toCheck = [];
60295       var _toLoad = [];
60296       var _loaded = {};
60297       var _toLoadCount = 0;
60298       var _toLoadTotal = 0;
60299
60300       var _conflicts = [];
60301       var _errors = [];
60302       var _origChanges;
60303       var _location;
60304
60305
60306       function cancel(selectedID) {
60307           if (selectedID) {
60308               context.enter(modeSelect(context, [selectedID]));
60309           } else {
60310               context.enter(modeBrowse(context));
60311           }
60312       }
60313
60314
60315       function save(changeset, tryAgain, checkConflicts) {
60316           // Guard against accidentally entering save code twice - #4641
60317           if (_isSaving && !tryAgain) {
60318               return;
60319           }
60320
60321           var osm = context.connection();
60322           if (!osm) {
60323               cancel();
60324               return;
60325           }
60326
60327           // If user somehow got logged out mid-save, try to reauthenticate..
60328           // This can happen if they were logged in from before, but the tokens are no longer valid.
60329           if (!osm.authenticated()) {
60330               osm.authenticate(function(err) {
60331                   if (err) {
60332                       cancel();   // quit save mode..
60333                   } else {
60334                       save(changeset, tryAgain, checkConflicts);  // continue where we left off..
60335                   }
60336               });
60337               return;
60338           }
60339
60340           if (!_isSaving) {
60341               keybindingOff();
60342               context.container().call(loading);  // block input
60343               _isSaving = true;
60344           }
60345
60346           var history = context.history();
60347           var localGraph = context.graph();
60348           var remoteGraph = coreGraph(history.base(), true);
60349
60350           _conflicts = [];
60351           _errors = [];
60352
60353           // Store original changes, in case user wants to download them as an .osc file
60354           _origChanges = history.changes(actionDiscardTags(history.difference()));
60355
60356           // First time, `history.perform` a no-op action.
60357           // Any conflict resolutions will be done as `history.replace`
60358           if (!tryAgain) {
60359               history.perform(actionNoop());
60360           }
60361
60362           // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
60363           if (!checkConflicts) {
60364               upload(changeset);
60365
60366           // Do the full (slow) conflict check..
60367           } else {
60368               var modified = filter(history.difference().summary(), { changeType: 'modified' });
60369               _toCheck = map$3(map$3(modified, 'entity'), 'id');
60370               _toLoad = withChildNodes(_toCheck, localGraph);
60371               _loaded = {};
60372               _toLoadCount = 0;
60373               _toLoadTotal = _toLoad.length;
60374
60375               if (_toCheck.length) {
60376                   showProgress(_toLoadCount, _toLoadTotal);
60377                   _toLoad.forEach(function(id) { _loaded[id] = false; });
60378                   osm.loadMultiple(_toLoad, loaded);
60379               } else {
60380                   upload(changeset);
60381               }
60382           }
60383
60384           return;
60385
60386
60387           function withChildNodes(ids, graph) {
60388               return uniq(reduce(ids, function(result, id) {
60389                   var entity = graph.entity(id);
60390                   if (entity.type === 'way') {
60391                       try {
60392                           var children = graph.childNodes(entity);
60393                           result.push.apply(result, map$3(filter(children, 'version'), 'id'));
60394                       } catch (err) {
60395                           /* eslint-disable no-console */
60396                           if (typeof console !== 'undefined') console.error(err);
60397                           /* eslint-enable no-console */
60398                       }
60399                   }
60400                   return result;
60401               }, clone(ids)));
60402           }
60403
60404
60405           // Reload modified entities into an alternate graph and check for conflicts..
60406           function loaded(err, result) {
60407               if (_errors.length) return;
60408
60409               if (err) {
60410                   _errors.push({
60411                       msg: err.message || err.responseText,
60412                       details: [ t('save.status_code', { code: err.status }) ]
60413                   });
60414                   showErrors();
60415
60416               } else {
60417                   var loadMore = [];
60418
60419                   result.data.forEach(function(entity) {
60420                       remoteGraph.replace(entity);
60421                       _loaded[entity.id] = true;
60422                       _toLoad = without(_toLoad, entity.id);
60423
60424                       if (!entity.visible) return;
60425
60426                       // Because loadMultiple doesn't download /full like loadEntity,
60427                       // need to also load children that aren't already being checked..
60428                       var i, id;
60429                       if (entity.type === 'way') {
60430                           for (i = 0; i < entity.nodes.length; i++) {
60431                               id = entity.nodes[i];
60432                               if (_loaded[id] === undefined) {
60433                                   _loaded[id] = false;
60434                                   loadMore.push(id);
60435                               }
60436                           }
60437                       } else if (entity.type === 'relation' && entity.isMultipolygon()) {
60438                           for (i = 0; i < entity.members.length; i++) {
60439                               id = entity.members[i].id;
60440                               if (_loaded[id] === undefined) {
60441                                   _loaded[id] = false;
60442                                   loadMore.push(id);
60443                               }
60444                           }
60445                       }
60446                   });
60447
60448                   _toLoadCount += result.data.length;
60449                   _toLoadTotal += loadMore.length;
60450                   showProgress(_toLoadCount, _toLoadTotal);
60451
60452                   if (loadMore.length) {
60453                       _toLoad.push.apply(_toLoad, loadMore);
60454                       osm.loadMultiple(loadMore, loaded);
60455                   }
60456
60457                   if (!_toLoad.length) {
60458                       detectConflicts();
60459                   }
60460               }
60461           }
60462
60463
60464           function detectConflicts() {
60465               function choice(id, text, action) {
60466                   return { id: id, text: text, action: function() { history.replace(action); } };
60467               }
60468               function formatUser(d) {
60469                   return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
60470               }
60471               function entityName(entity) {
60472                   return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
60473               }
60474
60475               function sameVersions(local, remote) {
60476                   if (local.version !== remote.version) return false;
60477
60478                   if (local.type === 'way') {
60479                       var children = union(local.nodes, remote.nodes);
60480                       for (var i = 0; i < children.length; i++) {
60481                           var a = localGraph.hasEntity(children[i]);
60482                           var b = remoteGraph.hasEntity(children[i]);
60483                           if (a && b && a.version !== b.version) return false;
60484                       }
60485                   }
60486
60487                   return true;
60488               }
60489
60490               _toCheck.forEach(function(id) {
60491                   var local = localGraph.entity(id);
60492                   var remote = remoteGraph.entity(id);
60493
60494                   if (sameVersions(local, remote)) return;
60495
60496                   var action = actionMergeRemoteChanges;
60497                   var merge = action(id, localGraph, remoteGraph, formatUser);
60498
60499                   history.replace(merge);
60500
60501                   var mergeConflicts = merge.conflicts();
60502                   if (!mergeConflicts.length) return;  // merged safely
60503
60504                   var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
60505                   var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
60506                   var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
60507                   var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
60508
60509                   _conflicts.push({
60510                       id: id,
60511                       name: entityName(local),
60512                       details: mergeConflicts,
60513                       chosen: 1,
60514                       choices: [
60515                           choice(id, keepMine, forceLocal),
60516                           choice(id, keepTheirs, forceRemote)
60517                       ]
60518                   });
60519               });
60520
60521               upload(changeset);
60522           }
60523       }
60524
60525
60526       function upload(changeset) {
60527           var osm = context.connection();
60528           if (!osm) {
60529               _errors.push({ msg: 'No OSM Service' });
60530           }
60531
60532           if (_conflicts.length) {
60533               _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
60534               showConflicts(changeset);
60535
60536           } else if (_errors.length) {
60537               showErrors();
60538
60539           } else {
60540               var history = context.history();
60541               var changes = history.changes(actionDiscardTags(history.difference()));
60542               if (changes.modified.length || changes.created.length || changes.deleted.length) {
60543                   loadLocation();  // so it is ready when we display the save screen
60544                   osm.putChangeset(changeset, changes, uploadCallback);
60545               } else {        // changes were insignificant or reverted by user
60546                   select('.inspector-wrap *').remove();
60547                   loading.close();
60548                   _isSaving = false;
60549                   context.flush();
60550                   cancel();
60551               }
60552           }
60553       }
60554
60555
60556       function uploadCallback(err, changeset) {
60557           if (err) {
60558               if (err.status === 409) {          // 409 Conflict
60559                   save(changeset, true, true);   // tryAgain = true, checkConflicts = true
60560               } else {
60561                   _errors.push({
60562                       msg: err.message || err.responseText,
60563                       details: [ t('save.status_code', { code: err.status }) ]
60564                   });
60565                   showErrors();
60566               }
60567
60568           } else {
60569               context.history().clearSaved();
60570               success(changeset);
60571               // Add delay to allow for postgres replication #1646 #2678
60572               window.setTimeout(function() {
60573                   select('.inspector-wrap *').remove();
60574                   loading.close();
60575                   _isSaving = false;
60576                   context.flush();
60577               }, 2500);
60578           }
60579       }
60580
60581
60582       function showProgress(num, total) {
60583           var modal = context.container().select('.loading-modal .modal-section');
60584           var progress = modal.selectAll('.progress')
60585               .data([0]);
60586
60587           // enter/update
60588           progress.enter()
60589               .append('div')
60590               .attr('class', 'progress')
60591               .merge(progress)
60592               .text(t('save.conflict_progress', { num: num, total: total }));
60593       }
60594
60595
60596       function showConflicts(changeset) {
60597           var history = context.history();
60598           var selection = context.container()
60599               .select('#sidebar')
60600               .append('div')
60601               .attr('class','sidebar-component');
60602
60603           loading.close();
60604           _isSaving = false;
60605
60606           var ui = uiConflicts(context)
60607               .conflictList(_conflicts)
60608               .origChanges(_origChanges)
60609               .on('cancel', function() {
60610                   history.pop();
60611                   selection.remove();
60612                   keybindingOn();
60613               })
60614               .on('save', function() {
60615                   for (var i = 0; i < _conflicts.length; i++) {
60616                       if (_conflicts[i].chosen === 1) {  // user chose "keep theirs"
60617                           var entity = context.hasEntity(_conflicts[i].id);
60618                           if (entity && entity.type === 'way') {
60619                               var children = uniq(entity.nodes);
60620                               for (var j = 0; j < children.length; j++) {
60621                                   history.replace(actionRevert(children[j]));
60622                               }
60623                           }
60624                           history.replace(actionRevert(_conflicts[i].id));
60625                       }
60626                   }
60627
60628                   selection.remove();
60629                   save(changeset, true, false);  // tryAgain = true, checkConflicts = false
60630               });
60631
60632           selection.call(ui);
60633       }
60634
60635
60636       function showErrors() {
60637           keybindingOn();
60638           context.history().pop();
60639           loading.close();
60640           _isSaving = false;
60641
60642           var selection = uiConfirm(context.container());
60643           selection
60644               .select('.modal-section.header')
60645               .append('h3')
60646               .text(t('save.error'));
60647
60648           addErrors(selection, _errors);
60649           selection.okButton();
60650       }
60651
60652
60653       function addErrors(selection, data) {
60654           var message = selection
60655               .select('.modal-section.message-text');
60656
60657           var items = message
60658               .selectAll('.error-container')
60659               .data(data);
60660
60661           var enter = items.enter()
60662               .append('div')
60663               .attr('class', 'error-container');
60664
60665           enter
60666               .append('a')
60667               .attr('class', 'error-description')
60668               .attr('href', '#')
60669               .classed('hide-toggle', true)
60670               .text(function(d) { return d.msg || t('save.unknown_error_details'); })
60671               .on('click', function() {
60672                   event.preventDefault();
60673
60674                   var error = select(this);
60675                   var detail = select(this.nextElementSibling);
60676                   var exp = error.classed('expanded');
60677
60678                   detail.style('display', exp ? 'none' : 'block');
60679                   error.classed('expanded', !exp);
60680               });
60681
60682           var details = enter
60683               .append('div')
60684               .attr('class', 'error-detail-container')
60685               .style('display', 'none');
60686
60687           details
60688               .append('ul')
60689               .attr('class', 'error-detail-list')
60690               .selectAll('li')
60691               .data(function(d) { return d.details || []; })
60692               .enter()
60693               .append('li')
60694               .attr('class', 'error-detail-item')
60695               .text(function(d) { return d; });
60696
60697           items.exit()
60698               .remove();
60699       }
60700
60701
60702       function success(changeset) {
60703           commit.reset();
60704
60705           var ui = uiSuccess(context)
60706               .changeset(changeset)
60707               .location(_location)
60708               .on('cancel', function() { context.ui().sidebar.hide(); });
60709
60710           context.enter(modeBrowse(context).sidebar(ui));
60711       }
60712
60713
60714       function keybindingOn() {
60715           select(document)
60716               .call(keybinding.on('⎋', cancel, true));
60717       }
60718
60719
60720       function keybindingOff() {
60721           select(document)
60722               .call(keybinding.unbind);
60723       }
60724
60725
60726       // Reverse geocode current map location so we can display a message on
60727       // the success screen like "Thank you for editing around city, state."
60728       function loadLocation() {
60729           _location = null;
60730           if (!services.geocoder) return;
60731
60732           services.geocoder.reverse(context.map().center(), function(err, result) {
60733               if (err || !result || !result.address) return;
60734
60735               var parts = [];
60736               var addr = result.address;
60737               var city = addr && (addr.town || addr.city || addr.county);
60738               if (city) parts.push(city);
60739               var region = addr && (addr.state || addr.country);
60740               if (region) parts.push(region);
60741
60742               _location = parts.join(', ');
60743           });
60744       }
60745
60746
60747       mode.enter = function() {
60748           // Show sidebar
60749           context.ui().sidebar.expand();
60750
60751           function done() {
60752               context.ui().sidebar.show(commit);
60753           }
60754
60755           keybindingOn();
60756
60757           context.container().selectAll('#content')
60758               .attr('class', 'inactive');
60759
60760           var osm = context.connection();
60761           if (!osm) {
60762               cancel();
60763               return;
60764           }
60765
60766           if (osm.authenticated()) {
60767               done();
60768           } else {
60769               osm.authenticate(function(err) {
60770                   if (err) {
60771                       cancel();
60772                   } else {
60773                       done();
60774                   }
60775               });
60776           }
60777       };
60778
60779
60780       mode.exit = function() {
60781           _isSaving = false;
60782
60783           keybindingOff();
60784
60785           context.container().selectAll('#content')
60786               .attr('class', 'active');
60787
60788           context.ui().sidebar.hide();
60789       };
60790
60791       return mode;
60792   }
60793
60794   // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
60795   // For example, ⌘Z -> Ctrl+Z
60796   var uiCmd = function (code) {
60797       var detected = utilDetect();
60798
60799       if (detected.os === 'mac') {
60800           return code;
60801       }
60802
60803       if (detected.os === 'win') {
60804           if (code === '⌘⇧Z') return 'Ctrl+Y';
60805       }
60806
60807       var result = '',
60808           replacements = {
60809               '⌘': 'Ctrl',
60810               '⇧': 'Shift',
60811               '⌥': 'Alt',
60812               '⌫': 'Backspace',
60813               '⌦': 'Delete'
60814           };
60815
60816       for (var i = 0; i < code.length; i++) {
60817           if (code[i] in replacements) {
60818               result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
60819           } else {
60820               result += code[i];
60821           }
60822       }
60823
60824       return result;
60825   };
60826
60827
60828   // return a display-focused string for a given keyboard code
60829   uiCmd.display = function(code) {
60830       if (code.length !== 1) return code;
60831
60832       var detected = utilDetect();
60833       var mac = (detected.os === 'mac');
60834       var replacements = {
60835           '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd')    : t('shortcuts.key.ctrl'),
60836           '⇧': mac ? '⇧ ' + t('shortcuts.key.shift')  : t('shortcuts.key.shift'),
60837           '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
60838           '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl')   : t('shortcuts.key.ctrl'),
60839           '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
60840           '⌦': mac ? '⌦ ' + t('shortcuts.key.del')    : t('shortcuts.key.del'),
60841           '↖': mac ? '↖ ' + t('shortcuts.key.pgup')   : t('shortcuts.key.pgup'),
60842           '↘': mac ? '↘ ' + t('shortcuts.key.pgdn')   : t('shortcuts.key.pgdn'),
60843           '⇞': mac ? '⇞ ' + t('shortcuts.key.home')   : t('shortcuts.key.home'),
60844           '⇟': mac ? '⇟ ' + t('shortcuts.key.end')    : t('shortcuts.key.end'),
60845           '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
60846           '⎋': mac ? '⎋ ' + t('shortcuts.key.esc')    : t('shortcuts.key.esc'),
60847       };
60848
60849       return replacements[code] || code;
60850   };
60851
60852   var _relatedParent;
60853
60854
60855   function modeSelect(context, selectedIDs) {
60856       var mode = {
60857           id: 'select',
60858           button: 'browse'
60859       };
60860
60861       var keybinding = utilKeybinding('select');
60862       var timeout = null;
60863       var behaviors = [
60864           behaviorCopy(context),
60865           behaviorPaste(context),
60866           behaviorBreathe(context),
60867           behaviorHover(context),
60868           behaviorSelect(context),
60869           behaviorLasso(context),
60870           modeDragNode(context).restoreSelectedIDs(selectedIDs).behavior,
60871           modeDragNote(context).behavior
60872       ];
60873       var editMenu;
60874       var newFeature = false;
60875       var suppressMenu = true;
60876       var follow = false;
60877
60878
60879       var wrap = context.container()
60880           .select('.inspector-wrap');
60881
60882
60883       function singular() {
60884           if (selectedIDs.length === 1) {
60885               return context.hasEntity(selectedIDs[0]);
60886           }
60887       }
60888
60889
60890       function checkSelectedIDs() {
60891           var ids = [];
60892           if (Array.isArray(selectedIDs)) {
60893               ids = selectedIDs.filter(function(id) {
60894                   return context.hasEntity(id);
60895               });
60896           }
60897
60898           if (ids.length) {
60899               selectedIDs = ids;
60900           } else {
60901               context.enter(modeBrowse(context));
60902           }
60903           return !!ids.length;
60904       }
60905
60906
60907       // find the common parent ways for nextVertex, previousVertex
60908       function commonParents() {
60909           var graph = context.graph();
60910           var commonParents = [];
60911
60912           for (var i = 0; i < selectedIDs.length; i++) {
60913               var entity = context.hasEntity(selectedIDs[i]);
60914               if (!entity || entity.geometry(graph) !== 'vertex') {
60915                   return [];  // selection includes some not vertexes
60916               }
60917
60918               var currParents = map$3(graph.parentWays(entity), 'id');
60919               if (!commonParents.length) {
60920                   commonParents = currParents;
60921                   continue;
60922               }
60923
60924               commonParents = intersection(commonParents, currParents);
60925               if (!commonParents.length) {
60926                   return [];
60927               }
60928           }
60929
60930           return commonParents;
60931       }
60932
60933
60934       function singularParent() {
60935           var parents = commonParents();
60936           if (!parents || parents.length === 0) {
60937               _relatedParent = null;
60938               return null;
60939           }
60940
60941           // relatedParent is used when we visit a vertex with multiple
60942           // parents, and we want to remember which parent line we started on.
60943
60944           if (parents.length === 1) {
60945               _relatedParent = parents[0];  // remember this parent for later
60946               return _relatedParent;
60947           }
60948
60949           if (parents.indexOf(_relatedParent) !== -1) {
60950               return _relatedParent;   // prefer the previously seen parent
60951           }
60952
60953           return parents[0];
60954       }
60955
60956
60957       function closeMenu() {
60958           if (editMenu) {
60959               context.surface().call(editMenu.close);
60960           }
60961       }
60962
60963
60964       function positionMenu() {
60965           if (!editMenu) { return; }
60966
60967           var entity = singular();
60968           if (entity && context.geometry(entity.id) === 'relation') {
60969               suppressMenu = true;
60970           } else {
60971               var point = context.mouse();
60972               var viewport = geoExtent(context.projection.clipExtent()).polygon();
60973
60974               if (point && geoPointInPolygon(point, viewport)) {
60975                   editMenu.center(point);
60976               } else {
60977                   suppressMenu = true;
60978               }
60979           }
60980       }
60981
60982
60983       function showMenu() {
60984           closeMenu();
60985           if (editMenu) {
60986               context.surface().call(editMenu);
60987           }
60988       }
60989
60990
60991       function toggleMenu() {
60992           // deprecation warning - Radial Menu to be removed in iD v3
60993           if (select('.edit-menu, .radial-menu').empty()) {
60994               positionMenu();
60995               showMenu();
60996           } else {
60997               closeMenu();
60998           }
60999       }
61000
61001
61002       mode.selectedIDs = function() {
61003           return selectedIDs;
61004       };
61005
61006
61007       mode.zoomToSelected = function() {
61008           var entity = singular();
61009           if (entity) {
61010               context.map().zoomToEase(entity);
61011           }
61012       };
61013
61014
61015       mode.reselect = function() {
61016           if (!checkSelectedIDs()) return;
61017
61018           var surfaceNode = context.surface().node();
61019           if (surfaceNode.focus) {   // FF doesn't support it
61020               surfaceNode.focus();
61021           }
61022
61023           positionMenu();
61024           if (!suppressMenu) {
61025               showMenu();
61026           }
61027       };
61028
61029
61030       mode.newFeature = function(_) {
61031           if (!arguments.length) return newFeature;
61032           newFeature = _;
61033           return mode;
61034       };
61035
61036
61037       mode.suppressMenu = function(_) {
61038           if (!arguments.length) return suppressMenu;
61039           suppressMenu = _;
61040           return mode;
61041       };
61042
61043
61044       mode.follow = function(_) {
61045           if (!arguments.length) return follow;
61046           follow = _;
61047           return mode;
61048       };
61049
61050
61051       mode.enter = function() {
61052           if (!checkSelectedIDs()) return;
61053
61054           context.features().forceVisible(selectedIDs);
61055
61056           var operations = without(values$1(Operations), operationDelete)
61057               .map(function(o) { return o(selectedIDs, context); })
61058               .filter(function(o) { return o.available(); });
61059
61060           // deprecation warning - Radial Menu to be removed in iD v3
61061           var isRadialMenu = context.storage('edit-menu-style') === 'radial';
61062           if (isRadialMenu) {
61063               operations = operations.slice(0,7);
61064               operations.unshift(operationDelete(selectedIDs, context));
61065           } else {
61066               operations.push(operationDelete(selectedIDs, context));
61067           }
61068
61069           operations.forEach(function(operation) {
61070               if (operation.behavior) {
61071                   behaviors.push(operation.behavior);
61072               }
61073           });
61074
61075           behaviors.forEach(context.install);
61076
61077           keybinding
61078               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
61079               .on(['[', 'pgup'], previousVertex)
61080               .on([']', 'pgdown'], nextVertex)
61081               .on(['{', uiCmd('⌘['), 'home'], firstVertex)
61082               .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
61083               .on(['\\', 'pause'], nextParent)
61084               .on('⎋', esc, true)
61085               .on('space', toggleMenu);
61086
61087           select(document)
61088               .call(keybinding);
61089
61090
61091           // deprecation warning - Radial Menu to be removed in iD v3
61092           editMenu = isRadialMenu
61093               ? uiRadialMenu(context, operations)
61094               : uiEditMenu(context, operations);
61095
61096           context.ui().sidebar
61097               .select(singular() ? singular().id : null, newFeature);
61098
61099           context.history()
61100               .on('undone.select', update)
61101               .on('redone.select', update);
61102
61103           context.map()
61104               .on('move.select', closeMenu)
61105               .on('drawn.select', selectElements);
61106
61107           context.surface()
61108               .on('dblclick.select', dblclick);
61109
61110
61111           selectElements();
61112
61113           if (selectedIDs.length > 1) {
61114               var entities = uiSelectionList(context, selectedIDs);
61115               context.ui().sidebar.show(entities);
61116           }
61117
61118           if (follow) {
61119               var extent = geoExtent();
61120               var graph = context.graph();
61121               selectedIDs.forEach(function(id) {
61122                   var entity = context.entity(id);
61123                   extent._extend(entity.extent(graph));
61124               });
61125
61126               var loc = extent.center();
61127               context.map().centerEase(loc);
61128           } else if (singular() && singular().type === 'way') {
61129               context.map().pan([0,0]);  // full redraw, to adjust z-sorting #2914
61130           }
61131
61132           timeout = window.setTimeout(function() {
61133               positionMenu();
61134               if (!suppressMenu) {
61135                   showMenu();
61136               }
61137           }, 270);  /* after any centerEase completes */
61138
61139
61140           function update() {
61141               closeMenu();
61142               checkSelectedIDs();
61143           }
61144
61145
61146           function dblclick() {
61147               var target = select(event.target);
61148
61149               var datum = target.datum();
61150               var entity = datum && datum.properties && datum.properties.entity;
61151               if (!entity) return;
61152
61153               if (entity instanceof osmWay && target.classed('target')) {
61154                   var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
61155                   var prev = entity.nodes[choice.index - 1];
61156                   var next = entity.nodes[choice.index];
61157
61158                   context.perform(
61159                       actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
61160                       t('operations.add.annotation.vertex')
61161                   );
61162
61163                   event.preventDefault();
61164                   event.stopPropagation();
61165
61166               } else if (entity.type === 'midpoint') {
61167                   context.perform(
61168                       actionAddMidpoint({loc: entity.loc, edge: entity.edge}, osmNode()),
61169                       t('operations.add.annotation.vertex'));
61170
61171                   event.preventDefault();
61172                   event.stopPropagation();
61173               }
61174           }
61175
61176
61177           function selectElements(drawn) {
61178               if (!checkSelectedIDs()) return;
61179
61180               var surface = context.surface();
61181               var entity = singular();
61182
61183               if (entity && context.geometry(entity.id) === 'relation') {
61184                   suppressMenu = true;
61185                   return;
61186               }
61187
61188               surface.selectAll('.related')
61189                   .classed('related', false);
61190
61191               singularParent();
61192               if (_relatedParent) {
61193                   surface.selectAll(utilEntitySelector([_relatedParent]))
61194                       .classed('related', true);
61195               }
61196
61197               var selection = context.surface()
61198                   .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
61199
61200               if (selection.empty()) {
61201                   // Return to browse mode if selected DOM elements have
61202                   // disappeared because the user moved them out of view..
61203                   var source = event && event.type === 'zoom' && event.sourceEvent;
61204                   if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
61205                       context.enter(modeBrowse(context));
61206                   }
61207               } else {
61208                   selection
61209                       .classed('selected', true);
61210               }
61211           }
61212
61213
61214           function esc() {
61215               if (select('.combobox').size()) return;
61216               context.enter(modeBrowse(context));
61217           }
61218
61219
61220           function firstVertex() {
61221               event.preventDefault();
61222               var entity = singular();
61223               var parent = singularParent();
61224               var way;
61225
61226               if (entity && entity.type === 'way') {
61227                   way = entity;
61228               } else if (parent) {
61229                   way = context.entity(parent);
61230               }
61231
61232               if (way) {
61233                   context.enter(
61234                       modeSelect(context, [way.first()]).follow(true)
61235                   );
61236               }
61237           }
61238
61239
61240           function lastVertex() {
61241               event.preventDefault();
61242               var entity = singular();
61243               var parent = singularParent();
61244               var way;
61245
61246               if (entity && entity.type === 'way') {
61247                   way = entity;
61248               } else if (parent) {
61249                   way = context.entity(parent);
61250               }
61251
61252               if (way) {
61253                   context.enter(
61254                       modeSelect(context, [way.last()]).follow(true)
61255                   );
61256               }
61257           }
61258
61259
61260           function previousVertex() {
61261               event.preventDefault();
61262               var parent = singularParent();
61263               if (!parent) return;
61264
61265               var way = context.entity(parent);
61266               var length = way.nodes.length;
61267               var curr = way.nodes.indexOf(selectedIDs[0]);
61268               var index = -1;
61269
61270               if (curr > 0) {
61271                   index = curr - 1;
61272               } else if (way.isClosed()) {
61273                   index = length - 2;
61274               }
61275
61276               if (index !== -1) {
61277                   context.enter(
61278                       modeSelect(context, [way.nodes[index]]).follow(true)
61279                   );
61280               }
61281           }
61282
61283
61284           function nextVertex() {
61285               event.preventDefault();
61286               var parent = singularParent();
61287               if (!parent) return;
61288
61289               var way = context.entity(parent);
61290               var length = way.nodes.length;
61291               var curr = way.nodes.indexOf(selectedIDs[0]);
61292               var index = -1;
61293
61294               if (curr < length - 1) {
61295                   index = curr + 1;
61296               } else if (way.isClosed()) {
61297                   index = 0;
61298               }
61299
61300               if (index !== -1) {
61301                   context.enter(
61302                       modeSelect(context, [way.nodes[index]]).follow(true)
61303                   );
61304               }
61305           }
61306
61307
61308           function nextParent() {
61309               event.preventDefault();
61310               var parents = uniq(commonParents());
61311               if (!parents || parents.length < 2) return;
61312
61313               var index = parents.indexOf(_relatedParent);
61314               if (index < 0 || index > parents.length - 2) {
61315                   _relatedParent = parents[0];
61316               } else {
61317                   _relatedParent = parents[index + 1];
61318               }
61319
61320               var surface = context.surface();
61321               surface.selectAll('.related')
61322                   .classed('related', false);
61323
61324               if (_relatedParent) {
61325                   surface.selectAll(utilEntitySelector([_relatedParent]))
61326                       .classed('related', true);
61327               }
61328           }
61329       };
61330
61331
61332       mode.exit = function() {
61333           if (timeout) window.clearTimeout(timeout);
61334
61335           behaviors.forEach(context.uninstall);
61336
61337           select(document)
61338               .call(keybinding.unbind);
61339
61340           closeMenu();
61341           editMenu = undefined;
61342
61343           context.history()
61344               .on('undone.select', null)
61345               .on('redone.select', null);
61346
61347           var surface = context.surface();
61348
61349           surface
61350               .on('dblclick.select', null);
61351
61352           surface
61353               .selectAll('.selected')
61354               .classed('selected', false);
61355
61356           surface
61357               .selectAll('.related')
61358               .classed('related', false);
61359
61360           context.map().on('drawn.select', null);
61361           context.ui().sidebar.hide();
61362           context.features().forceVisible([]);
61363       };
61364
61365
61366       return mode;
61367   }
61368
61369   function modeSelectData(context, selectedDatum) {
61370       var mode = {
61371           id: 'select-data',
61372           button: 'browse'
61373       };
61374
61375       var keybinding = utilKeybinding('select-data');
61376       var dataEditor = uiDataEditor(context);
61377
61378       var behaviors = [
61379           behaviorBreathe(context),
61380           behaviorHover(context),
61381           behaviorSelect(context),
61382           behaviorLasso(context),
61383           modeDragNode(context).behavior,
61384           modeDragNote(context).behavior
61385       ];
61386
61387
61388       // class the data as selected, or return to browse mode if the data is gone
61389       function selectData(drawn) {
61390           var selection = context.surface().selectAll('.layer-mapdata .data' + selectedDatum.__featurehash__);
61391
61392           if (selection.empty()) {
61393               // Return to browse mode if selected DOM elements have
61394               // disappeared because the user moved them out of view..
61395               var source = event && event.type === 'zoom' && event.sourceEvent;
61396               if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
61397                   context.enter(modeBrowse(context));
61398               }
61399           } else {
61400               selection.classed('selected', true);
61401           }
61402       }
61403
61404
61405       function esc() {
61406           if (select('.combobox').size()) return;
61407           context.enter(modeBrowse(context));
61408       }
61409
61410
61411       mode.zoomToSelected = function() {
61412           var extent = geoExtent(d3_geoBounds(selectedDatum));
61413           context.map().centerZoomEase(extent.center(), context.map().trimmedExtentZoom(extent));
61414       };
61415
61416
61417       mode.enter = function() {
61418           behaviors.forEach(context.install);
61419
61420           keybinding
61421               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
61422               .on('⎋', esc, true);
61423
61424           select(document)
61425               .call(keybinding);
61426
61427           selectData();
61428
61429           var sidebar = context.ui().sidebar;
61430           sidebar.show(dataEditor.datum(selectedDatum));
61431
61432           // expand the sidebar, avoid obscuring the data if needed
61433           var extent = geoExtent(d3_geoBounds(selectedDatum));
61434           sidebar.expand(sidebar.intersects(extent));
61435
61436           context.map()
61437               .on('drawn.select-data', selectData);
61438       };
61439
61440
61441       mode.exit = function() {
61442           behaviors.forEach(context.uninstall);
61443
61444           select(document)
61445               .call(keybinding.unbind);
61446
61447           context.surface()
61448               .selectAll('.layer-mapdata .selected')
61449               .classed('selected hover', false);
61450
61451           context.map()
61452               .on('drawn.select-data', null);
61453
61454           context.ui().sidebar
61455               .hide();
61456       };
61457
61458
61459       return mode;
61460   }
61461
61462   function modeSelectError(context, selectedErrorID, selectedErrorService) {
61463       var mode = {
61464           id: 'select-error',
61465           button: 'browse'
61466       };
61467
61468       var keybinding = utilKeybinding('select-error');
61469
61470       var errorService = services[selectedErrorService];
61471       var errorEditor;
61472       switch (selectedErrorService) {
61473           case 'improveOSM':
61474               errorEditor = uiImproveOsmEditor(context)
61475               .on('change', function() {
61476                   context.map().pan([0,0]);  // trigger a redraw
61477                   var error = checkSelectedID();
61478                   if (!error) return;
61479                   context.ui().sidebar
61480                       .show(errorEditor.error(error));
61481               });
61482               break;
61483           case 'keepRight':
61484               errorEditor = uiKeepRightEditor(context)
61485               .on('change', function() {
61486                   context.map().pan([0,0]);  // trigger a redraw
61487                   var error = checkSelectedID();
61488                   if (!error) return;
61489                   context.ui().sidebar
61490                       .show(errorEditor.error(error));
61491               });
61492               break;
61493       }
61494
61495
61496       var behaviors = [
61497           behaviorBreathe(context),
61498           behaviorHover(context),
61499           behaviorSelect(context),
61500           behaviorLasso(context),
61501           modeDragNode(context).behavior,
61502           modeDragNote(context).behavior
61503       ];
61504
61505
61506       function checkSelectedID() {
61507           if (!errorService) return;
61508           var error = errorService.getError(selectedErrorID);
61509           if (!error) {
61510               context.enter(modeBrowse(context));
61511           }
61512           return error;
61513       }
61514
61515
61516       mode.zoomToSelected = function() {
61517           if (!errorService) return;
61518           var error = errorService.getError(selectedErrorID);
61519           if (error) {
61520               context.map().centerZoomEase(error.loc, 20);
61521           }
61522       };
61523
61524
61525       mode.enter = function() {
61526           var error = checkSelectedID();
61527           if (!error) return;
61528
61529           behaviors.forEach(context.install);
61530           keybinding
61531               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
61532               .on('⎋', esc, true);
61533
61534           select(document)
61535               .call(keybinding);
61536
61537           selectError();
61538
61539           var sidebar = context.ui().sidebar;
61540           sidebar.show(errorEditor.error(error));
61541
61542           context.map()
61543               .on('drawn.select-error', selectError);
61544
61545
61546           // class the error as selected, or return to browse mode if the error is gone
61547           function selectError(drawn) {
61548               if (!checkSelectedID()) return;
61549
61550               var selection = context.surface()
61551                   .selectAll('.error_id-' + selectedErrorID + '.' + selectedErrorService);
61552
61553               if (selection.empty()) {
61554                   // Return to browse mode if selected DOM elements have
61555                   // disappeared because the user moved them out of view..
61556                   var source = event && event.type === 'zoom' && event.sourceEvent;
61557                   if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
61558                       context.enter(modeBrowse(context));
61559                   }
61560
61561               } else {
61562                   selection
61563                       .classed('selected', true);
61564
61565                   context.selectedErrorID(selectedErrorID);
61566               }
61567           }
61568
61569           function esc() {
61570               if (select('.combobox').size()) return;
61571               context.enter(modeBrowse(context));
61572           }
61573       };
61574
61575
61576       mode.exit = function() {
61577           behaviors.forEach(context.uninstall);
61578
61579           select(document)
61580               .call(keybinding.unbind);
61581
61582           context.surface()
61583               .selectAll('.qa_error.selected')
61584               .classed('selected hover', false);
61585
61586           context.map()
61587               .on('drawn.select-error', null);
61588
61589           context.ui().sidebar
61590               .hide();
61591
61592           context.selectedErrorID(null);
61593           context.features().forceVisible([]);
61594       };
61595
61596
61597       return mode;
61598   }
61599
61600   function modeSelectNote(context, selectedNoteID) {
61601       var mode = {
61602           id: 'select-note',
61603           button: 'browse'
61604       };
61605
61606       var osm = services.osm;
61607       var keybinding = utilKeybinding('select-note');
61608       var noteEditor = uiNoteEditor(context)
61609           .on('change', function() {
61610               context.map().pan([0,0]);  // trigger a redraw
61611               var note = checkSelectedID();
61612               if (!note) return;
61613               context.ui().sidebar
61614                   .show(noteEditor.note(note));
61615           });
61616
61617       var behaviors = [
61618           behaviorBreathe(context),
61619           behaviorHover(context),
61620           behaviorSelect(context),
61621           behaviorLasso(context),
61622           modeDragNode(context).behavior,
61623           modeDragNote(context).behavior
61624       ];
61625
61626       var newFeature = false;
61627
61628
61629       function checkSelectedID() {
61630           if (!osm) return;
61631           var note = osm.getNote(selectedNoteID);
61632           if (!note) {
61633               context.enter(modeBrowse(context));
61634           }
61635           return note;
61636       }
61637
61638
61639       // class the note as selected, or return to browse mode if the note is gone
61640       function selectNote(drawn) {
61641           if (!checkSelectedID()) return;
61642
61643           var selection = context.surface().selectAll('.layer-notes .note-' + selectedNoteID);
61644
61645           if (selection.empty()) {
61646               // Return to browse mode if selected DOM elements have
61647               // disappeared because the user moved them out of view..
61648               var source = event && event.type === 'zoom' && event.sourceEvent;
61649               if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
61650                   context.enter(modeBrowse(context));
61651               }
61652
61653           } else {
61654               selection
61655                   .classed('selected', true);
61656
61657               context.selectedNoteID(selectedNoteID);
61658           }
61659       }
61660
61661
61662       function esc() {
61663           if (select('.combobox').size()) return;
61664           context.enter(modeBrowse(context));
61665       }
61666
61667
61668       mode.zoomToSelected = function() {
61669           if (!osm) return;
61670           var note = osm.getNote(selectedNoteID);
61671           if (note) {
61672               context.map().centerZoomEase(note.loc, 20);
61673           }
61674       };
61675
61676
61677       mode.newFeature = function(val) {
61678           if (!arguments.length) return newFeature;
61679           newFeature = val;
61680           return mode;
61681       };
61682
61683
61684       mode.enter = function() {
61685           var note = checkSelectedID();
61686           if (!note) return;
61687
61688           behaviors.forEach(context.install);
61689
61690           keybinding
61691               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
61692               .on('⎋', esc, true);
61693
61694           select(document)
61695               .call(keybinding);
61696
61697           selectNote();
61698
61699           var sidebar = context.ui().sidebar;
61700           sidebar.show(noteEditor.note(note));
61701
61702           // expand the sidebar, avoid obscuring the note if needed
61703           sidebar.expand(sidebar.intersects(note.extent()));
61704
61705           context.map()
61706               .on('drawn.select', selectNote);
61707       };
61708
61709
61710       mode.exit = function() {
61711           behaviors.forEach(context.uninstall);
61712
61713           select(document)
61714               .call(keybinding.unbind);
61715
61716           context.surface()
61717               .selectAll('.layer-notes .selected')
61718               .classed('selected hover', false);
61719
61720           context.map()
61721               .on('drawn.select', null);
61722
61723           context.ui().sidebar
61724               .hide();
61725
61726           context.selectedNoteID(null);
61727       };
61728
61729
61730       return mode;
61731   }
61732
61733   function behaviorAddWay(context) {
61734       var dispatch$1 = dispatch('start', 'startFromWay', 'startFromNode');
61735       var draw = behaviorDraw(context);
61736
61737       function behavior(surface) {
61738           draw.on('click', function() { dispatch$1.apply('start', this, arguments); })
61739               .on('clickWay', function() { dispatch$1.apply('startFromWay', this, arguments); })
61740               .on('clickNode', function() { dispatch$1.apply('startFromNode', this, arguments); })
61741               .on('cancel', behavior.cancel)
61742               .on('finish', behavior.cancel);
61743
61744           context.map()
61745               .dblclickEnable(false);
61746
61747           surface.call(draw);
61748       }
61749
61750
61751       behavior.off = function(surface) {
61752           surface.call(draw.off);
61753       };
61754
61755
61756       behavior.cancel = function() {
61757           window.setTimeout(function() {
61758               context.map().dblclickEnable(true);
61759           }, 1000);
61760
61761           context.enter(modeBrowse(context));
61762       };
61763
61764
61765       behavior.tail = function(text) {
61766           draw.tail(text);
61767           return behavior;
61768       };
61769
61770
61771       return utilRebind(behavior, dispatch$1, 'on');
61772   }
61773
61774   function behaviorBreathe() {
61775       var duration = 800;
61776       var steps = 4;
61777       var selector = '.selected.shadow, .selected .shadow';
61778       var _selected = select(null);
61779       var _classed = '';
61780       var _params = {};
61781       var _done = false;
61782       var _timer;
61783
61784
61785       function ratchetyInterpolator(a, b, steps, units) {
61786           a = parseFloat(a);
61787           b = parseFloat(b);
61788           var sample = quantize()
61789               .domain([0, 1])
61790               .range(d3_quantize(interpolateNumber(a, b), steps));
61791
61792           return function(t) {
61793               return String(sample(t)) + (units || '');
61794           };
61795       }
61796
61797
61798       function reset(selection) {
61799           selection
61800               .style('stroke-opacity', null)
61801               .style('stroke-width', null)
61802               .style('fill-opacity', null)
61803               .style('r', null);
61804       }
61805
61806
61807       function setAnimationParams(transition, fromTo) {
61808           var toFrom = (fromTo === 'from' ? 'to' : 'from');
61809
61810           transition
61811               .styleTween('stroke-opacity', function(d) {
61812                   return ratchetyInterpolator(
61813                       _params[d.id][toFrom].opacity,
61814                       _params[d.id][fromTo].opacity,
61815                       steps
61816                   );
61817               })
61818               .styleTween('stroke-width', function(d) {
61819                   return ratchetyInterpolator(
61820                       _params[d.id][toFrom].width,
61821                       _params[d.id][fromTo].width,
61822                       steps,
61823                       'px'
61824                   );
61825               })
61826               .styleTween('fill-opacity', function(d) {
61827                   return ratchetyInterpolator(
61828                       _params[d.id][toFrom].opacity,
61829                       _params[d.id][fromTo].opacity,
61830                       steps
61831                   );
61832               })
61833               .styleTween('r', function(d) {
61834                   return ratchetyInterpolator(
61835                       _params[d.id][toFrom].width,
61836                       _params[d.id][fromTo].width,
61837                       steps,
61838                       'px'
61839                   );
61840               });
61841       }
61842
61843
61844       function calcAnimationParams(selection) {
61845           selection
61846               .call(reset)
61847               .each(function(d) {
61848                   var s = select(this);
61849                   var tag = s.node().tagName;
61850                   var p = {'from': {}, 'to': {}};
61851                   var opacity;
61852                   var width;
61853
61854                   // determine base opacity and width
61855                   if (tag === 'circle') {
61856                       opacity = parseFloat(s.style('fill-opacity') || 0.5);
61857                       width = parseFloat(s.style('r') || 15.5);
61858                   } else {
61859                       opacity = parseFloat(s.style('stroke-opacity') || 0.7);
61860                       width = parseFloat(s.style('stroke-width') || 10);
61861                   }
61862
61863                   // calculate from/to interpolation params..
61864                   p.tag = tag;
61865                   p.from.opacity = opacity * 0.6;
61866                   p.to.opacity = opacity * 1.25;
61867                   p.from.width = width * 0.7;
61868                   p.to.width = width * (tag === 'circle' ? 1.5 : 1);
61869                   _params[d.id] = p;
61870               });
61871       }
61872
61873
61874       function run(surface, fromTo) {
61875           var toFrom = (fromTo === 'from' ? 'to' : 'from');
61876           var currSelected = surface.selectAll(selector);
61877           var currClassed = surface.attr('class');
61878
61879           if (_done || currSelected.empty()) {
61880               _selected.call(reset);
61881               return;
61882           }
61883
61884           if (!isEqual(currSelected.data(), _selected.data()) || currClassed !== _classed) {
61885               _selected.call(reset);
61886               _classed = currClassed;
61887               _selected = currSelected.call(calcAnimationParams);
61888           }
61889
61890           _selected
61891               .transition()
61892               .duration(duration)
61893               .call(setAnimationParams, fromTo)
61894               .on('end', function() {
61895                   surface.call(run, toFrom);
61896               });
61897       }
61898
61899
61900       function behavior(surface) {
61901           _done = false;
61902           _timer = timer(function() {
61903               // wait for elements to actually become selected
61904               if (surface.selectAll(selector).empty()) {
61905                   return false;
61906               }
61907
61908               surface.call(run, 'from');
61909               _timer.stop();
61910               return true;
61911           }, 20);
61912       }
61913
61914
61915       behavior.off = function() {
61916           _done = true;
61917           if (_timer) {
61918               _timer.stop();
61919           }
61920           _selected
61921               .interrupt()
61922               .call(reset);
61923       };
61924
61925
61926       return behavior;
61927   }
61928
61929   function behaviorCopy(context) {
61930
61931       function groupEntities(ids, graph) {
61932           var entities = ids.map(function (id) { return graph.entity(id); });
61933           return assignIn({relation: [], way: [], node: []},
61934               groupBy(entities, function(entity) { return entity.type; }));
61935       }
61936
61937
61938       function getDescendants(id, graph, descendants) {
61939           var entity = graph.entity(id);
61940           var children;
61941
61942           descendants = descendants || {};
61943
61944           if (entity.type === 'relation') {
61945               children = map$3(entity.members, 'id');
61946           } else if (entity.type === 'way') {
61947               children = entity.nodes;
61948           } else {
61949               children = [];
61950           }
61951
61952           for (var i = 0; i < children.length; i++) {
61953               if (!descendants[children[i]]) {
61954                   descendants[children[i]] = true;
61955                   descendants = getDescendants(children[i], graph, descendants);
61956               }
61957           }
61958
61959           return descendants;
61960       }
61961
61962
61963       function getSelectionText() {
61964           return window.getSelection().toString();
61965       }
61966
61967
61968       function doCopy() {
61969           if (!getSelectionText()) {
61970               event.preventDefault();
61971           }
61972
61973           var graph = context.graph();
61974           var selected = groupEntities(context.selectedIDs(), graph);
61975           var canCopy = [];
61976           var skip = {};
61977           var entity;
61978           var i;
61979
61980           for (i = 0; i < selected.relation.length; i++) {
61981               entity = selected.relation[i];
61982               if (!skip[entity.id] && entity.isComplete(graph)) {
61983                   canCopy.push(entity.id);
61984                   skip = getDescendants(entity.id, graph, skip);
61985               }
61986           }
61987           for (i = 0; i < selected.way.length; i++) {
61988               entity = selected.way[i];
61989               if (!skip[entity.id]) {
61990                   canCopy.push(entity.id);
61991                   skip = getDescendants(entity.id, graph, skip);
61992               }
61993           }
61994           for (i = 0; i < selected.node.length; i++) {
61995               entity = selected.node[i];
61996               if (!skip[entity.id]) {
61997                   canCopy.push(entity.id);
61998               }
61999           }
62000
62001           context.copyIDs(canCopy);
62002       }
62003
62004
62005       function behavior() {
62006           context.keybinding().on(uiCmd('⌘C'), doCopy);
62007           return behavior;
62008       }
62009
62010       behavior.off = function() {
62011           context.keybinding().off(uiCmd('⌘C'));
62012       };
62013
62014
62015       return behavior;
62016   }
62017
62018   /*
62019       `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
62020
62021       * The `origin` function is expected to return an [x, y] tuple rather than an
62022         {x, y} object.
62023       * The events are `start`, `move`, and `end`.
62024         (https://github.com/mbostock/d3/issues/563)
62025       * The `start` event is not dispatched until the first cursor movement occurs.
62026         (https://github.com/mbostock/d3/pull/368)
62027       * The `move` event has a `point` and `delta` [x, y] tuple properties rather
62028         than `x`, `y`, `dx`, and `dy` properties.
62029       * The `end` event is not dispatched if no movement occurs.
62030       * An `off` function is available that unbinds the drag's internal event handlers.
62031    */
62032
62033   function behaviorDrag() {
62034       var dispatch$1 = dispatch('start', 'move', 'end');
62035       var _origin = null;
62036       var _selector = '';
62037       var _event;
62038       var _target;
62039       var _surface;
62040
62041
62042       var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
62043       var d3_event_userSelectSuppress = function() {
62044               var selection$1 = selection();
62045               var select = selection$1.style(d3_event_userSelectProperty);
62046               selection$1.style(d3_event_userSelectProperty, 'none');
62047               return function() {
62048                   selection$1.style(d3_event_userSelectProperty, select);
62049               };
62050           };
62051
62052
62053       function d3_eventCancel() {
62054           event.stopPropagation();
62055           event.preventDefault();
62056       }
62057
62058
62059       function eventOf(thiz, argumentz) {
62060           return function(e1) {
62061               e1.target = behavior;
62062               customEvent(e1, dispatch$1.apply, dispatch$1, [e1.type, thiz, argumentz]);
62063           };
62064       }
62065
62066
62067       function dragstart() {
62068           _target = this;
62069           _event = eventOf(_target, arguments);
62070
62071           var eventTarget = event.target;
62072           var touchId = event.touches ? event.changedTouches[0].identifier : null;
62073           var offset;
62074           var startOrigin = point();
62075           var started = false;
62076           var selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
62077
62078           select(window)
62079               .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
62080               .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
62081
62082           if (_origin) {
62083               offset = _origin.apply(_target, arguments);
62084               offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
62085           } else {
62086               offset = [0, 0];
62087           }
62088
62089           if (touchId === null) {
62090               event.stopPropagation();
62091           }
62092
62093
62094           function point() {
62095               var p = _surface || _target.parentNode;
62096               return touchId !== null ? d3_touches(p).filter(function(p) {
62097                   return p.identifier === touchId;
62098               })[0] : mouse(p);
62099           }
62100
62101
62102           function dragmove() {
62103               var p = point();
62104               var dx = p[0] - startOrigin[0];
62105               var dy = p[1] - startOrigin[1];
62106
62107               if (dx === 0 && dy === 0)
62108                   return;
62109
62110               startOrigin = p;
62111               d3_eventCancel();
62112
62113               if (!started) {
62114                   started = true;
62115                   _event({ type: 'start' });
62116               } else {
62117                   _event({
62118                       type: 'move',
62119                       point: [p[0] + offset[0],  p[1] + offset[1]],
62120                       delta: [dx, dy]
62121                   });
62122               }
62123           }
62124
62125
62126           function dragend() {
62127               if (started) {
62128                   _event({ type: 'end' });
62129
62130                   d3_eventCancel();
62131                   if (event.target === eventTarget) {
62132                       select(window)
62133                           .on('click.drag', click, true);
62134                   }
62135               }
62136
62137               select(window)
62138                   .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
62139                   .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
62140
62141               selectEnable();
62142           }
62143
62144
62145           function click() {
62146               d3_eventCancel();
62147               select(window)
62148                   .on('click.drag', null);
62149           }
62150       }
62151
62152
62153       function behavior(selection) {
62154           var matchesSelector = utilPrefixDOMProperty('matchesSelector');
62155           var delegate = dragstart;
62156
62157           if (_selector) {
62158               delegate = function() {
62159                   var root = this;
62160                   var target = event.target;
62161                   for (; target && target !== root; target = target.parentNode) {
62162                       var datum = target.__data__;
62163
62164                       var entity = datum instanceof osmNote ? datum
62165                           : datum && datum.properties && datum.properties.entity;
62166
62167                       if (entity && target[matchesSelector](_selector)) {
62168                           return dragstart.call(target, entity);
62169                       }
62170                   }
62171               };
62172           }
62173
62174           selection
62175               .on('mousedown.drag' + _selector, delegate)
62176               .on('touchstart.drag' + _selector, delegate);
62177       }
62178
62179
62180       behavior.off = function(selection) {
62181           selection
62182               .on('mousedown.drag' + _selector, null)
62183               .on('touchstart.drag' + _selector, null);
62184       };
62185
62186
62187       behavior.selector = function(_) {
62188           if (!arguments.length) return _selector;
62189           _selector = _;
62190           return behavior;
62191       };
62192
62193
62194       behavior.origin = function(_) {
62195           if (!arguments.length) return _origin;
62196           _origin = _;
62197           return behavior;
62198       };
62199
62200
62201       behavior.cancel = function() {
62202           select(window)
62203               .on('mousemove.drag', null)
62204               .on('mouseup.drag', null);
62205           return behavior;
62206       };
62207
62208
62209       behavior.target = function() {
62210           if (!arguments.length) return _target;
62211           _target = arguments[0];
62212           _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
62213           return behavior;
62214       };
62215
62216
62217       behavior.surface = function() {
62218           if (!arguments.length) return _surface;
62219           _surface = arguments[0];
62220           return behavior;
62221       };
62222
62223
62224       return utilRebind(behavior, dispatch$1, 'on');
62225   }
62226
62227   function behaviorDrawWay(context, wayID, index, mode, startGraph, baselineGraph) {
62228
62229       var origWay = context.entity(wayID);
62230
62231       var annotation = t((origWay.isDegenerate() ?
62232           'operations.start.annotation.' :
62233           'operations.continue.annotation.') + context.geometry(wayID)
62234       );
62235
62236       var behavior = behaviorDraw(context);
62237       behavior.hover().initialNodeId(index ? origWay.nodes[index] : origWay.nodes[origWay.nodes.length - 1]);
62238
62239       var _tempEdits = 0;
62240
62241       var end = osmNode({ loc: context.map().mouseCoordinates() });
62242
62243       // Push an annotated state for undo to return back to.
62244       // We must make sure to remove this edit later.
62245       context.perform(actionNoop(), annotation);
62246       _tempEdits++;
62247
62248       // Add the drawing node to the graph.
62249       // We must make sure to remove this edit later.
62250       context.perform(_actionAddDrawNode());
62251       _tempEdits++;
62252
62253
62254       function keydown() {
62255           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
62256               if (context.surface().classed('nope')) {
62257                   context.surface()
62258                       .classed('nope-suppressed', true);
62259               }
62260               context.surface()
62261                   .classed('nope', false)
62262                   .classed('nope-disabled', true);
62263           }
62264       }
62265
62266
62267       function keyup() {
62268           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
62269               if (context.surface().classed('nope-suppressed')) {
62270                   context.surface()
62271                       .classed('nope', true);
62272               }
62273               context.surface()
62274                   .classed('nope-suppressed', false)
62275                   .classed('nope-disabled', false);
62276           }
62277       }
62278
62279
62280       function allowsVertex(d) {
62281           return context.presets().allowsVertex(d, context.graph());
62282       }
62283
62284
62285       // related code
62286       // - `mode/drag_node.js`     `doMode()`
62287       // - `behavior/draw.js`      `click()`
62288       // - `behavior/draw_way.js`  `move()`
62289       function move(datum) {
62290           context.surface().classed('nope-disabled', event.altKey);
62291
62292           var targetLoc = datum && datum.properties && datum.properties.entity && allowsVertex(datum.properties.entity) && datum.properties.entity.loc;
62293           var targetNodes = datum && datum.properties && datum.properties.nodes;
62294           var loc = context.map().mouseCoordinates();
62295
62296           if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
62297               loc = targetLoc;
62298
62299           } else if (targetNodes) {   // snap to way - a line target with `.nodes`
62300               var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
62301               if (choice) {
62302                   loc = choice.loc;
62303               }
62304           }
62305
62306           context.replace(actionMoveNode(end.id, loc));
62307           end = context.entity(end.id);
62308           checkGeometry(false);
62309       }
62310
62311
62312       // Check whether this edit causes the geometry to break.
62313       // If so, class the surface with a nope cursor.
62314       // `finishDraw` - Only checks the relevant line segments if finishing drawing
62315       function checkGeometry(finishDraw) {
62316           var nopeDisabled = context.surface().classed('nope-disabled');
62317           var isInvalid = isInvalidGeometry(end, context.graph(), finishDraw);
62318
62319           if (nopeDisabled) {
62320               context.surface()
62321                   .classed('nope', false)
62322                   .classed('nope-suppressed', isInvalid);
62323           } else {
62324               context.surface()
62325                   .classed('nope', isInvalid)
62326                   .classed('nope-suppressed', false);
62327           }
62328       }
62329
62330
62331       function isInvalidGeometry(entity, graph, finishDraw) {
62332           var parents = graph.parentWays(entity);
62333
62334           for (var i = 0; i < parents.length; i++) {
62335               var parent = parents[i];
62336
62337               var nodes = graph.childNodes(parent);
62338
62339               if (origWay.isClosed()) { // Check if Area
62340                   if (finishDraw) {
62341                       nodes.splice(-2, 1);
62342                       entity = nodes[nodes.length-2];
62343                   } else {
62344                       nodes.pop();
62345                   }
62346               } else { // Line
62347                   if (finishDraw) {
62348                       nodes.pop();
62349                   }
62350               }
62351
62352               if (geoHasSelfIntersections(nodes, entity.id)) {
62353                   return true;
62354               }
62355           }
62356
62357           return false;
62358       }
62359
62360
62361       function undone() {
62362           // Undo popped the history back to the initial annotated no-op edit.
62363           _tempEdits = 0;     // We will deal with the temp edits here
62364           context.pop(1);     // Remove initial no-op edit
62365
62366           if (context.graph() === baselineGraph) {    // We've undone back to the beginning
62367               // baselineGraph may be behind startGraph if this way was added rather than continued
62368               resetContextGraphToStartGraph();
62369               context.enter(modeSelect(context, [wayID]));
62370           } else {
62371               // Remove whatever segment was drawn previously and continue drawing
62372               context.pop(1);
62373               context.enter(mode);
62374           }
62375       }
62376
62377
62378       function setActiveElements() {
62379           context.surface().selectAll('.' + end.id)
62380               .classed('active', true);
62381       }
62382
62383
62384       var drawWay = function(surface) {
62385           behavior
62386               .on('move', move)
62387               .on('click', drawWay.add)
62388               .on('clickWay', drawWay.addWay)
62389               .on('clickNode', drawWay.addNode)
62390               .on('undo', context.undo)
62391               .on('cancel', drawWay.cancel)
62392               .on('finish', drawWay.finish);
62393
62394           select(window)
62395               .on('keydown.drawWay', keydown)
62396               .on('keyup.drawWay', keyup);
62397
62398           context.map()
62399               .dblclickEnable(false)
62400               .on('drawn.draw', setActiveElements);
62401
62402           setActiveElements();
62403
62404           surface.call(behavior);
62405
62406           context.history()
62407               .on('undone.draw', undone);
62408       };
62409
62410       function resetContextGraphToStartGraph() {
62411           while (context.graph() !== startGraph) {
62412               context.pop();
62413           }
62414       }
62415
62416       drawWay.off = function(surface) {
62417           // Drawing was interrupted unexpectedly.
62418           // This can happen if the user changes modes,
62419           // clicks geolocate button, a hashchange event occurs, etc.
62420           if (_tempEdits) {
62421               context.pop(_tempEdits);
62422               resetContextGraphToStartGraph();
62423           }
62424
62425           context.map()
62426               .on('drawn.draw', null);
62427
62428           surface.call(behavior.off)
62429               .selectAll('.active')
62430               .classed('active', false);
62431
62432           surface
62433               .classed('nope', false)
62434               .classed('nope-suppressed', false)
62435               .classed('nope-disabled', false);
62436
62437           select(window)
62438               .on('keydown.hover', null)
62439               .on('keyup.hover', null);
62440
62441           context.history()
62442               .on('undone.draw', null);
62443       };
62444
62445
62446       function _actionAddDrawNode() {
62447           return function(graph) {
62448               return graph
62449                   .replace(end)
62450                   .replace(origWay.addNode(end.id, index));
62451           };
62452       }
62453
62454
62455       function _actionReplaceDrawNode(newNode) {
62456           return function(graph) {
62457               return graph
62458                   .replace(origWay.addNode(newNode.id, index))
62459                   .remove(end);
62460           };
62461       }
62462
62463
62464       // Accept the current position of the drawing node and continue drawing.
62465       drawWay.add = function(loc, d) {
62466           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
62467               return;   // can't click here
62468           }
62469
62470           context.pop(_tempEdits);
62471           _tempEdits = 0;
62472
62473           context.perform(
62474               _actionAddDrawNode(),
62475               annotation
62476           );
62477
62478           checkGeometry(false);   // finishDraw = false
62479           context.enter(mode);
62480       };
62481
62482
62483       // Connect the way to an existing way.
62484       drawWay.addWay = function(loc, edge, d) {
62485           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
62486               return;   // can't click here
62487           }
62488
62489           context.pop(_tempEdits);
62490           _tempEdits = 0;
62491
62492           context.perform(
62493               _actionAddDrawNode(),
62494               actionAddMidpoint({ loc: loc, edge: edge }, end),
62495               annotation
62496           );
62497
62498           checkGeometry(false);   // finishDraw = false
62499           context.enter(mode);
62500       };
62501
62502
62503       // Connect the way to an existing node and continue drawing.
62504       drawWay.addNode = function(node, d) {
62505           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
62506               return;   // can't click here
62507           }
62508
62509           context.pop(_tempEdits);
62510           _tempEdits = 0;
62511
62512           context.perform(
62513               _actionReplaceDrawNode(node),
62514               annotation
62515           );
62516
62517           checkGeometry(false);   // finishDraw = false
62518           context.enter(mode);
62519       };
62520
62521
62522       // Finish the draw operation, removing the temporary edits.
62523       // If the way has enough nodes to be valid, it's selected.
62524       // Otherwise, delete everything and return to browse mode.
62525       drawWay.finish = function() {
62526           checkGeometry(true);   // finishDraw = true
62527           if (context.surface().classed('nope')) {
62528               return;   // can't click here
62529           }
62530
62531           context.pop(_tempEdits);
62532           _tempEdits = 0;
62533
62534           var way = context.hasEntity(wayID);
62535           if (!way || way.isDegenerate()) {
62536               drawWay.cancel();
62537               return;
62538           }
62539
62540           window.setTimeout(function() {
62541               context.map().dblclickEnable(true);
62542           }, 1000);
62543           var isNewFeature = !mode.isContinuing;
62544           context.enter(modeSelect(context, [wayID]).newFeature(isNewFeature));
62545           if (isNewFeature) {
62546               context.validator().validate();
62547           }
62548       };
62549
62550
62551       // Cancel the draw operation, delete everything, and return to browse mode.
62552       drawWay.cancel = function() {
62553           context.pop(_tempEdits);
62554           _tempEdits = 0;
62555
62556           resetContextGraphToStartGraph();
62557
62558           window.setTimeout(function() {
62559               context.map().dblclickEnable(true);
62560           }, 1000);
62561
62562           context.surface()
62563               .classed('nope', false)
62564               .classed('nope-disabled', false)
62565               .classed('nope-suppressed', false);
62566
62567           context.enter(modeBrowse(context));
62568       };
62569
62570
62571       drawWay.activeID = function() {
62572           if (!arguments.length) return end.id;
62573           // no assign
62574           return drawWay;
62575       };
62576
62577
62578       drawWay.tail = function(text) {
62579           behavior.tail(text);
62580           return drawWay;
62581       };
62582
62583
62584       return drawWay;
62585   }
62586
62587   function behaviorHash(context) {
62588       var s0 = null; // cached window.location.hash
62589       var lat = 90 - 1e-8; // allowable latitude range
62590
62591
62592       var parser = function(map, s) {
62593           var q = utilStringQs(s);
62594           var args = (q.map || '').split('/').map(Number);
62595
62596           if (args.length < 3 || args.some(isNaN)) {
62597               return true; // replace bogus hash
62598
62599           } else if (s !== formatter(map).slice(1)) {   // hash has changed
62600               var mode = context.mode(),
62601                   dist = geoSphericalDistance(map.center(), [args[2], args[1]]),
62602                   maxdist = 500;
62603
62604               // Don't allow the hash location to change too much while drawing
62605               // This can happen if the user accidently hit the back button.  #3996
62606               if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
62607                   context.enter(modeBrowse(context));
62608               }
62609
62610               map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
62611           }
62612       };
62613
62614
62615       var formatter = function(map) {
62616           var center = map.center();
62617           var zoom = map.zoom();
62618           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
62619           var q = omit(utilStringQs(window.location.hash.substring(1)),
62620               ['comment', 'source', 'hashtags', 'walkthrough']
62621           );
62622           var newParams = {};
62623
62624           delete q.id;
62625           var selected = context.selectedIDs().filter(function(id) {
62626               return !context.entity(id).isNew();
62627           });
62628           if (selected.length) {
62629               newParams.id = selected.join(',');
62630           }
62631
62632           newParams.map = zoom.toFixed(2) +
62633               '/' + center[1].toFixed(precision) +
62634               '/' + center[0].toFixed(precision);
62635
62636           return '#' + utilQsString(assign(q, newParams), true);
62637       };
62638
62639
62640       function update() {
62641           if (context.inIntro()) return;
62642           var s1 = formatter(context.map());
62643           if (s0 !== s1) {
62644               window.location.replace(s0 = s1);  // don't recenter the map!
62645           }
62646       }
62647
62648
62649       var throttledUpdate = throttle(update, 500);
62650
62651
62652       function hashchange() {
62653           if (window.location.hash === s0) return;  // ignore spurious hashchange events
62654           if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
62655               update(); // replace bogus hash
62656           }
62657       }
62658
62659
62660       function behavior() {
62661           context.map()
62662               .on('move.hash', throttledUpdate);
62663
62664           context
62665               .on('enter.hash', throttledUpdate);
62666
62667           select(window)
62668               .on('hashchange.hash', hashchange);
62669
62670           if (window.location.hash) {
62671               var q = utilStringQs(window.location.hash.substring(1));
62672
62673               if (q.id) {
62674                   context.zoomToEntity(q.id.split(',')[0], !q.map);
62675               }
62676
62677               if (q.comment) {
62678                   context.storage('comment', q.comment);
62679                   context.storage('commentDate', Date.now());
62680               }
62681
62682               if (q.source) {
62683                   context.storage('source', q.source);
62684                   context.storage('commentDate', Date.now());
62685               }
62686
62687               if (q.hashtags) {
62688                   context.storage('hashtags', q.hashtags);
62689               }
62690
62691               if (q.walkthrough === 'true') {
62692                   behavior.startWalkthrough = true;
62693               }
62694
62695               hashchange();
62696
62697               if (q.map) {
62698                   behavior.hadHash = true;
62699               }
62700           }
62701       }
62702
62703
62704       behavior.off = function() {
62705           throttledUpdate.cancel();
62706
62707           context.map()
62708               .on('move.hash', null);
62709
62710           context
62711               .on('enter.hash', null);
62712
62713           select(window)
62714               .on('hashchange.hash', null);
62715
62716           window.location.hash = '';
62717       };
62718
62719
62720       return behavior;
62721   }
62722
62723   function behaviorLasso(context) {
62724
62725       var behavior = function(selection) {
62726           var lasso;
62727
62728
62729           function mousedown() {
62730               var button = 0;  // left
62731               if (event.button === button && event.shiftKey === true) {
62732                   lasso = null;
62733
62734                   select(window)
62735                       .on('mousemove.lasso', mousemove)
62736                       .on('mouseup.lasso', mouseup);
62737
62738                   event.stopPropagation();
62739               }
62740           }
62741
62742
62743           function mousemove() {
62744               if (!lasso) {
62745                   lasso = uiLasso(context);
62746                   context.surface().call(lasso);
62747               }
62748
62749               lasso.p(context.mouse());
62750           }
62751
62752
62753           function normalize(a, b) {
62754               return [
62755                   [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
62756                   [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
62757           }
62758
62759
62760           function lassoed() {
62761               if (!lasso) return [];
62762
62763               var graph = context.graph();
62764               var bounds = lasso.extent().map(context.projection.invert);
62765               var extent = geoExtent(normalize(bounds[0], bounds[1]));
62766
62767               return map$3(context.intersects(extent).filter(function(entity) {
62768                   return entity.type === 'node' &&
62769                       geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
62770                       !context.features().isHidden(entity, graph, entity.geometry(graph));
62771               }), 'id');
62772           }
62773
62774
62775           function mouseup() {
62776               select(window)
62777                   .on('mousemove.lasso', null)
62778                   .on('mouseup.lasso', null);
62779
62780               if (!lasso) return;
62781
62782               var ids = lassoed();
62783               lasso.close();
62784
62785               if (ids.length) {
62786                   context.enter(modeSelect(context, ids));
62787               }
62788           }
62789
62790           selection
62791               .on('mousedown.lasso', mousedown);
62792       };
62793
62794
62795       behavior.off = function(selection) {
62796           selection.on('mousedown.lasso', null);
62797       };
62798
62799
62800       return behavior;
62801   }
62802
62803   /* Creates a keybinding behavior for an operation */
62804   function behaviorOperation(context) {
62805       var _operation;
62806
62807       function keypress() {
62808           event.preventDefault();
62809           var disabled = _operation.disabled();
62810           var flash;
62811
62812           if (disabled) {
62813               flash = uiFlash()
62814                   .duration(4000)
62815                   .iconName('#iD-operation-' + _operation.id)
62816                   .iconClass('operation disabled')
62817                   .text(_operation.tooltip);
62818
62819               flash();
62820
62821           } else {
62822               flash = uiFlash()
62823                   .duration(2000)
62824                   .iconName('#iD-operation-' + _operation.id)
62825                   .iconClass('operation')
62826                   .text(_operation.annotation() || _operation.title);
62827
62828               flash();
62829               _operation();
62830           }
62831       }
62832
62833
62834       function behavior() {
62835           if (_operation && _operation.available()) {
62836               context.keybinding()
62837                   .on(_operation.keys, keypress);
62838           }
62839
62840           return behavior;
62841       }
62842
62843
62844       behavior.off = function() {
62845           context.keybinding()
62846               .off(_operation.keys);
62847       };
62848
62849
62850       behavior.which = function (_) {
62851           if (!arguments.length) return _operation;
62852           _operation = _;
62853           return behavior;
62854       };
62855
62856
62857       return behavior;
62858   }
62859
62860   /**
62861    * The base implementation of `_.invert` and `_.invertBy` which inverts
62862    * `object` with values transformed by `iteratee` and set by `setter`.
62863    *
62864    * @private
62865    * @param {Object} object The object to iterate over.
62866    * @param {Function} setter The function to set `accumulator` values.
62867    * @param {Function} iteratee The iteratee to transform values.
62868    * @param {Object} accumulator The initial inverted object.
62869    * @returns {Function} Returns `accumulator`.
62870    */
62871   function baseInverter(object, setter, iteratee, accumulator) {
62872     baseForOwn(object, function(value, key, object) {
62873       setter(accumulator, iteratee(value), key, object);
62874     });
62875     return accumulator;
62876   }
62877
62878   /**
62879    * Creates a function like `_.invertBy`.
62880    *
62881    * @private
62882    * @param {Function} setter The function to set accumulator values.
62883    * @param {Function} toIteratee The function to resolve iteratees.
62884    * @returns {Function} Returns the new inverter function.
62885    */
62886   function createInverter(setter, toIteratee) {
62887     return function(object, iteratee) {
62888       return baseInverter(object, setter, toIteratee(iteratee), {});
62889     };
62890   }
62891
62892   /** Used for built-in method references. */
62893   var objectProto$j = Object.prototype;
62894
62895   /**
62896    * Used to resolve the
62897    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
62898    * of values.
62899    */
62900   var nativeObjectToString$2 = objectProto$j.toString;
62901
62902   /**
62903    * Creates an object composed of the inverted keys and values of `object`.
62904    * If `object` contains duplicate values, subsequent values overwrite
62905    * property assignments of previous values.
62906    *
62907    * @static
62908    * @memberOf _
62909    * @since 0.7.0
62910    * @category Object
62911    * @param {Object} object The object to invert.
62912    * @returns {Object} Returns the new inverted object.
62913    * @example
62914    *
62915    * var object = { 'a': 1, 'b': 2, 'c': 1 };
62916    *
62917    * _.invert(object);
62918    * // => { '1': 'c', '2': 'b' }
62919    */
62920   var invert = createInverter(function(result, value, key) {
62921     if (value != null &&
62922         typeof value.toString != 'function') {
62923       value = nativeObjectToString$2.call(value);
62924     }
62925
62926     result[value] = key;
62927   }, constant$d(identity$8));
62928
62929   /**
62930    * Creates an object with the same keys as `object` and values generated
62931    * by running each own enumerable string keyed property of `object` thru
62932    * `iteratee`. The iteratee is invoked with three arguments:
62933    * (value, key, object).
62934    *
62935    * @static
62936    * @memberOf _
62937    * @since 2.4.0
62938    * @category Object
62939    * @param {Object} object The object to iterate over.
62940    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
62941    * @returns {Object} Returns the new mapped object.
62942    * @see _.mapKeys
62943    * @example
62944    *
62945    * var users = {
62946    *   'fred':    { 'user': 'fred',    'age': 40 },
62947    *   'pebbles': { 'user': 'pebbles', 'age': 1 }
62948    * };
62949    *
62950    * _.mapValues(users, function(o) { return o.age; });
62951    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
62952    *
62953    * // The `_.property` iteratee shorthand.
62954    * _.mapValues(users, 'age');
62955    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
62956    */
62957   function mapValues(object, iteratee) {
62958     var result = {};
62959     iteratee = baseIteratee(iteratee, 3);
62960
62961     baseForOwn(object, function(value, key, object) {
62962       baseAssignValue(result, key, iteratee(value, key, object));
62963     });
62964     return result;
62965   }
62966
62967   function behaviorPaste(context) {
62968
62969       function doPaste() {
62970           event.preventDefault();
62971
62972           var baseGraph = context.graph();
62973           var mouse = context.mouse();
62974           var projection = context.projection;
62975           var viewport = geoExtent(projection.clipExtent()).polygon();
62976
62977           if (!geoPointInPolygon(mouse, viewport)) return;
62978
62979           var extent = geoExtent();
62980           var oldIDs = context.copyIDs();
62981           var oldGraph = context.copyGraph();
62982           var newIDs = [];
62983
62984           if (!oldIDs.length) return;
62985
62986           var action = actionCopyEntities(oldIDs, oldGraph);
62987           context.perform(action);
62988
62989           var copies = action.copies();
62990           var originals = invert(mapValues(copies, 'id'));
62991           for (var id in copies) {
62992               var oldEntity = oldGraph.entity(id);
62993               var newEntity = copies[id];
62994
62995               extent._extend(oldEntity.extent(oldGraph));
62996
62997               // Exclude child nodes from newIDs if their parent way was also copied.
62998               var parents = context.graph().parentWays(newEntity);
62999               var parentCopied = false;
63000               for (var i = 0; i < parents.length; i++) {
63001                   if (originals[parents[i].id]) {
63002                       parentCopied = true;
63003                       break;
63004                   }
63005               }
63006
63007               if (!parentCopied) {
63008                   newIDs.push(newEntity.id);
63009               }
63010           }
63011
63012           // Put pasted objects where mouse pointer is..
63013           var center = projection(extent.center());
63014           var delta = geoVecSubtract(mouse, center);
63015
63016           context.perform(actionMove(newIDs, delta, projection));
63017           context.enter(modeMove(context, newIDs, baseGraph));
63018       }
63019
63020
63021       function behavior() {
63022           context.keybinding().on(uiCmd('⌘V'), doPaste);
63023           return behavior;
63024       }
63025
63026
63027       behavior.off = function() {
63028           context.keybinding().off(uiCmd('⌘V'));
63029       };
63030
63031
63032       return behavior;
63033   }
63034
63035   function behaviorSelect(context) {
63036       var lastMouse = null;
63037       var suppressMenu = true;
63038       var tolerance = 4;
63039       var p1 = null;
63040
63041
63042       function point() {
63043           return mouse(context.container().node());
63044       }
63045
63046
63047       function keydown() {
63048           var e = event;
63049           if (e && e.shiftKey) {
63050               context.surface()
63051                   .classed('behavior-multiselect', true);
63052           }
63053
63054           if (e && e.keyCode === 93) {  // context menu
63055               e.preventDefault();
63056               e.stopPropagation();
63057           }
63058       }
63059
63060
63061       function keyup() {
63062           var e = event;
63063           if (!e || !e.shiftKey) {
63064               context.surface()
63065                   .classed('behavior-multiselect', false);
63066           }
63067
63068
63069           if (e && e.keyCode === 93) {  // context menu
63070               e.preventDefault();
63071               e.stopPropagation();
63072               contextmenu();
63073           }
63074       }
63075
63076
63077       function mousedown() {
63078           if (!p1) p1 = point();
63079           select(window)
63080               .on('mouseup.select', mouseup, true);
63081
63082           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
63083           suppressMenu = !isShowAlways;
63084       }
63085
63086
63087       function mousemove() {
63088           if (event) lastMouse = event;
63089       }
63090
63091
63092       function mouseup() {
63093           click();
63094       }
63095
63096
63097       function contextmenu() {
63098           var e = event;
63099           e.preventDefault();
63100           e.stopPropagation();
63101
63102           if (!+e.clientX && !+e.clientY) {
63103               if (lastMouse) {
63104                   e.sourceEvent = lastMouse;
63105               } else {
63106                   return;
63107               }
63108           }
63109
63110           if (!p1) p1 = point();
63111           suppressMenu = false;
63112           click();
63113       }
63114
63115
63116       function click() {
63117           select(window)
63118               .on('mouseup.select', null, true);
63119
63120           if (!p1) return;
63121           var p2 = point();
63122           var dist = geoVecLength(p1, p2);
63123
63124           p1 = null;
63125           if (dist > tolerance) {
63126               return;
63127           }
63128
63129           var isMultiselect = event.shiftKey || select('#surface .lasso').node();
63130           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
63131           var datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__);
63132           var mode = context.mode();
63133
63134           var entity = datum && datum.properties && datum.properties.entity;
63135           if (entity) datum = entity;
63136
63137           if (datum && datum.type === 'midpoint') {
63138               datum = datum.parents[0];
63139           }
63140
63141           if (datum instanceof osmEntity) {    // clicked an entity..
63142               var selectedIDs = context.selectedIDs();
63143               context.selectedNoteID(null);
63144               context.selectedErrorID(null);
63145
63146               if (!isMultiselect) {
63147                   if (selectedIDs.length > 1 && (!suppressMenu && !isShowAlways)) {
63148                       // multiple things already selected, just show the menu...
63149                       mode.suppressMenu(false).reselect();
63150                   } else {
63151                       // select a single thing..
63152                       context.enter(modeSelect(context, [datum.id]).suppressMenu(suppressMenu));
63153                   }
63154
63155               } else {
63156                   if (selectedIDs.indexOf(datum.id) !== -1) {
63157                       // clicked entity is already in the selectedIDs list..
63158                       if (!suppressMenu && !isShowAlways) {
63159                           // don't deselect clicked entity, just show the menu.
63160                           mode.suppressMenu(false).reselect();
63161                       } else {
63162                           // deselect clicked entity, then reenter select mode or return to browse mode..
63163                           selectedIDs = without(selectedIDs, datum.id);
63164                           context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
63165                       }
63166                   } else {
63167                       // clicked entity is not in the selected list, add it..
63168                       selectedIDs = selectedIDs.concat([datum.id]);
63169                       context.enter(modeSelect(context, selectedIDs).suppressMenu(suppressMenu));
63170                   }
63171               }
63172
63173           } else if (datum && datum.__featurehash__ && !isMultiselect) {    // clicked Data..
63174               context
63175                   .selectedNoteID(null)
63176                   .enter(modeSelectData(context, datum));
63177
63178           } else if (datum instanceof osmNote && !isMultiselect) {    // clicked a Note..
63179               context
63180                   .selectedNoteID(datum.id)
63181                   .enter(modeSelectNote(context, datum.id));
63182           } else if (datum instanceof qaError & !isMultiselect) {  // clicked an external QA error
63183               context
63184                   .selectedErrorID(datum.id)
63185                   .enter(modeSelectError(context, datum.id, datum.service));
63186           } else {    // clicked nothing..
63187               context.selectedNoteID(null);
63188               context.selectedErrorID(null);
63189               if (!isMultiselect && mode.id !== 'browse') {
63190                   context.enter(modeBrowse(context));
63191               }
63192           }
63193
63194           // reset for next time..
63195           suppressMenu = true;
63196       }
63197
63198
63199       function behavior(selection) {
63200           lastMouse = null;
63201           suppressMenu = true;
63202           p1 = null;
63203
63204           select(window)
63205               .on('keydown.select', keydown)
63206               .on('keyup.select', keyup)
63207               .on('contextmenu.select-window', function() {
63208                   // Edge and IE really like to show the contextmenu on the
63209                   // menubar when user presses a keyboard menu button
63210                   // even after we've already preventdefaulted the key event.
63211                   var e = event;
63212                   if (+e.clientX === 0 && +e.clientY === 0) {
63213                       event.preventDefault();
63214                       event.stopPropagation();
63215                   }
63216               });
63217
63218           selection
63219               .on('mousedown.select', mousedown)
63220               .on('mousemove.select', mousemove)
63221               .on('contextmenu.select', contextmenu);
63222
63223           if (event && event.shiftKey) {
63224               context.surface()
63225                   .classed('behavior-multiselect', true);
63226           }
63227       }
63228
63229
63230       behavior.off = function(selection) {
63231           select(window)
63232               .on('keydown.select', null)
63233               .on('keyup.select', null)
63234               .on('contextmenu.select-window', null)
63235               .on('mouseup.select', null, true);
63236
63237           selection
63238               .on('mousedown.select', null)
63239               .on('mousemove.select', null)
63240               .on('contextmenu.select', null);
63241
63242           context.surface()
63243               .classed('behavior-multiselect', false);
63244       };
63245
63246
63247       return behavior;
63248   }
63249
63250   function uiAccount(context) {
63251       var osm = context.connection();
63252
63253
63254       function update(selection) {
63255           if (!osm) return;
63256
63257           if (!osm.authenticated()) {
63258               selection.selectAll('#userLink, #logoutLink')
63259                   .classed('hide', true);
63260               return;
63261           }
63262
63263           osm.userDetails(function(err, details) {
63264               var userLink = selection.select('#userLink'),
63265                   logoutLink = selection.select('#logoutLink');
63266
63267               userLink.html('');
63268               logoutLink.html('');
63269
63270               if (err) return;
63271
63272               selection.selectAll('#userLink, #logoutLink')
63273                   .classed('hide', false);
63274
63275               // Link
63276               userLink.append('a')
63277                   .attr('href', osm.userURL(details.display_name))
63278                   .attr('target', '_blank');
63279
63280               // Add thumbnail or dont
63281               if (details.image_url) {
63282                   userLink.append('img')
63283                       .attr('class', 'icon pre-text user-icon')
63284                       .attr('src', details.image_url);
63285               } else {
63286                   userLink
63287                       .call(svgIcon('#iD-icon-avatar', 'pre-text light'));
63288               }
63289
63290               // Add user name
63291               userLink.append('span')
63292                   .attr('class', 'label')
63293                   .text(details.display_name);
63294
63295               logoutLink.append('a')
63296                   .attr('class', 'logout')
63297                   .attr('href', '#')
63298                   .text(t('logout'))
63299                   .on('click.logout', function() {
63300                       event.preventDefault();
63301                       osm.logout();
63302                   });
63303           });
63304       }
63305
63306
63307       return function(selection) {
63308           selection.append('li')
63309               .attr('id', 'logoutLink')
63310               .classed('hide', true);
63311
63312           selection.append('li')
63313               .attr('id', 'userLink')
63314               .classed('hide', true);
63315
63316           if (osm) {
63317               osm.on('change.account', function() { update(selection); });
63318               update(selection);
63319           }
63320       };
63321   }
63322
63323   function uiAttribution(context) {
63324       var selection;
63325
63326
63327       function attribution(data, klass) {
63328           var div = selection.selectAll('.' + klass)
63329               .data([0]);
63330
63331           div = div.enter()
63332               .append('div')
63333               .attr('class', klass)
63334               .merge(div);
63335
63336
63337           var background = div.selectAll('.attribution')
63338               .data(data, function(d) { return d.name(); });
63339
63340           background.exit()
63341               .remove();
63342
63343           background = background.enter()
63344               .append('span')
63345               .attr('class', 'attribution')
63346               .each(function(d) {
63347                   if (d.terms_html) {
63348                       select(this)
63349                           .html(d.terms_html);
63350                       return;
63351                   }
63352
63353                   var selection;
63354                   if (d.terms_url) {
63355                       selection = select(this)
63356                           .append('a')
63357                           .attr('href', d.terms_url)
63358                           .attr('target', '_blank');
63359                   } else {
63360                       selection = select(this);
63361                   }
63362
63363
63364                   var id_safe = d.id.replace(/\./g, '<TX_DOT>');
63365                   var terms_text = t('imagery.' + id_safe + '.attribution.text',
63366                       { default: d.terms_text || d.id || d.name() }
63367                   );
63368
63369                   if (d.icon && !d.overlay) {
63370                       selection
63371                           .append('img')
63372                           .attr('class', 'source-image')
63373                           .attr('src', d.icon);
63374                   }
63375
63376                   selection
63377                       .append('span')
63378                       .attr('class', 'attribution-text')
63379                       .text(terms_text);
63380               })
63381               .merge(background);
63382
63383
63384           var copyright = background.selectAll('.copyright-notice')
63385               .data(function(d) {
63386                   var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
63387                   return notice ? [notice] : [];
63388               });
63389
63390           copyright.exit()
63391               .remove();
63392
63393           copyright = copyright.enter()
63394               .append('span')
63395               .attr('class', 'copyright-notice')
63396               .merge(copyright);
63397
63398           copyright
63399               .text(String);
63400       }
63401
63402
63403       function update() {
63404           attribution([context.background().baseLayerSource()], 'base-layer-attribution');
63405           attribution(context.background().overlayLayerSources().filter(function (s) {
63406               return s.validZoom(context.map().zoom());
63407           }), 'overlay-layer-attribution');
63408       }
63409
63410
63411       return function(select) {
63412           selection = select;
63413
63414           context.background()
63415               .on('change.attribution', update);
63416
63417           context.map()
63418               .on('move.attribution', throttle(update, 400, {leading: false}));
63419
63420           update();
63421       };
63422   }
63423
63424   // toggles the visibility of ui elements, using a combination of the
63425   // hide class, which sets display=none, and a d3 transition for opacity.
63426   // this will cause blinking when called repeatedly, so check that the
63427   // value actually changes between calls.
63428   function uiToggle(show, callback) {
63429       return function(selection) {
63430           selection
63431               .style('opacity', show ? 0 : 1)
63432               .classed('hide', false)
63433               .transition()
63434               .style('opacity', show ? 1 : 0)
63435               .on('end', function() {
63436                   select(this)
63437                       .classed('hide', !show)
63438                       .style('opacity', null);
63439                   if (callback) callback.apply(this);
63440               });
63441       };
63442   }
63443
63444   function uiDisclosure(context, key, expandedDefault) {
63445       var dispatch$1 = dispatch('toggled');
63446       var _preference = (context.storage('disclosure.' + key + '.expanded'));
63447       var _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true'));
63448       var _title;
63449       var _updatePreference = true;
63450       var _content = function () {};
63451
63452
63453       var disclosure = function(selection) {
63454           var hideToggle = selection.selectAll('.hide-toggle-' + key)
63455               .data([0]);
63456
63457           // enter
63458           var hideToggleEnter = hideToggle.enter()
63459               .append('a')
63460               .attr('href', '#')
63461               .attr('class', 'hide-toggle hide-toggle-' + key)
63462               .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
63463
63464           hideToggleEnter
63465               .append('span')
63466               .attr('class', 'hide-toggle-text');
63467
63468           // update
63469           hideToggle = hideToggleEnter
63470               .merge(hideToggle);
63471
63472           hideToggle
63473               .on('click', toggle)
63474               .classed('expanded', _expanded);
63475
63476           hideToggle.selectAll('.hide-toggle-text')
63477               .text(_title);
63478
63479           hideToggle.selectAll('.hide-toggle-icon')
63480               .attr('xlink:href', _expanded ? '#iD-icon-down'
63481                   : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
63482               );
63483
63484
63485           var wrap = selection.selectAll('.disclosure-wrap')
63486               .data([0]);
63487
63488           // enter/update
63489           wrap = wrap.enter()
63490               .append('div')
63491               .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
63492               .merge(wrap)
63493               .classed('hide', !_expanded);
63494
63495           if (_expanded) {
63496               wrap
63497                   .call(_content);
63498           }
63499
63500
63501           function toggle() {
63502               event.preventDefault();
63503
63504               _expanded = !_expanded;
63505
63506               if (_updatePreference) {
63507                   context.storage('disclosure.' + key + '.expanded', _expanded);
63508               }
63509
63510               hideToggle
63511                   .classed('expanded', _expanded);
63512
63513               hideToggle.selectAll('.hide-toggle-icon')
63514                   .attr('xlink:href', _expanded ? '#iD-icon-down'
63515                       : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
63516                   );
63517
63518               if (_expanded) {
63519                   wrap
63520                       .call(_content);
63521               }
63522
63523               wrap
63524                   .call(uiToggle(_expanded));
63525
63526               dispatch$1.call('toggled', this, _expanded);
63527           }
63528       };
63529
63530
63531       disclosure.title = function(val) {
63532           if (!arguments.length) return _title;
63533           _title = val;
63534           return disclosure;
63535       };
63536
63537
63538       disclosure.expanded = function(val) {
63539           if (!arguments.length) return _expanded;
63540           _expanded = val;
63541           return disclosure;
63542       };
63543
63544
63545       disclosure.updatePreference = function(val) {
63546           if (!arguments.length) return _updatePreference;
63547           _updatePreference = val;
63548           return disclosure;
63549       };
63550
63551
63552       disclosure.content = function(val) {
63553           if (!arguments.length) return _content;
63554           _content = val;
63555           return disclosure;
63556       };
63557
63558
63559       return utilRebind(disclosure, dispatch$1, 'on');
63560   }
63561
63562   function uiBackgroundDisplayOptions(context) {
63563       var detected = utilDetect();
63564       var storedOpacity = context.storage('background-opacity');
63565       var minVal = 0.25;
63566       var maxVal = detected.cssfilters ? 2 : 1;
63567
63568       var sliders = detected.cssfilters
63569           ? ['brightness', 'contrast', 'saturation', 'sharpness']
63570           : ['brightness'];
63571
63572       var _options = {
63573           brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
63574           contrast: 1,
63575           saturation: 1,
63576           sharpness: 1
63577       };
63578
63579       var _selection = select(null);
63580
63581
63582       function clamp(x, min, max) {
63583           return Math.max(min, Math.min(x, max));
63584       }
63585
63586
63587       function updateValue(d, val) {
63588           if (!val && event && event.target) {
63589               val = event.target.value;
63590           }
63591
63592           val = clamp(val, minVal, maxVal);
63593
63594           _options[d] = val;
63595           context.background()[d](val);
63596
63597           if (d === 'brightness') {
63598               context.storage('background-opacity', val);
63599           }
63600
63601           _selection
63602               .call(render);
63603       }
63604
63605
63606       function render(selection) {
63607           var container = selection.selectAll('.display-options-container')
63608               .data([0]);
63609
63610           var containerEnter = container.enter()
63611               .append('div')
63612               .attr('class', 'display-options-container controls-list');
63613
63614           // add slider controls
63615           var slidersEnter = containerEnter.selectAll('.display-control')
63616               .data(sliders)
63617               .enter()
63618               .append('div')
63619               .attr('class', function(d) { return 'display-control display-control-' + d; });
63620
63621           slidersEnter
63622               .append('h5')
63623               .text(function(d) { return t('background.' + d); })
63624               .append('span')
63625               .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
63626
63627           slidersEnter
63628               .append('input')
63629               .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
63630               .attr('type', 'range')
63631               .attr('min', minVal)
63632               .attr('max', maxVal)
63633               .attr('step', '0.05')
63634               .on('input', function(d) {
63635                   var val = select(this).property('value');
63636                   updateValue(d, val);
63637               });
63638
63639           slidersEnter
63640               .append('button')
63641               .attr('title', t('background.reset'))
63642               .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
63643               .on('click', function(d) {
63644                   if (event.button !== 0) return;
63645                   updateValue(d, 1);
63646               })
63647               .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
63648
63649
63650           // update
63651           container = containerEnter
63652               .merge(container);
63653
63654           container.selectAll('.display-option-input')
63655               .property('value', function(d) { return _options[d]; });
63656
63657           container.selectAll('.display-option-value')
63658               .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
63659
63660           container.selectAll('.display-option-reset')
63661               .classed('disabled', function(d) { return _options[d] === 1; });
63662
63663           // first time only, set brightness if needed
63664           if (containerEnter.size() && _options.brightness !== 1) {
63665               context.background().brightness(_options.brightness);
63666           }
63667       }
63668
63669
63670       function backgroundDisplayOptions(selection) {
63671           _selection = selection;
63672
63673           selection
63674               .call(uiDisclosure(context, 'background_display_options', true)
63675                   .title(t('background.display_options'))
63676                   .content(render)
63677               );
63678       }
63679
63680
63681       return backgroundDisplayOptions;
63682   }
63683
63684   function uiBackgroundOffset(context) {
63685       var directions = [
63686           ['right', [0.5, 0]],
63687           ['top', [0, -0.5]],
63688           ['left', [-0.5, 0]],
63689           ['bottom', [0, 0.5]]
63690       ];
63691
63692
63693       function d3_eventCancel() {
63694           event.stopPropagation();
63695           event.preventDefault();
63696       }
63697
63698
63699       function updateValue() {
63700           var meters = geoOffsetToMeters(context.background().offset());
63701           var x = +meters[0].toFixed(2);
63702           var y = +meters[1].toFixed(2);
63703
63704           d3_selectAll('.nudge-inner-rect')
63705               .select('input')
63706               .classed('error', false)
63707               .property('value', x + ', ' + y);
63708
63709           d3_selectAll('.nudge-reset')
63710               .classed('disabled', function() {
63711                   return (x === 0 && y === 0);
63712               });
63713       }
63714
63715
63716       function resetOffset() {
63717           context.background().offset([0, 0]);
63718           updateValue();
63719       }
63720
63721
63722       function nudge(d) {
63723           context.background().nudge(d, context.map().zoom());
63724           updateValue();
63725       }
63726
63727
63728       function clickNudgeButton(d) {
63729           var interval;
63730           var timeout = window.setTimeout(function() {
63731                   interval = window.setInterval(nudge.bind(null, d), 100);
63732               }, 500);
63733
63734           function doneNudge() {
63735               window.clearTimeout(timeout);
63736               window.clearInterval(interval);
63737               select(window)
63738                   .on('mouseup.buttonoffset', null, true)
63739                   .on('mousedown.buttonoffset', null, true);
63740           }
63741
63742           select(window)
63743               .on('mouseup.buttonoffset', doneNudge, true)
63744               .on('mousedown.buttonoffset', doneNudge, true);
63745
63746           nudge(d);
63747       }
63748
63749
63750       function inputOffset() {
63751           var input = select(this);
63752           var d = input.node().value;
63753
63754           if (d === '') return resetOffset();
63755
63756           d = d.replace(/;/g, ',').split(',').map(function(n) {
63757               // if n is NaN, it will always get mapped to false.
63758               return !isNaN(n) && n;
63759           });
63760
63761           if (d.length !== 2 || !d[0] || !d[1]) {
63762               input.classed('error', true);
63763               return;
63764           }
63765
63766           context.background().offset(geoMetersToOffset(d));
63767           updateValue();
63768       }
63769
63770
63771       function dragOffset() {
63772           event.preventDefault();
63773           if (event.button !== 0) return;
63774
63775           var origin = [event.clientX, event.clientY];
63776
63777           context.container()
63778               .append('div')
63779               .attr('class', 'nudge-surface');
63780
63781           select(window)
63782               .on('mousemove.offset', function() {
63783                   var latest = [event.clientX, event.clientY];
63784                   var d = [
63785                       -(origin[0] - latest[0]) / 4,
63786                       -(origin[1] - latest[1]) / 4
63787                   ];
63788
63789                   origin = latest;
63790                   nudge(d);
63791               })
63792               .on('mouseup.offset', function() {
63793                   if (event.button !== 0) return;
63794                   d3_selectAll('.nudge-surface')
63795                       .remove();
63796
63797                   select(window)
63798                       .on('mousemove.offset', null)
63799                       .on('mouseup.offset', null);
63800               });
63801       }
63802
63803
63804       function render(selection) {
63805           var container = selection.selectAll('.nudge-container')
63806               .data([0]);
63807
63808           var containerEnter = container.enter()
63809               .append('div')
63810               .attr('class', 'nudge-container cf');
63811
63812           containerEnter
63813               .append('div')
63814               .attr('class', 'nudge-instructions')
63815               .text(t('background.offset'));
63816
63817           var nudgeEnter = containerEnter
63818               .append('div')
63819               .attr('class', 'nudge-outer-rect')
63820               .on('mousedown', dragOffset);
63821
63822           nudgeEnter
63823               .append('div')
63824               .attr('class', 'nudge-inner-rect')
63825               .append('input')
63826               .on('change', inputOffset);
63827
63828           containerEnter
63829               .append('div')
63830               .selectAll('button')
63831               .data(directions).enter()
63832               .append('button')
63833               .attr('class', function(d) { return d[0] + ' nudge'; })
63834               .on('contextmenu', d3_eventCancel)
63835               .on('mousedown', function(d) {
63836                   if (event.button !== 0) return;
63837                   clickNudgeButton(d[1]);
63838               });
63839
63840           containerEnter
63841               .append('button')
63842               .attr('title', t('background.reset'))
63843               .attr('class', 'nudge-reset disabled')
63844               .on('contextmenu', d3_eventCancel)
63845               .on('click', function() {
63846                   if (event.button !== 0) return;
63847                   resetOffset();
63848               })
63849               .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
63850
63851           updateValue();
63852       }
63853
63854
63855       function backgroundOffset(selection) {
63856           selection
63857               .call(uiDisclosure(context, 'background_offset', false)
63858                   .title(t('background.fix_misalignment'))
63859                   .content(render)
63860               );
63861       }
63862
63863
63864       context.background()
63865           .on('change.backgroundOffset-update', updateValue);
63866
63867       return backgroundOffset;
63868   }
63869
63870   var marked = createCommonjsModule(function (module, exports) {
63871   (function(root) {
63872
63873   /**
63874    * Block-Level Grammar
63875    */
63876
63877   var block = {
63878     newline: /^\n+/,
63879     code: /^( {4}[^\n]+\n*)+/,
63880     fences: noop,
63881     hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
63882     heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
63883     nptable: noop,
63884     blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
63885     list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
63886     html: '^ {0,3}(?:' // optional indentation
63887       + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
63888       + '|comment[^\\n]*(\\n+|$)' // (2)
63889       + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
63890       + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
63891       + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
63892       + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
63893       + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
63894       + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
63895       + ')',
63896     def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
63897     table: noop,
63898     lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
63899     paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
63900     text: /^[^\n]+/
63901   };
63902
63903   block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
63904   block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
63905   block.def = edit(block.def)
63906     .replace('label', block._label)
63907     .replace('title', block._title)
63908     .getRegex();
63909
63910   block.bullet = /(?:[*+-]|\d{1,9}\.)/;
63911   block.item = /^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/;
63912   block.item = edit(block.item, 'gm')
63913     .replace(/bull/g, block.bullet)
63914     .getRegex();
63915
63916   block.list = edit(block.list)
63917     .replace(/bull/g, block.bullet)
63918     .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
63919     .replace('def', '\\n+(?=' + block.def.source + ')')
63920     .getRegex();
63921
63922   block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
63923     + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
63924     + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
63925     + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
63926     + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
63927     + '|track|ul';
63928   block._comment = /<!--(?!-?>)[\s\S]*?-->/;
63929   block.html = edit(block.html, 'i')
63930     .replace('comment', block._comment)
63931     .replace('tag', block._tag)
63932     .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
63933     .getRegex();
63934
63935   block.paragraph = edit(block.paragraph)
63936     .replace('hr', block.hr)
63937     .replace('heading', block.heading)
63938     .replace('lheading', block.lheading)
63939     .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
63940     .getRegex();
63941
63942   block.blockquote = edit(block.blockquote)
63943     .replace('paragraph', block.paragraph)
63944     .getRegex();
63945
63946   /**
63947    * Normal Block Grammar
63948    */
63949
63950   block.normal = merge({}, block);
63951
63952   /**
63953    * GFM Block Grammar
63954    */
63955
63956   block.gfm = merge({}, block.normal, {
63957     fences: /^ {0,3}(`{3,}|~{3,})([^`\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
63958     paragraph: /^/,
63959     heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
63960   });
63961
63962   block.gfm.paragraph = edit(block.paragraph)
63963     .replace('(?!', '(?!'
63964       + block.gfm.fences.source.replace('\\1', '\\2') + '|'
63965       + block.list.source.replace('\\1', '\\3') + '|')
63966     .getRegex();
63967
63968   /**
63969    * GFM + Tables Block Grammar
63970    */
63971
63972   block.tables = merge({}, block.gfm, {
63973     nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
63974     table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
63975   });
63976
63977   /**
63978    * Pedantic grammar
63979    */
63980
63981   block.pedantic = merge({}, block.normal, {
63982     html: edit(
63983       '^ *(?:comment *(?:\\n|\\s*$)'
63984       + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
63985       + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
63986       .replace('comment', block._comment)
63987       .replace(/tag/g, '(?!(?:'
63988         + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
63989         + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
63990         + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
63991       .getRegex(),
63992     def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
63993   });
63994
63995   /**
63996    * Block Lexer
63997    */
63998
63999   function Lexer(options) {
64000     this.tokens = [];
64001     this.tokens.links = Object.create(null);
64002     this.options = options || marked.defaults;
64003     this.rules = block.normal;
64004
64005     if (this.options.pedantic) {
64006       this.rules = block.pedantic;
64007     } else if (this.options.gfm) {
64008       if (this.options.tables) {
64009         this.rules = block.tables;
64010       } else {
64011         this.rules = block.gfm;
64012       }
64013     }
64014   }
64015
64016   /**
64017    * Expose Block Rules
64018    */
64019
64020   Lexer.rules = block;
64021
64022   /**
64023    * Static Lex Method
64024    */
64025
64026   Lexer.lex = function(src, options) {
64027     var lexer = new Lexer(options);
64028     return lexer.lex(src);
64029   };
64030
64031   /**
64032    * Preprocessing
64033    */
64034
64035   Lexer.prototype.lex = function(src) {
64036     src = src
64037       .replace(/\r\n|\r/g, '\n')
64038       .replace(/\t/g, '    ')
64039       .replace(/\u00a0/g, ' ')
64040       .replace(/\u2424/g, '\n');
64041
64042     return this.token(src, true);
64043   };
64044
64045   /**
64046    * Lexing
64047    */
64048
64049   Lexer.prototype.token = function(src, top) {
64050     src = src.replace(/^ +$/gm, '');
64051     var next,
64052         loose,
64053         cap,
64054         bull,
64055         b,
64056         item,
64057         listStart,
64058         listItems,
64059         t,
64060         space,
64061         i,
64062         tag,
64063         l,
64064         isordered,
64065         istask,
64066         ischecked;
64067
64068     while (src) {
64069       // newline
64070       if (cap = this.rules.newline.exec(src)) {
64071         src = src.substring(cap[0].length);
64072         if (cap[0].length > 1) {
64073           this.tokens.push({
64074             type: 'space'
64075           });
64076         }
64077       }
64078
64079       // code
64080       if (cap = this.rules.code.exec(src)) {
64081         src = src.substring(cap[0].length);
64082         cap = cap[0].replace(/^ {4}/gm, '');
64083         this.tokens.push({
64084           type: 'code',
64085           text: !this.options.pedantic
64086             ? rtrim(cap, '\n')
64087             : cap
64088         });
64089         continue;
64090       }
64091
64092       // fences (gfm)
64093       if (cap = this.rules.fences.exec(src)) {
64094         src = src.substring(cap[0].length);
64095         this.tokens.push({
64096           type: 'code',
64097           lang: cap[2] ? cap[2].trim() : cap[2],
64098           text: cap[3] || ''
64099         });
64100         continue;
64101       }
64102
64103       // heading
64104       if (cap = this.rules.heading.exec(src)) {
64105         src = src.substring(cap[0].length);
64106         this.tokens.push({
64107           type: 'heading',
64108           depth: cap[1].length,
64109           text: cap[2]
64110         });
64111         continue;
64112       }
64113
64114       // table no leading pipe (gfm)
64115       if (top && (cap = this.rules.nptable.exec(src))) {
64116         item = {
64117           type: 'table',
64118           header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
64119           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
64120           cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
64121         };
64122
64123         if (item.header.length === item.align.length) {
64124           src = src.substring(cap[0].length);
64125
64126           for (i = 0; i < item.align.length; i++) {
64127             if (/^ *-+: *$/.test(item.align[i])) {
64128               item.align[i] = 'right';
64129             } else if (/^ *:-+: *$/.test(item.align[i])) {
64130               item.align[i] = 'center';
64131             } else if (/^ *:-+ *$/.test(item.align[i])) {
64132               item.align[i] = 'left';
64133             } else {
64134               item.align[i] = null;
64135             }
64136           }
64137
64138           for (i = 0; i < item.cells.length; i++) {
64139             item.cells[i] = splitCells(item.cells[i], item.header.length);
64140           }
64141
64142           this.tokens.push(item);
64143
64144           continue;
64145         }
64146       }
64147
64148       // hr
64149       if (cap = this.rules.hr.exec(src)) {
64150         src = src.substring(cap[0].length);
64151         this.tokens.push({
64152           type: 'hr'
64153         });
64154         continue;
64155       }
64156
64157       // blockquote
64158       if (cap = this.rules.blockquote.exec(src)) {
64159         src = src.substring(cap[0].length);
64160
64161         this.tokens.push({
64162           type: 'blockquote_start'
64163         });
64164
64165         cap = cap[0].replace(/^ *> ?/gm, '');
64166
64167         // Pass `top` to keep the current
64168         // "toplevel" state. This is exactly
64169         // how markdown.pl works.
64170         this.token(cap, top);
64171
64172         this.tokens.push({
64173           type: 'blockquote_end'
64174         });
64175
64176         continue;
64177       }
64178
64179       // list
64180       if (cap = this.rules.list.exec(src)) {
64181         src = src.substring(cap[0].length);
64182         bull = cap[2];
64183         isordered = bull.length > 1;
64184
64185         listStart = {
64186           type: 'list_start',
64187           ordered: isordered,
64188           start: isordered ? +bull : '',
64189           loose: false
64190         };
64191
64192         this.tokens.push(listStart);
64193
64194         // Get each top-level item.
64195         cap = cap[0].match(this.rules.item);
64196
64197         listItems = [];
64198         next = false;
64199         l = cap.length;
64200         i = 0;
64201
64202         for (; i < l; i++) {
64203           item = cap[i];
64204
64205           // Remove the list item's bullet
64206           // so it is seen as the next token.
64207           space = item.length;
64208           item = item.replace(/^ *([*+-]|\d+\.) */, '');
64209
64210           // Outdent whatever the
64211           // list item contains. Hacky.
64212           if (~item.indexOf('\n ')) {
64213             space -= item.length;
64214             item = !this.options.pedantic
64215               ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
64216               : item.replace(/^ {1,4}/gm, '');
64217           }
64218
64219           // Determine whether the next list item belongs here.
64220           // Backpedal if it does not belong in this list.
64221           if (i !== l - 1) {
64222             b = block.bullet.exec(cap[i + 1])[0];
64223             if (bull.length > 1 ? b.length === 1
64224               : (b.length > 1 || (this.options.smartLists && b !== bull))) {
64225               src = cap.slice(i + 1).join('\n') + src;
64226               i = l - 1;
64227             }
64228           }
64229
64230           // Determine whether item is loose or not.
64231           // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
64232           // for discount behavior.
64233           loose = next || /\n\n(?!\s*$)/.test(item);
64234           if (i !== l - 1) {
64235             next = item.charAt(item.length - 1) === '\n';
64236             if (!loose) loose = next;
64237           }
64238
64239           if (loose) {
64240             listStart.loose = true;
64241           }
64242
64243           // Check for task list items
64244           istask = /^\[[ xX]\] /.test(item);
64245           ischecked = undefined;
64246           if (istask) {
64247             ischecked = item[1] !== ' ';
64248             item = item.replace(/^\[[ xX]\] +/, '');
64249           }
64250
64251           t = {
64252             type: 'list_item_start',
64253             task: istask,
64254             checked: ischecked,
64255             loose: loose
64256           };
64257
64258           listItems.push(t);
64259           this.tokens.push(t);
64260
64261           // Recurse.
64262           this.token(item, false);
64263
64264           this.tokens.push({
64265             type: 'list_item_end'
64266           });
64267         }
64268
64269         if (listStart.loose) {
64270           l = listItems.length;
64271           i = 0;
64272           for (; i < l; i++) {
64273             listItems[i].loose = true;
64274           }
64275         }
64276
64277         this.tokens.push({
64278           type: 'list_end'
64279         });
64280
64281         continue;
64282       }
64283
64284       // html
64285       if (cap = this.rules.html.exec(src)) {
64286         src = src.substring(cap[0].length);
64287         this.tokens.push({
64288           type: this.options.sanitize
64289             ? 'paragraph'
64290             : 'html',
64291           pre: !this.options.sanitizer
64292             && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
64293           text: cap[0]
64294         });
64295         continue;
64296       }
64297
64298       // def
64299       if (top && (cap = this.rules.def.exec(src))) {
64300         src = src.substring(cap[0].length);
64301         if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
64302         tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
64303         if (!this.tokens.links[tag]) {
64304           this.tokens.links[tag] = {
64305             href: cap[2],
64306             title: cap[3]
64307           };
64308         }
64309         continue;
64310       }
64311
64312       // table (gfm)
64313       if (top && (cap = this.rules.table.exec(src))) {
64314         item = {
64315           type: 'table',
64316           header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
64317           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
64318           cells: cap[3] ? cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') : []
64319         };
64320
64321         if (item.header.length === item.align.length) {
64322           src = src.substring(cap[0].length);
64323
64324           for (i = 0; i < item.align.length; i++) {
64325             if (/^ *-+: *$/.test(item.align[i])) {
64326               item.align[i] = 'right';
64327             } else if (/^ *:-+: *$/.test(item.align[i])) {
64328               item.align[i] = 'center';
64329             } else if (/^ *:-+ *$/.test(item.align[i])) {
64330               item.align[i] = 'left';
64331             } else {
64332               item.align[i] = null;
64333             }
64334           }
64335
64336           for (i = 0; i < item.cells.length; i++) {
64337             item.cells[i] = splitCells(
64338               item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
64339               item.header.length);
64340           }
64341
64342           this.tokens.push(item);
64343
64344           continue;
64345         }
64346       }
64347
64348       // lheading
64349       if (cap = this.rules.lheading.exec(src)) {
64350         src = src.substring(cap[0].length);
64351         this.tokens.push({
64352           type: 'heading',
64353           depth: cap[2] === '=' ? 1 : 2,
64354           text: cap[1]
64355         });
64356         continue;
64357       }
64358
64359       // top-level paragraph
64360       if (top && (cap = this.rules.paragraph.exec(src))) {
64361         src = src.substring(cap[0].length);
64362         this.tokens.push({
64363           type: 'paragraph',
64364           text: cap[1].charAt(cap[1].length - 1) === '\n'
64365             ? cap[1].slice(0, -1)
64366             : cap[1]
64367         });
64368         continue;
64369       }
64370
64371       // text
64372       if (cap = this.rules.text.exec(src)) {
64373         // Top-level should never reach here.
64374         src = src.substring(cap[0].length);
64375         this.tokens.push({
64376           type: 'text',
64377           text: cap[0]
64378         });
64379         continue;
64380       }
64381
64382       if (src) {
64383         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
64384       }
64385     }
64386
64387     return this.tokens;
64388   };
64389
64390   /**
64391    * Inline-Level Grammar
64392    */
64393
64394   var inline = {
64395     escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
64396     autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
64397     url: noop,
64398     tag: '^comment'
64399       + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
64400       + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
64401       + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
64402       + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
64403       + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
64404     link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
64405     reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
64406     nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
64407     strong: /^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
64408     em: /^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
64409     code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
64410     br: /^( {2,}|\\)\n(?!\s*$)/,
64411     del: noop,
64412     text: /^(`+|[^`])[\s\S]*?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
64413   };
64414
64415   // list of punctuation marks from common mark spec
64416   // without ` and ] to workaround Rule 17 (inline code blocks/links)
64417   inline._punctuation = '!"#$%&\'()*+,\\-./:;<=>?@\\[^_{|}~';
64418   inline.em = edit(inline.em).replace(/punctuation/g, inline._punctuation).getRegex();
64419
64420   inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
64421
64422   inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
64423   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])?)+(?![-_])/;
64424   inline.autolink = edit(inline.autolink)
64425     .replace('scheme', inline._scheme)
64426     .replace('email', inline._email)
64427     .getRegex();
64428
64429   inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
64430
64431   inline.tag = edit(inline.tag)
64432     .replace('comment', block._comment)
64433     .replace('attribute', inline._attribute)
64434     .getRegex();
64435
64436   inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/;
64437   inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f\\]*\)|[^\s\x00-\x1f()\\])*?)/;
64438   inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
64439
64440   inline.link = edit(inline.link)
64441     .replace('label', inline._label)
64442     .replace('href', inline._href)
64443     .replace('title', inline._title)
64444     .getRegex();
64445
64446   inline.reflink = edit(inline.reflink)
64447     .replace('label', inline._label)
64448     .getRegex();
64449
64450   /**
64451    * Normal Inline Grammar
64452    */
64453
64454   inline.normal = merge({}, inline);
64455
64456   /**
64457    * Pedantic Inline Grammar
64458    */
64459
64460   inline.pedantic = merge({}, inline.normal, {
64461     strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
64462     em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
64463     link: edit(/^!?\[(label)\]\((.*?)\)/)
64464       .replace('label', inline._label)
64465       .getRegex(),
64466     reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
64467       .replace('label', inline._label)
64468       .getRegex()
64469   });
64470
64471   /**
64472    * GFM Inline Grammar
64473    */
64474
64475   inline.gfm = merge({}, inline.normal, {
64476     escape: edit(inline.escape).replace('])', '~|])').getRegex(),
64477     _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
64478     url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
64479     _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
64480     del: /^~+(?=\S)([\s\S]*?\S)~+/,
64481     text: edit(inline.text)
64482       .replace(']|', '~]|')
64483       .replace('|$', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|$')
64484       .getRegex()
64485   });
64486
64487   inline.gfm.url = edit(inline.gfm.url, 'i')
64488     .replace('email', inline.gfm._extended_email)
64489     .getRegex();
64490   /**
64491    * GFM + Line Breaks Inline Grammar
64492    */
64493
64494   inline.breaks = merge({}, inline.gfm, {
64495     br: edit(inline.br).replace('{2,}', '*').getRegex(),
64496     text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
64497   });
64498
64499   /**
64500    * Inline Lexer & Compiler
64501    */
64502
64503   function InlineLexer(links, options) {
64504     this.options = options || marked.defaults;
64505     this.links = links;
64506     this.rules = inline.normal;
64507     this.renderer = this.options.renderer || new Renderer();
64508     this.renderer.options = this.options;
64509
64510     if (!this.links) {
64511       throw new Error('Tokens array requires a `links` property.');
64512     }
64513
64514     if (this.options.pedantic) {
64515       this.rules = inline.pedantic;
64516     } else if (this.options.gfm) {
64517       if (this.options.breaks) {
64518         this.rules = inline.breaks;
64519       } else {
64520         this.rules = inline.gfm;
64521       }
64522     }
64523   }
64524
64525   /**
64526    * Expose Inline Rules
64527    */
64528
64529   InlineLexer.rules = inline;
64530
64531   /**
64532    * Static Lexing/Compiling Method
64533    */
64534
64535   InlineLexer.output = function(src, links, options) {
64536     var inline = new InlineLexer(links, options);
64537     return inline.output(src);
64538   };
64539
64540   /**
64541    * Lexing/Compiling
64542    */
64543
64544   InlineLexer.prototype.output = function(src) {
64545     var out = '',
64546         link,
64547         text,
64548         href,
64549         title,
64550         cap,
64551         prevCapZero;
64552
64553     while (src) {
64554       // escape
64555       if (cap = this.rules.escape.exec(src)) {
64556         src = src.substring(cap[0].length);
64557         out += escape(cap[1]);
64558         continue;
64559       }
64560
64561       // tag
64562       if (cap = this.rules.tag.exec(src)) {
64563         if (!this.inLink && /^<a /i.test(cap[0])) {
64564           this.inLink = true;
64565         } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
64566           this.inLink = false;
64567         }
64568         if (!this.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
64569           this.inRawBlock = true;
64570         } else if (this.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
64571           this.inRawBlock = false;
64572         }
64573
64574         src = src.substring(cap[0].length);
64575         out += this.options.sanitize
64576           ? this.options.sanitizer
64577             ? this.options.sanitizer(cap[0])
64578             : escape(cap[0])
64579           : cap[0];
64580         continue;
64581       }
64582
64583       // link
64584       if (cap = this.rules.link.exec(src)) {
64585         src = src.substring(cap[0].length);
64586         this.inLink = true;
64587         href = cap[2];
64588         if (this.options.pedantic) {
64589           link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
64590
64591           if (link) {
64592             href = link[1];
64593             title = link[3];
64594           } else {
64595             title = '';
64596           }
64597         } else {
64598           title = cap[3] ? cap[3].slice(1, -1) : '';
64599         }
64600         href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
64601         out += this.outputLink(cap, {
64602           href: InlineLexer.escapes(href),
64603           title: InlineLexer.escapes(title)
64604         });
64605         this.inLink = false;
64606         continue;
64607       }
64608
64609       // reflink, nolink
64610       if ((cap = this.rules.reflink.exec(src))
64611           || (cap = this.rules.nolink.exec(src))) {
64612         src = src.substring(cap[0].length);
64613         link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
64614         link = this.links[link.toLowerCase()];
64615         if (!link || !link.href) {
64616           out += cap[0].charAt(0);
64617           src = cap[0].substring(1) + src;
64618           continue;
64619         }
64620         this.inLink = true;
64621         out += this.outputLink(cap, link);
64622         this.inLink = false;
64623         continue;
64624       }
64625
64626       // strong
64627       if (cap = this.rules.strong.exec(src)) {
64628         src = src.substring(cap[0].length);
64629         out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
64630         continue;
64631       }
64632
64633       // em
64634       if (cap = this.rules.em.exec(src)) {
64635         src = src.substring(cap[0].length);
64636         out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
64637         continue;
64638       }
64639
64640       // code
64641       if (cap = this.rules.code.exec(src)) {
64642         src = src.substring(cap[0].length);
64643         out += this.renderer.codespan(escape(cap[2].trim(), true));
64644         continue;
64645       }
64646
64647       // br
64648       if (cap = this.rules.br.exec(src)) {
64649         src = src.substring(cap[0].length);
64650         out += this.renderer.br();
64651         continue;
64652       }
64653
64654       // del (gfm)
64655       if (cap = this.rules.del.exec(src)) {
64656         src = src.substring(cap[0].length);
64657         out += this.renderer.del(this.output(cap[1]));
64658         continue;
64659       }
64660
64661       // autolink
64662       if (cap = this.rules.autolink.exec(src)) {
64663         src = src.substring(cap[0].length);
64664         if (cap[2] === '@') {
64665           text = escape(this.mangle(cap[1]));
64666           href = 'mailto:' + text;
64667         } else {
64668           text = escape(cap[1]);
64669           href = text;
64670         }
64671         out += this.renderer.link(href, null, text);
64672         continue;
64673       }
64674
64675       // url (gfm)
64676       if (!this.inLink && (cap = this.rules.url.exec(src))) {
64677         if (cap[2] === '@') {
64678           text = escape(cap[0]);
64679           href = 'mailto:' + text;
64680         } else {
64681           // do extended autolink path validation
64682           do {
64683             prevCapZero = cap[0];
64684             cap[0] = this.rules._backpedal.exec(cap[0])[0];
64685           } while (prevCapZero !== cap[0]);
64686           text = escape(cap[0]);
64687           if (cap[1] === 'www.') {
64688             href = 'http://' + text;
64689           } else {
64690             href = text;
64691           }
64692         }
64693         src = src.substring(cap[0].length);
64694         out += this.renderer.link(href, null, text);
64695         continue;
64696       }
64697
64698       // text
64699       if (cap = this.rules.text.exec(src)) {
64700         src = src.substring(cap[0].length);
64701         if (this.inRawBlock) {
64702           out += this.renderer.text(cap[0]);
64703         } else {
64704           out += this.renderer.text(escape(this.smartypants(cap[0])));
64705         }
64706         continue;
64707       }
64708
64709       if (src) {
64710         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
64711       }
64712     }
64713
64714     return out;
64715   };
64716
64717   InlineLexer.escapes = function(text) {
64718     return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
64719   };
64720
64721   /**
64722    * Compile Link
64723    */
64724
64725   InlineLexer.prototype.outputLink = function(cap, link) {
64726     var href = link.href,
64727         title = link.title ? escape(link.title) : null;
64728
64729     return cap[0].charAt(0) !== '!'
64730       ? this.renderer.link(href, title, this.output(cap[1]))
64731       : this.renderer.image(href, title, escape(cap[1]));
64732   };
64733
64734   /**
64735    * Smartypants Transformations
64736    */
64737
64738   InlineLexer.prototype.smartypants = function(text) {
64739     if (!this.options.smartypants) return text;
64740     return text
64741       // em-dashes
64742       .replace(/---/g, '\u2014')
64743       // en-dashes
64744       .replace(/--/g, '\u2013')
64745       // opening singles
64746       .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
64747       // closing singles & apostrophes
64748       .replace(/'/g, '\u2019')
64749       // opening doubles
64750       .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
64751       // closing doubles
64752       .replace(/"/g, '\u201d')
64753       // ellipses
64754       .replace(/\.{3}/g, '\u2026');
64755   };
64756
64757   /**
64758    * Mangle Links
64759    */
64760
64761   InlineLexer.prototype.mangle = function(text) {
64762     if (!this.options.mangle) return text;
64763     var out = '',
64764         l = text.length,
64765         i = 0,
64766         ch;
64767
64768     for (; i < l; i++) {
64769       ch = text.charCodeAt(i);
64770       if (Math.random() > 0.5) {
64771         ch = 'x' + ch.toString(16);
64772       }
64773       out += '&#' + ch + ';';
64774     }
64775
64776     return out;
64777   };
64778
64779   /**
64780    * Renderer
64781    */
64782
64783   function Renderer(options) {
64784     this.options = options || marked.defaults;
64785   }
64786
64787   Renderer.prototype.code = function(code, infostring, escaped) {
64788     var lang = (infostring || '').match(/\S*/)[0];
64789     if (this.options.highlight) {
64790       var out = this.options.highlight(code, lang);
64791       if (out != null && out !== code) {
64792         escaped = true;
64793         code = out;
64794       }
64795     }
64796
64797     if (!lang) {
64798       return '<pre><code>'
64799         + (escaped ? code : escape(code, true))
64800         + '</code></pre>';
64801     }
64802
64803     return '<pre><code class="'
64804       + this.options.langPrefix
64805       + escape(lang, true)
64806       + '">'
64807       + (escaped ? code : escape(code, true))
64808       + '</code></pre>\n';
64809   };
64810
64811   Renderer.prototype.blockquote = function(quote) {
64812     return '<blockquote>\n' + quote + '</blockquote>\n';
64813   };
64814
64815   Renderer.prototype.html = function(html) {
64816     return html;
64817   };
64818
64819   Renderer.prototype.heading = function(text, level, raw, slugger) {
64820     if (this.options.headerIds) {
64821       return '<h'
64822         + level
64823         + ' id="'
64824         + this.options.headerPrefix
64825         + slugger.slug(raw)
64826         + '">'
64827         + text
64828         + '</h'
64829         + level
64830         + '>\n';
64831     }
64832     // ignore IDs
64833     return '<h' + level + '>' + text + '</h' + level + '>\n';
64834   };
64835
64836   Renderer.prototype.hr = function() {
64837     return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
64838   };
64839
64840   Renderer.prototype.list = function(body, ordered, start) {
64841     var type = ordered ? 'ol' : 'ul',
64842         startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
64843     return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
64844   };
64845
64846   Renderer.prototype.listitem = function(text) {
64847     return '<li>' + text + '</li>\n';
64848   };
64849
64850   Renderer.prototype.checkbox = function(checked) {
64851     return '<input '
64852       + (checked ? 'checked="" ' : '')
64853       + 'disabled="" type="checkbox"'
64854       + (this.options.xhtml ? ' /' : '')
64855       + '> ';
64856   };
64857
64858   Renderer.prototype.paragraph = function(text) {
64859     return '<p>' + text + '</p>\n';
64860   };
64861
64862   Renderer.prototype.table = function(header, body) {
64863     if (body) body = '<tbody>' + body + '</tbody>';
64864
64865     return '<table>\n'
64866       + '<thead>\n'
64867       + header
64868       + '</thead>\n'
64869       + body
64870       + '</table>\n';
64871   };
64872
64873   Renderer.prototype.tablerow = function(content) {
64874     return '<tr>\n' + content + '</tr>\n';
64875   };
64876
64877   Renderer.prototype.tablecell = function(content, flags) {
64878     var type = flags.header ? 'th' : 'td';
64879     var tag = flags.align
64880       ? '<' + type + ' align="' + flags.align + '">'
64881       : '<' + type + '>';
64882     return tag + content + '</' + type + '>\n';
64883   };
64884
64885   // span level renderer
64886   Renderer.prototype.strong = function(text) {
64887     return '<strong>' + text + '</strong>';
64888   };
64889
64890   Renderer.prototype.em = function(text) {
64891     return '<em>' + text + '</em>';
64892   };
64893
64894   Renderer.prototype.codespan = function(text) {
64895     return '<code>' + text + '</code>';
64896   };
64897
64898   Renderer.prototype.br = function() {
64899     return this.options.xhtml ? '<br/>' : '<br>';
64900   };
64901
64902   Renderer.prototype.del = function(text) {
64903     return '<del>' + text + '</del>';
64904   };
64905
64906   Renderer.prototype.link = function(href, title, text) {
64907     href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
64908     if (href === null) {
64909       return text;
64910     }
64911     var out = '<a href="' + escape(href) + '"';
64912     if (title) {
64913       out += ' title="' + title + '"';
64914     }
64915     out += '>' + text + '</a>';
64916     return out;
64917   };
64918
64919   Renderer.prototype.image = function(href, title, text) {
64920     href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
64921     if (href === null) {
64922       return text;
64923     }
64924
64925     var out = '<img src="' + href + '" alt="' + text + '"';
64926     if (title) {
64927       out += ' title="' + title + '"';
64928     }
64929     out += this.options.xhtml ? '/>' : '>';
64930     return out;
64931   };
64932
64933   Renderer.prototype.text = function(text) {
64934     return text;
64935   };
64936
64937   /**
64938    * TextRenderer
64939    * returns only the textual part of the token
64940    */
64941
64942   function TextRenderer() {}
64943
64944   // no need for block level renderers
64945
64946   TextRenderer.prototype.strong =
64947   TextRenderer.prototype.em =
64948   TextRenderer.prototype.codespan =
64949   TextRenderer.prototype.del =
64950   TextRenderer.prototype.text = function (text) {
64951     return text;
64952   };
64953
64954   TextRenderer.prototype.link =
64955   TextRenderer.prototype.image = function(href, title, text) {
64956     return '' + text;
64957   };
64958
64959   TextRenderer.prototype.br = function() {
64960     return '';
64961   };
64962
64963   /**
64964    * Parsing & Compiling
64965    */
64966
64967   function Parser(options) {
64968     this.tokens = [];
64969     this.token = null;
64970     this.options = options || marked.defaults;
64971     this.options.renderer = this.options.renderer || new Renderer();
64972     this.renderer = this.options.renderer;
64973     this.renderer.options = this.options;
64974     this.slugger = new Slugger();
64975   }
64976
64977   /**
64978    * Static Parse Method
64979    */
64980
64981   Parser.parse = function(src, options) {
64982     var parser = new Parser(options);
64983     return parser.parse(src);
64984   };
64985
64986   /**
64987    * Parse Loop
64988    */
64989
64990   Parser.prototype.parse = function(src) {
64991     this.inline = new InlineLexer(src.links, this.options);
64992     // use an InlineLexer with a TextRenderer to extract pure text
64993     this.inlineText = new InlineLexer(
64994       src.links,
64995       merge({}, this.options, {renderer: new TextRenderer()})
64996     );
64997     this.tokens = src.reverse();
64998
64999     var out = '';
65000     while (this.next()) {
65001       out += this.tok();
65002     }
65003
65004     return out;
65005   };
65006
65007   /**
65008    * Next Token
65009    */
65010
65011   Parser.prototype.next = function() {
65012     return this.token = this.tokens.pop();
65013   };
65014
65015   /**
65016    * Preview Next Token
65017    */
65018
65019   Parser.prototype.peek = function() {
65020     return this.tokens[this.tokens.length - 1] || 0;
65021   };
65022
65023   /**
65024    * Parse Text Tokens
65025    */
65026
65027   Parser.prototype.parseText = function() {
65028     var body = this.token.text;
65029
65030     while (this.peek().type === 'text') {
65031       body += '\n' + this.next().text;
65032     }
65033
65034     return this.inline.output(body);
65035   };
65036
65037   /**
65038    * Parse Current Token
65039    */
65040
65041   Parser.prototype.tok = function() {
65042     switch (this.token.type) {
65043       case 'space': {
65044         return '';
65045       }
65046       case 'hr': {
65047         return this.renderer.hr();
65048       }
65049       case 'heading': {
65050         return this.renderer.heading(
65051           this.inline.output(this.token.text),
65052           this.token.depth,
65053           unescape(this.inlineText.output(this.token.text)),
65054           this.slugger);
65055       }
65056       case 'code': {
65057         return this.renderer.code(this.token.text,
65058           this.token.lang,
65059           this.token.escaped);
65060       }
65061       case 'table': {
65062         var header = '',
65063             body = '',
65064             i,
65065             row,
65066             cell,
65067             j;
65068
65069         // header
65070         cell = '';
65071         for (i = 0; i < this.token.header.length; i++) {
65072           cell += this.renderer.tablecell(
65073             this.inline.output(this.token.header[i]),
65074             { header: true, align: this.token.align[i] }
65075           );
65076         }
65077         header += this.renderer.tablerow(cell);
65078
65079         for (i = 0; i < this.token.cells.length; i++) {
65080           row = this.token.cells[i];
65081
65082           cell = '';
65083           for (j = 0; j < row.length; j++) {
65084             cell += this.renderer.tablecell(
65085               this.inline.output(row[j]),
65086               { header: false, align: this.token.align[j] }
65087             );
65088           }
65089
65090           body += this.renderer.tablerow(cell);
65091         }
65092         return this.renderer.table(header, body);
65093       }
65094       case 'blockquote_start': {
65095         body = '';
65096
65097         while (this.next().type !== 'blockquote_end') {
65098           body += this.tok();
65099         }
65100
65101         return this.renderer.blockquote(body);
65102       }
65103       case 'list_start': {
65104         body = '';
65105         var ordered = this.token.ordered,
65106             start = this.token.start;
65107
65108         while (this.next().type !== 'list_end') {
65109           body += this.tok();
65110         }
65111
65112         return this.renderer.list(body, ordered, start);
65113       }
65114       case 'list_item_start': {
65115         body = '';
65116         var loose = this.token.loose;
65117
65118         if (this.token.task) {
65119           body += this.renderer.checkbox(this.token.checked);
65120         }
65121
65122         while (this.next().type !== 'list_item_end') {
65123           body += !loose && this.token.type === 'text'
65124             ? this.parseText()
65125             : this.tok();
65126         }
65127
65128         return this.renderer.listitem(body);
65129       }
65130       case 'html': {
65131         // TODO parse inline content if parameter markdown=1
65132         return this.renderer.html(this.token.text);
65133       }
65134       case 'paragraph': {
65135         return this.renderer.paragraph(this.inline.output(this.token.text));
65136       }
65137       case 'text': {
65138         return this.renderer.paragraph(this.parseText());
65139       }
65140       default: {
65141         var errMsg = 'Token with "' + this.token.type + '" type was not found.';
65142         if (this.options.silent) {
65143           console.log(errMsg);
65144         } else {
65145           throw new Error(errMsg);
65146         }
65147       }
65148     }
65149   };
65150
65151   /**
65152    * Slugger generates header id
65153    */
65154
65155   function Slugger () {
65156     this.seen = {};
65157   }
65158
65159   /**
65160    * Convert string to unique id
65161    */
65162
65163   Slugger.prototype.slug = function (value) {
65164     var slug = value
65165       .toLowerCase()
65166       .trim()
65167       .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '')
65168       .replace(/\s/g, '-');
65169
65170     if (this.seen.hasOwnProperty(slug)) {
65171       var originalSlug = slug;
65172       do {
65173         this.seen[originalSlug]++;
65174         slug = originalSlug + '-' + this.seen[originalSlug];
65175       } while (this.seen.hasOwnProperty(slug));
65176     }
65177     this.seen[slug] = 0;
65178
65179     return slug;
65180   };
65181
65182   /**
65183    * Helpers
65184    */
65185
65186   function escape(html, encode) {
65187     if (encode) {
65188       if (escape.escapeTest.test(html)) {
65189         return html.replace(escape.escapeReplace, function (ch) { return escape.replacements[ch]; });
65190       }
65191     } else {
65192       if (escape.escapeTestNoEncode.test(html)) {
65193         return html.replace(escape.escapeReplaceNoEncode, function (ch) { return escape.replacements[ch]; });
65194       }
65195     }
65196
65197     return html;
65198   }
65199
65200   escape.escapeTest = /[&<>"']/;
65201   escape.escapeReplace = /[&<>"']/g;
65202   escape.replacements = {
65203     '&': '&amp;',
65204     '<': '&lt;',
65205     '>': '&gt;',
65206     '"': '&quot;',
65207     "'": '&#39;'
65208   };
65209
65210   escape.escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
65211   escape.escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
65212
65213   function unescape(html) {
65214     // explicitly match decimal, hex, and named HTML entities
65215     return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
65216       n = n.toLowerCase();
65217       if (n === 'colon') return ':';
65218       if (n.charAt(0) === '#') {
65219         return n.charAt(1) === 'x'
65220           ? String.fromCharCode(parseInt(n.substring(2), 16))
65221           : String.fromCharCode(+n.substring(1));
65222       }
65223       return '';
65224     });
65225   }
65226
65227   function edit(regex, opt) {
65228     regex = regex.source || regex;
65229     opt = opt || '';
65230     return {
65231       replace: function(name, val) {
65232         val = val.source || val;
65233         val = val.replace(/(^|[^\[])\^/g, '$1');
65234         regex = regex.replace(name, val);
65235         return this;
65236       },
65237       getRegex: function() {
65238         return new RegExp(regex, opt);
65239       }
65240     };
65241   }
65242
65243   function cleanUrl(sanitize, base, href) {
65244     if (sanitize) {
65245       try {
65246         var prot = decodeURIComponent(unescape(href))
65247           .replace(/[^\w:]/g, '')
65248           .toLowerCase();
65249       } catch (e) {
65250         return null;
65251       }
65252       if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
65253         return null;
65254       }
65255     }
65256     if (base && !originIndependentUrl.test(href)) {
65257       href = resolveUrl(base, href);
65258     }
65259     try {
65260       href = encodeURI(href).replace(/%25/g, '%');
65261     } catch (e) {
65262       return null;
65263     }
65264     return href;
65265   }
65266
65267   function resolveUrl(base, href) {
65268     if (!baseUrls[' ' + base]) {
65269       // we can ignore everything in base after the last slash of its path component,
65270       // but we might need to add _that_
65271       // https://tools.ietf.org/html/rfc3986#section-3
65272       if (/^[^:]+:\/*[^/]*$/.test(base)) {
65273         baseUrls[' ' + base] = base + '/';
65274       } else {
65275         baseUrls[' ' + base] = rtrim(base, '/', true);
65276       }
65277     }
65278     base = baseUrls[' ' + base];
65279
65280     if (href.slice(0, 2) === '//') {
65281       return base.replace(/:[\s\S]*/, ':') + href;
65282     } else if (href.charAt(0) === '/') {
65283       return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
65284     } else {
65285       return base + href;
65286     }
65287   }
65288   var baseUrls = {};
65289   var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
65290
65291   function noop() {}
65292   noop.exec = noop;
65293
65294   function merge(obj) {
65295     var i = 1,
65296         target,
65297         key;
65298
65299     for (; i < arguments.length; i++) {
65300       target = arguments[i];
65301       for (key in target) {
65302         if (Object.prototype.hasOwnProperty.call(target, key)) {
65303           obj[key] = target[key];
65304         }
65305       }
65306     }
65307
65308     return obj;
65309   }
65310
65311   function splitCells(tableRow, count) {
65312     // ensure that every cell-delimiting pipe has a space
65313     // before it to distinguish it from an escaped pipe
65314     var row = tableRow.replace(/\|/g, function (match, offset, str) {
65315           var escaped = false,
65316               curr = offset;
65317           while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
65318           if (escaped) {
65319             // odd number of slashes means | is escaped
65320             // so we leave it alone
65321             return '|';
65322           } else {
65323             // add space before unescaped |
65324             return ' |';
65325           }
65326         }),
65327         cells = row.split(/ \|/),
65328         i = 0;
65329
65330     if (cells.length > count) {
65331       cells.splice(count);
65332     } else {
65333       while (cells.length < count) cells.push('');
65334     }
65335
65336     for (; i < cells.length; i++) {
65337       // leading or trailing whitespace is ignored per the gfm spec
65338       cells[i] = cells[i].trim().replace(/\\\|/g, '|');
65339     }
65340     return cells;
65341   }
65342
65343   // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
65344   // /c*$/ is vulnerable to REDOS.
65345   // invert: Remove suffix of non-c chars instead. Default falsey.
65346   function rtrim(str, c, invert) {
65347     if (str.length === 0) {
65348       return '';
65349     }
65350
65351     // Length of suffix matching the invert condition.
65352     var suffLen = 0;
65353
65354     // Step left until we fail to match the invert condition.
65355     while (suffLen < str.length) {
65356       var currChar = str.charAt(str.length - suffLen - 1);
65357       if (currChar === c && !invert) {
65358         suffLen++;
65359       } else if (currChar !== c && invert) {
65360         suffLen++;
65361       } else {
65362         break;
65363       }
65364     }
65365
65366     return str.substr(0, str.length - suffLen);
65367   }
65368
65369   /**
65370    * Marked
65371    */
65372
65373   function marked(src, opt, callback) {
65374     // throw error in case of non string input
65375     if (typeof src === 'undefined' || src === null) {
65376       throw new Error('marked(): input parameter is undefined or null');
65377     }
65378     if (typeof src !== 'string') {
65379       throw new Error('marked(): input parameter is of type '
65380         + Object.prototype.toString.call(src) + ', string expected');
65381     }
65382
65383     if (callback || typeof opt === 'function') {
65384       if (!callback) {
65385         callback = opt;
65386         opt = null;
65387       }
65388
65389       opt = merge({}, marked.defaults, opt || {});
65390
65391       var highlight = opt.highlight,
65392           tokens,
65393           pending,
65394           i = 0;
65395
65396       try {
65397         tokens = Lexer.lex(src, opt);
65398       } catch (e) {
65399         return callback(e);
65400       }
65401
65402       pending = tokens.length;
65403
65404       var done = function(err) {
65405         if (err) {
65406           opt.highlight = highlight;
65407           return callback(err);
65408         }
65409
65410         var out;
65411
65412         try {
65413           out = Parser.parse(tokens, opt);
65414         } catch (e) {
65415           err = e;
65416         }
65417
65418         opt.highlight = highlight;
65419
65420         return err
65421           ? callback(err)
65422           : callback(null, out);
65423       };
65424
65425       if (!highlight || highlight.length < 3) {
65426         return done();
65427       }
65428
65429       delete opt.highlight;
65430
65431       if (!pending) return done();
65432
65433       for (; i < tokens.length; i++) {
65434         (function(token) {
65435           if (token.type !== 'code') {
65436             return --pending || done();
65437           }
65438           return highlight(token.text, token.lang, function(err, code) {
65439             if (err) return done(err);
65440             if (code == null || code === token.text) {
65441               return --pending || done();
65442             }
65443             token.text = code;
65444             token.escaped = true;
65445             --pending || done();
65446           });
65447         })(tokens[i]);
65448       }
65449
65450       return;
65451     }
65452     try {
65453       if (opt) opt = merge({}, marked.defaults, opt);
65454       return Parser.parse(Lexer.lex(src, opt), opt);
65455     } catch (e) {
65456       e.message += '\nPlease report this to https://github.com/markedjs/marked.';
65457       if ((opt || marked.defaults).silent) {
65458         return '<p>An error occurred:</p><pre>'
65459           + escape(e.message + '', true)
65460           + '</pre>';
65461       }
65462       throw e;
65463     }
65464   }
65465
65466   /**
65467    * Options
65468    */
65469
65470   marked.options =
65471   marked.setOptions = function(opt) {
65472     merge(marked.defaults, opt);
65473     return marked;
65474   };
65475
65476   marked.getDefaults = function () {
65477     return {
65478       baseUrl: null,
65479       breaks: false,
65480       gfm: true,
65481       headerIds: true,
65482       headerPrefix: '',
65483       highlight: null,
65484       langPrefix: 'language-',
65485       mangle: true,
65486       pedantic: false,
65487       renderer: new Renderer(),
65488       sanitize: false,
65489       sanitizer: null,
65490       silent: false,
65491       smartLists: false,
65492       smartypants: false,
65493       tables: true,
65494       xhtml: false
65495     };
65496   };
65497
65498   marked.defaults = marked.getDefaults();
65499
65500   /**
65501    * Expose
65502    */
65503
65504   marked.Parser = Parser;
65505   marked.parser = Parser.parse;
65506
65507   marked.Renderer = Renderer;
65508   marked.TextRenderer = TextRenderer;
65509
65510   marked.Lexer = Lexer;
65511   marked.lexer = Lexer.lex;
65512
65513   marked.InlineLexer = InlineLexer;
65514   marked.inlineLexer = InlineLexer.output;
65515
65516   marked.Slugger = Slugger;
65517
65518   marked.parse = marked;
65519
65520   {
65521     module.exports = marked;
65522   }
65523   })(commonjsGlobal || (typeof window !== 'undefined' ? window : commonjsGlobal));
65524   });
65525
65526   function pointBox(loc, context) {
65527       var rect = context.surfaceRect();
65528       var point = context.curtainProjection(loc);
65529       return {
65530           left: point[0] + rect.left - 40,
65531           top: point[1] + rect.top - 60,
65532           width: 80,
65533           height: 90
65534       };
65535   }
65536
65537
65538   function pad$1(locOrBox, padding, context) {
65539       var box;
65540       if (locOrBox instanceof Array) {
65541           var rect = context.surfaceRect();
65542           var point = context.curtainProjection(locOrBox);
65543           box = {
65544               left: point[0] + rect.left,
65545               top: point[1] + rect.top
65546           };
65547       } else {
65548           box = locOrBox;
65549       }
65550
65551       return {
65552           left: box.left - padding,
65553           top: box.top - padding,
65554           width: (box.width || 0) + 2 * padding,
65555           height: (box.width || 0) + 2 * padding
65556       };
65557   }
65558
65559
65560   function icon(name, svgklass, useklass) {
65561       return '<svg class="icon ' + (svgklass || '') + '">' +
65562            '<use xlink:href="' + name + '"' +
65563            (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
65564   }
65565
65566
65567   function slugify(text) {
65568       return text.toString().toLowerCase()
65569           .replace(/\s+/g, '-')           // Replace spaces with -
65570           .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
65571           .replace(/\-\-+/g, '-')         // Replace multiple - with single -
65572           .replace(/^-+/, '')             // Trim - from start of text
65573           .replace(/-+$/, '');            // Trim - from end of text
65574   }
65575
65576
65577   // console warning for missing walkthrough names
65578   var missingStrings = {};
65579   function checkKey(key, text) {
65580       if (t(key, { default: undefined}) === undefined) {
65581           if (missingStrings.hasOwnProperty(key)) return;  // warn once
65582           missingStrings[key] = text;
65583           var missing = key + ': ' + text;
65584           if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
65585       }
65586   }
65587
65588
65589   function localize(obj) {
65590       var key;
65591
65592       // Assign name if entity has one..
65593       var name = obj.tags && obj.tags.name;
65594       if (name) {
65595           key = 'intro.graph.name.' + slugify(name);
65596           obj.tags.name = t(key, { default: name });
65597           checkKey(key, name);
65598       }
65599
65600       // Assign street name if entity has one..
65601       var street = obj.tags && obj.tags['addr:street'];
65602       if (street) {
65603           key = 'intro.graph.name.' + slugify(street);
65604           obj.tags['addr:street'] = t(key, { default: street });
65605           checkKey(key, street);
65606
65607           // Add address details common across walkthrough..
65608           var addrTags = [
65609               'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
65610               'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
65611           ];
65612           addrTags.forEach(function(k) {
65613               var key = 'intro.graph.' + k;
65614               var tag = 'addr:' + k;
65615               var val = obj.tags && obj.tags[tag];
65616               var str = t(key, { default: val });
65617
65618               if (str) {
65619                   if (str.match(/^<.*>$/) !== null) {
65620                       delete obj.tags[tag];
65621                   } else {
65622                       obj.tags[tag] = str;
65623                   }
65624               }
65625           });
65626       }
65627
65628       return obj;
65629   }
65630
65631
65632   // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
65633   function isMostlySquare(points) {
65634       // note: uses 15 here instead of the 12 from actionOrthogonalize because
65635       // actionOrthogonalize can actually straighten some larger angles as it iterates
65636       var threshold = 15; // degrees within right or straight
65637       var lowerBound = Math.cos((90 - threshold) * Math.PI / 180);  // near right
65638       var upperBound = Math.cos(threshold * Math.PI / 180);         // near straight
65639       var mag;
65640
65641       for (var i = 0; i < points.length; i++) {
65642           mag = Math.abs(normalizedDotProduct(i, points));
65643           if (mag > lowerBound && mag < upperBound) {
65644               return false;
65645           }
65646       }
65647
65648       return true;
65649
65650
65651       function normalizedDotProduct(i, points) {
65652           var a = points[(i - 1 + points.length) % points.length];
65653           var b = points[i];
65654           var c = points[(i + 1) % points.length];
65655           var p = subtractPoints(a, b);
65656           var q = subtractPoints(c, b);
65657
65658           p = normalizePoint(p);
65659           q = normalizePoint(q);
65660
65661           return p[0] * q[0] + p[1] * q[1];
65662
65663
65664           function subtractPoints(a, b) {
65665               return [a[0] - b[0], a[1] - b[1]];
65666           }
65667
65668           function normalizePoint(point) {
65669               var vector = [0, 0];
65670               var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
65671               if (length !== 0) {
65672                   vector[0] = point[0] / length;
65673                   vector[1] = point[1] / length;
65674               }
65675               return vector;
65676           }
65677       }
65678   }
65679
65680
65681   function selectMenuItem(operation) {
65682       var selector = '.edit-menu .edit-menu-item-' + operation +
65683           ', .radial-menu .radial-menu-item-' + operation;
65684       return select(selector);
65685   }
65686
65687
65688   function transitionTime(point1, point2) {
65689       var distance = geoSphericalDistance(point1, point2);
65690       if (distance === 0)
65691           return 0;
65692       else if (distance < 80)
65693           return 500;
65694       else
65695           return 1000;
65696   }
65697
65698   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:"marked",highway:"crossing"}},n1027:{id:"n1027",loc:[-85.634767,41.946172]},n1028:{id:"n1028",loc:[-85.634622,41.946175],tags:{crossing:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",highway:"crossing"}},n4687:{id:"n4687",loc:[-85.635883,41.94006]},n4688:{id:"n4688",loc:[-85.635768,41.940051],tags:{crossing:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",footway:"crossing",highway:"footway"}},w162:{id:"w162",nodes:["n727","n2411","n728"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w163:{id:"w163",nodes:["n729","n730","n731"],tags:{crossing:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",footway:"crossing",highway:"footway"}},w817:{id:"w817",nodes:["n4687","n4688","n4689"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w818:{id:"w818",nodes:["n4689","n4690","n307"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w819:{id:"w819",nodes:["n2266","n4743"],tags:{highway:"path"}},w82:{id:"w82",nodes:["n724","n368","n369"],tags:{crossing:"marked",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]}};
65699
65700   // Tooltips and svg mask used to highlight certain features
65701   function uiCurtain() {
65702
65703       var surface = select(null),
65704           tooltip = select(null),
65705           darkness = select(null);
65706
65707       function curtain(selection) {
65708           surface = selection
65709               .append('svg')
65710               .attr('id', 'curtain')
65711               .style('z-index', 1000)
65712               .style('pointer-events', 'none')
65713               .style('position', 'absolute')
65714               .style('top', 0)
65715               .style('left', 0);
65716
65717           darkness = surface.append('path')
65718               .attr('x', 0)
65719               .attr('y', 0)
65720               .attr('class', 'curtain-darkness');
65721
65722           select(window).on('resize.curtain', resize);
65723
65724           tooltip = selection.append('div')
65725               .attr('class', 'tooltip')
65726               .style('z-index', 1002);
65727
65728           tooltip
65729               .append('div')
65730               .attr('class', 'tooltip-arrow');
65731
65732           tooltip
65733               .append('div')
65734               .attr('class', 'tooltip-inner');
65735
65736           resize();
65737
65738
65739           function resize() {
65740               surface
65741                   .attr('width', window.innerWidth)
65742                   .attr('height', window.innerHeight);
65743               curtain.cut(darkness.datum());
65744           }
65745       }
65746
65747
65748       /**
65749        * Reveal cuts the curtain to highlight the given box,
65750        * and shows a tooltip with instructions next to the box.
65751        *
65752        * @param  {String|ClientRect} [box]   box used to cut the curtain
65753        * @param  {String}    [text]          text for a tooltip
65754        * @param  {Object}    [options]
65755        * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
65756        * @param  {integer}   [options.duration]        transition time in milliseconds
65757        * @param  {string}    [options.buttonText]      if set, create a button with this text label
65758        * @param  {function}  [options.buttonCallback]  if set, the callback for the button
65759        * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
65760        */
65761       curtain.reveal = function(box, text, options) {
65762           if (typeof box === 'string') {
65763               box = select(box).node();
65764           }
65765           if (box && box.getBoundingClientRect) {
65766               box = copyBox(box.getBoundingClientRect());
65767           }
65768
65769           options = options || {};
65770
65771           var tooltipBox;
65772           if (options.tooltipBox) {
65773               tooltipBox = options.tooltipBox;
65774               if (typeof tooltipBox === 'string') {
65775                   tooltipBox = select(tooltipBox).node();
65776               }
65777               if (tooltipBox && tooltipBox.getBoundingClientRect) {
65778                   tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
65779               }
65780           } else {
65781               tooltipBox = box;
65782           }
65783
65784           if (tooltipBox && text) {
65785               // pseudo markdown bold text for the instruction section..
65786               var parts = text.split('**');
65787               var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
65788               if (parts[1]) {
65789                   html += '<span class="instruction">' + parts[1] + '</span>';
65790               }
65791
65792               html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
65793               html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
65794
65795               if (options.buttonText && options.buttonCallback) {
65796                   html += '<div class="button-section">' +
65797                       '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
65798               }
65799
65800               var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
65801               tooltip
65802                   .classed(classes, true)
65803                   .selectAll('.tooltip-inner')
65804                   .html(html);
65805
65806               if (options.buttonText && options.buttonCallback) {
65807                   var button = tooltip.selectAll('.button-section .button.action');
65808                   button
65809                       .on('click', function() {
65810                           event.preventDefault();
65811                           options.buttonCallback();
65812                       });
65813               }
65814
65815               var tip = copyBox(tooltip.node().getBoundingClientRect()),
65816                   w = window.innerWidth,
65817                   h = window.innerHeight,
65818                   tooltipWidth = 200,
65819                   tooltipArrow = 5,
65820                   side, pos;
65821
65822
65823               // hack: this will have bottom placement,
65824               // so need to reserve extra space for the tooltip illustration.
65825               if (options.tooltipClass === 'intro-mouse') {
65826                   tip.height += 80;
65827               }
65828
65829               // trim box dimensions to just the portion that fits in the window..
65830               if (tooltipBox.top + tooltipBox.height > h) {
65831                   tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
65832               }
65833               if (tooltipBox.left + tooltipBox.width > w) {
65834                   tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
65835               }
65836
65837               // determine tooltip placement..
65838
65839               if (tooltipBox.top + tooltipBox.height < 100) {
65840                   // tooltip below box..
65841                   side = 'bottom';
65842                   pos = [
65843                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
65844                       tooltipBox.top + tooltipBox.height
65845                   ];
65846
65847               } else if (tooltipBox.top > h - 140) {
65848                   // tooltip above box..
65849                   side = 'top';
65850                   pos = [
65851                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
65852                       tooltipBox.top - tip.height
65853                   ];
65854
65855               } else {
65856                   // tooltip to the side of the tooltipBox..
65857                   var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
65858
65859                   if (textDirection === 'rtl') {
65860                       if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
65861                           side = 'right';
65862                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
65863
65864                       } else {
65865                           side = 'left';
65866                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
65867                       }
65868
65869                   } else {
65870                       if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
65871                           side = 'left';
65872                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
65873                       }
65874                       else {
65875                           side = 'right';
65876                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
65877                       }
65878                   }
65879               }
65880
65881               if (options.duration !== 0 || !tooltip.classed(side)) {
65882                   tooltip.call(uiToggle(true));
65883               }
65884
65885               tooltip
65886                   .style('top', pos[1] + 'px')
65887                   .style('left', pos[0] + 'px')
65888                   .attr('class', classes + ' ' + side);
65889
65890
65891               // shift tooltip-inner if it is very close to the top or bottom edge
65892               // (doesn't affect the placement of the tooltip-arrow)
65893               var shiftY = 0;
65894               if (side === 'left' || side === 'right') {
65895                   if (pos[1] < 60) {
65896                       shiftY = 60 - pos[1];
65897                   }
65898                   else if (pos[1] + tip.height > h - 100) {
65899                       shiftY = h - pos[1] - tip.height - 100;
65900                   }
65901               }
65902               tooltip.selectAll('.tooltip-inner')
65903                   .style('top', shiftY + 'px');
65904
65905           } else {
65906               tooltip
65907                   .classed('in', false)
65908                   .call(uiToggle(false));
65909           }
65910
65911           curtain.cut(box, options.duration);
65912
65913           return tooltip;
65914       };
65915
65916
65917       curtain.cut = function(datum, duration) {
65918           darkness.datum(datum)
65919               .interrupt();
65920
65921           var selection;
65922           if (duration === 0) {
65923               selection = darkness;
65924           } else {
65925               selection = darkness
65926                   .transition()
65927                   .duration(duration || 600)
65928                   .ease(linear$1);
65929           }
65930
65931           selection
65932               .attr('d', function(d) {
65933                   var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
65934                       window.innerWidth + ',' + window.innerHeight + 'L' +
65935                       window.innerWidth + ',0 Z';
65936
65937                   if (!d) return string;
65938                   return string + 'M' +
65939                       d.left + ',' + d.top + 'L' +
65940                       d.left + ',' + (d.top + d.height) + 'L' +
65941                       (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
65942                       (d.left + d.width) + ',' + (d.top) + 'Z';
65943
65944               });
65945       };
65946
65947
65948       curtain.remove = function() {
65949           surface.remove();
65950           tooltip.remove();
65951           select(window).on('resize.curtain', null);
65952       };
65953
65954
65955       // ClientRects are immutable, so copy them to an object,
65956       // in case we need to trim the height/width.
65957       function copyBox(src) {
65958           return {
65959               top: src.top,
65960               right: src.right,
65961               bottom: src.bottom,
65962               left: src.left,
65963               width: src.width,
65964               height: src.height
65965           };
65966       }
65967
65968
65969       return curtain;
65970   }
65971
65972   function uiIntroWelcome(context, reveal) {
65973       var dispatch$1 = dispatch('done');
65974       var listener = clickListener();
65975
65976       var chapter = {
65977           title: 'intro.welcome.title'
65978       };
65979
65980
65981       function welcome() {
65982           context.map().centerZoom([-85.63591, 41.94285], 19);
65983           reveal('.intro-nav-wrap .chapter-welcome',
65984               t('intro.welcome.welcome'),
65985               { buttonText: t('intro.ok'), buttonCallback: practice }
65986           );
65987       }
65988
65989       function practice() {
65990           reveal('.intro-nav-wrap .chapter-welcome',
65991               t('intro.welcome.practice'),
65992               { buttonText: t('intro.ok'), buttonCallback: words }
65993           );
65994       }
65995
65996       function words() {
65997           reveal('.intro-nav-wrap .chapter-welcome',
65998               t('intro.welcome.words'),
65999               { buttonText: t('intro.ok'), buttonCallback: mouse }
66000           );
66001       }
66002
66003
66004       function mouse() {
66005           reveal('.intro-nav-wrap .chapter-welcome',
66006               t('intro.welcome.mouse'),
66007               { buttonText: t('intro.ok'), buttonCallback: leftClick }
66008           );
66009       }
66010
66011
66012       function leftClick() {
66013           var counter = 0;
66014           var times = 5;
66015
66016           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
66017               t('intro.welcome.leftclick', { num: times }),
66018               { tooltipClass: 'intro-mouse' }
66019           );
66020
66021           tooltip.selectAll('.tooltip-inner')
66022               .insert('svg', 'span')
66023               .attr('class', 'tooltip-illustration')
66024               .append('use')
66025               .attr('xlink:href', '#iD-walkthrough-mouse');
66026
66027           tooltip
66028               .append('div')
66029               .attr('class', 'counter');
66030
66031           tooltip.call(listener);
66032
66033           listener.on('click', function(which) {
66034               if (which === 'left') {
66035                   select('.curtain-tooltip.intro-mouse .counter')
66036                       .text(String(++counter));
66037
66038                   if (counter === times) {
66039                       window.setTimeout(function() { continueTo(rightClick); }, 1000);
66040                   }
66041               }
66042           });
66043
66044           function continueTo(nextStep) {
66045               listener.on('click', null);
66046               tooltip.call(listener.off);
66047               tooltip.select('.counter').remove();
66048               nextStep();
66049           }
66050       }
66051
66052
66053       function rightClick() {
66054           var counter = 0;
66055           var times = 5;
66056
66057           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
66058               t('intro.welcome.rightclick', { num: times }),
66059               { tooltipClass: 'intro-mouse' }
66060           );
66061
66062           tooltip.selectAll('.tooltip-inner')
66063               .insert('svg', 'span')
66064               .attr('class', 'tooltip-illustration')
66065               .append('use')
66066               .attr('xlink:href', '#iD-walkthrough-mouse');
66067
66068           tooltip
66069               .append('div')
66070               .attr('class', 'counter');
66071
66072           tooltip.call(listener);
66073
66074           listener.on('click', function(which) {
66075               if (which === 'right') {
66076                   select('.curtain-tooltip.intro-mouse .counter')
66077                       .text(String(++counter));
66078
66079                   if (counter === times) {
66080                       window.setTimeout(function() { continueTo(chapters); }, 1000);
66081                   }
66082               }
66083           });
66084
66085           function continueTo(nextStep) {
66086               listener.on('click', null);
66087               tooltip.call(listener.off);
66088               tooltip.select('.counter').remove();
66089               nextStep();
66090           }
66091       }
66092
66093
66094       function chapters() {
66095           dispatch$1.call('done');
66096           reveal('.intro-nav-wrap .chapter-navigation',
66097               t('intro.welcome.chapters', { next: t('intro.navigation.title') })
66098           );
66099       }
66100
66101
66102       chapter.enter = function() {
66103           welcome();
66104       };
66105
66106
66107       chapter.exit = function() {
66108           listener.off();
66109           select('.curtain-tooltip.intro-mouse')
66110               .selectAll('.counter')
66111               .remove();
66112       };
66113
66114
66115       chapter.restart = function() {
66116           chapter.exit();
66117           chapter.enter();
66118       };
66119
66120
66121       return utilRebind(chapter, dispatch$1, 'on');
66122   }
66123
66124
66125
66126   function clickListener() {
66127       var dispatch$1 = dispatch('click');
66128       var minTime = 120;
66129       var tooltip = select(null);
66130       var down = {};
66131
66132       // `down` keeps track of which buttons/keys are down.
66133       // Setting a property in `down` happens immediately.
66134       // Unsetting a property in `down` is delayed because
66135       //   on Windows a contextmenu event happens after keyup/mouseup
66136
66137       function keydown() {
66138           if (event.keyCode === 93)  {   // context menu
66139               event.preventDefault();
66140               event.stopPropagation();
66141               down.menu = event.timeStamp;
66142               tooltip.classed('rightclick', true);
66143           }
66144       }
66145
66146
66147       function keyup() {
66148           if (event.keyCode === 93)  {   // context menu
66149               event.preventDefault();
66150               event.stopPropagation();
66151               var endTime = event.timeStamp;
66152               var startTime = down.menu || endTime;
66153               var delay = (endTime - startTime < minTime) ? minTime : 0;
66154
66155               window.setTimeout(function() {
66156                   tooltip.classed('rightclick', false);
66157                   down.menu = undefined;  // delayed, for Windows
66158               }, delay);
66159
66160               dispatch$1.call('click', this, 'right');
66161           }
66162       }
66163
66164
66165       function mousedown() {
66166           var button = event.button;
66167           if (button === 0 && !event.ctrlKey) {
66168               tooltip.classed('leftclick', true);
66169           } else if (button === 2) {
66170               tooltip.classed('rightclick', true);
66171           }
66172           down[button] = event.timeStamp;
66173       }
66174
66175
66176       function mouseup() {
66177           var button = event.button;
66178           var endTime = event.timeStamp;
66179           var startTime = down[button] || endTime;
66180           var delay = (endTime - startTime < minTime) ? minTime : 0;
66181
66182           if (button === 0 && !event.ctrlKey) {
66183               window.setTimeout(function() {
66184                   tooltip.classed('leftclick', false);
66185                   down[button] = undefined;  // delayed, for Windows
66186               }, delay);
66187
66188               dispatch$1.call('click', this, 'left');
66189
66190           } else if (button === 2) {
66191               window.setTimeout(function() {
66192                   tooltip.classed('rightclick', false);
66193                   down[button] = undefined;  // delayed, for Windows
66194               }, delay);
66195
66196               dispatch$1.call('click', this, 'right');
66197
66198           } else {
66199               window.setTimeout(function() {
66200                   down[button] = undefined;  // delayed, for Windows
66201               }, delay);
66202           }
66203       }
66204
66205
66206       function contextmenu() {
66207           event.preventDefault();
66208           event.stopPropagation();
66209           if (!down[2] && !down.menu) {
66210               tooltip.classed('rightclick', true);
66211               window.setTimeout(function() {
66212                   tooltip.classed('rightclick', false);
66213               }, minTime);
66214               dispatch$1.call('click', this, 'right');
66215           }
66216       }
66217
66218
66219       var behavior = function(selection) {
66220           tooltip = selection;
66221           down = {};
66222
66223           select(window)
66224               .on('keydown.intro', keydown)
66225               .on('keyup.intro', keyup)
66226               .on('mousedown.intro', mousedown)
66227               .on('mouseup.intro', mouseup)
66228               .on('contextmenu.intro', contextmenu);
66229       };
66230
66231
66232       behavior.off = function() {
66233           select(window)
66234               .on('keydown.intro', null)
66235               .on('keyup.intro', null)
66236               .on('mousedown.intro', null)
66237               .on('mouseup.intro', null)
66238               .on('contextmenu.intro', null);
66239
66240           tooltip
66241               .classed('leftclick', false)
66242               .classed('rightclick', false);
66243       };
66244
66245       return utilRebind(behavior, dispatch$1, 'on');
66246   }
66247
66248   function uiIntroNavigation(context, reveal) {
66249       var dispatch$1 = dispatch('done');
66250       var timeouts = [];
66251       var hallId = 'n2061';
66252       var townHall = [-85.63591, 41.94285];
66253       var springStreetId = 'w397';
66254       var springStreetEndId = 'n1834';
66255       var springStreet = [-85.63582, 41.94255];
66256       var onewayField = context.presets().field('oneway');
66257       var maxspeedField = context.presets().field('maxspeed');
66258
66259
66260       var chapter = {
66261           title: 'intro.navigation.title'
66262       };
66263
66264
66265       function timeout(f, t) {
66266           timeouts.push(window.setTimeout(f, t));
66267       }
66268
66269
66270       function eventCancel() {
66271           event.stopPropagation();
66272           event.preventDefault();
66273       }
66274
66275
66276       function isTownHallSelected() {
66277           var ids = context.selectedIDs();
66278           return ids.length === 1 && ids[0] === hallId;
66279       }
66280
66281
66282       function dragMap() {
66283           context.enter(modeBrowse(context));
66284           context.history().reset('initial');
66285
66286           var msec = transitionTime(townHall, context.map().center());
66287           if (msec) { reveal(null, null, { duration: 0 }); }
66288           context.map().centerZoomEase(townHall, 19, msec);
66289
66290           timeout(function() {
66291               var centerStart = context.map().center();
66292
66293               reveal('#surface', t('intro.navigation.drag'));
66294               context.map().on('drawn.intro', function() {
66295                   reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
66296               });
66297
66298               context.map().on('move.intro', function() {
66299                   var centerNow = context.map().center();
66300                   if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
66301                       context.map().on('move.intro', null);
66302                       timeout(function() { continueTo(zoomMap); }, 3000);
66303                   }
66304               });
66305
66306           }, msec + 100);
66307
66308           function continueTo(nextStep) {
66309               context.map().on('move.intro drawn.intro', null);
66310               nextStep();
66311           }
66312       }
66313
66314
66315       function zoomMap() {
66316           var zoomStart = context.map().zoom();
66317
66318           reveal('#surface',
66319               t('intro.navigation.zoom', {
66320                   plus: icon('#iD-icon-plus', 'pre-text'),
66321                   minus: icon('#iD-icon-minus', 'pre-text')
66322               })
66323           );
66324
66325           context.map().on('drawn.intro', function() {
66326               reveal('#surface',
66327                   t('intro.navigation.zoom', {
66328                       plus: icon('#iD-icon-plus', 'pre-text'),
66329                       minus: icon('#iD-icon-minus', 'pre-text')
66330                   }), { duration: 0 }
66331               );
66332           });
66333
66334           context.map().on('move.intro', function() {
66335               if (context.map().zoom() !== zoomStart) {
66336                   context.map().on('move.intro', null);
66337                   timeout(function() { continueTo(features); }, 3000);
66338               }
66339           });
66340
66341           function continueTo(nextStep) {
66342               context.map().on('move.intro drawn.intro', null);
66343               nextStep();
66344           }
66345       }
66346
66347
66348       function features() {
66349           var onClick = function() { continueTo(pointsLinesAreas); };
66350
66351           reveal('#surface', t('intro.navigation.features'),
66352               { buttonText: t('intro.ok'), buttonCallback: onClick }
66353           );
66354
66355           context.map().on('drawn.intro', function() {
66356               reveal('#surface', t('intro.navigation.features'),
66357                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
66358               );
66359           });
66360
66361           function continueTo(nextStep) {
66362               context.map().on('drawn.intro', null);
66363               nextStep();
66364           }
66365       }
66366
66367       function pointsLinesAreas() {
66368           var onClick = function() { continueTo(nodesWays); };
66369
66370           reveal('#surface', t('intro.navigation.points_lines_areas'),
66371               { buttonText: t('intro.ok'), buttonCallback: onClick }
66372           );
66373
66374           context.map().on('drawn.intro', function() {
66375               reveal('#surface', t('intro.navigation.points_lines_areas'),
66376                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
66377               );
66378           });
66379
66380           function continueTo(nextStep) {
66381               context.map().on('drawn.intro', null);
66382               nextStep();
66383           }
66384       }
66385
66386       function nodesWays() {
66387           var onClick = function() { continueTo(clickTownHall); };
66388
66389           reveal('#surface', t('intro.navigation.nodes_ways'),
66390               { buttonText: t('intro.ok'), buttonCallback: onClick }
66391           );
66392
66393           context.map().on('drawn.intro', function() {
66394               reveal('#surface', t('intro.navigation.nodes_ways'),
66395                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
66396               );
66397           });
66398
66399           function continueTo(nextStep) {
66400               context.map().on('drawn.intro', null);
66401               nextStep();
66402           }
66403       }
66404
66405       function clickTownHall() {
66406           context.enter(modeBrowse(context));
66407           context.history().reset('initial');
66408
66409           var entity = context.hasEntity(hallId);
66410           if (!entity) return;
66411           reveal(null, null, { duration: 0 });
66412           context.map().centerZoomEase(entity.loc, 19, 500);
66413
66414           timeout(function() {
66415               var entity = context.hasEntity(hallId);
66416               if (!entity) return;
66417               var box = pointBox(entity.loc, context);
66418               reveal(box, t('intro.navigation.click_townhall'));
66419
66420               context.map().on('move.intro drawn.intro', function() {
66421                   var entity = context.hasEntity(hallId);
66422                   if (!entity) return;
66423                   var box = pointBox(entity.loc, context);
66424                   reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
66425               });
66426
66427               context.on('enter.intro', function() {
66428                   if (isTownHallSelected()) continueTo(selectedTownHall);
66429               });
66430
66431           }, 550);  // after centerZoomEase
66432
66433           context.history().on('change.intro', function() {
66434               if (!context.hasEntity(hallId)) {
66435                   continueTo(clickTownHall);
66436               }
66437           });
66438
66439           function continueTo(nextStep) {
66440               context.on('enter.intro', null);
66441               context.map().on('move.intro drawn.intro', null);
66442               context.history().on('change.intro', null);
66443               nextStep();
66444           }
66445       }
66446
66447
66448       function selectedTownHall() {
66449           if (!isTownHallSelected()) return clickTownHall();
66450
66451           var entity = context.hasEntity(hallId);
66452           if (!entity) return clickTownHall();
66453
66454           var box = pointBox(entity.loc, context);
66455           var onClick = function() { continueTo(editorTownHall); };
66456
66457           reveal(box, t('intro.navigation.selected_townhall'),
66458               { buttonText: t('intro.ok'), buttonCallback: onClick }
66459           );
66460
66461           context.map().on('move.intro drawn.intro', function() {
66462               var entity = context.hasEntity(hallId);
66463               if (!entity) return;
66464               var box = pointBox(entity.loc, context);
66465               reveal(box, t('intro.navigation.selected_townhall'),
66466                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
66467               );
66468           });
66469
66470           context.history().on('change.intro', function() {
66471               if (!context.hasEntity(hallId)) {
66472                   continueTo(clickTownHall);
66473               }
66474           });
66475
66476           function continueTo(nextStep) {
66477               context.map().on('move.intro drawn.intro', null);
66478               context.history().on('change.intro', null);
66479               nextStep();
66480           }
66481       }
66482
66483
66484       function editorTownHall() {
66485           if (!isTownHallSelected()) return clickTownHall();
66486
66487           // disallow scrolling
66488           select('.inspector-wrap').on('wheel.intro', eventCancel);
66489
66490           var onClick = function() { continueTo(presetTownHall); };
66491
66492           reveal('.entity-editor-pane',
66493               t('intro.navigation.editor_townhall'),
66494               { buttonText: t('intro.ok'), buttonCallback: onClick }
66495           );
66496
66497           context.on('exit.intro', function() {
66498               continueTo(clickTownHall);
66499           });
66500
66501           context.history().on('change.intro', function() {
66502               if (!context.hasEntity(hallId)) {
66503                   continueTo(clickTownHall);
66504               }
66505           });
66506
66507           function continueTo(nextStep) {
66508               context.on('exit.intro', null);
66509               context.history().on('change.intro', null);
66510               select('.inspector-wrap').on('wheel.intro', null);
66511               nextStep();
66512           }
66513       }
66514
66515
66516       function presetTownHall() {
66517           if (!isTownHallSelected()) return clickTownHall();
66518
66519           // reset pane, in case user happened to change it..
66520           select('.inspector-wrap .panewrap').style('right', '0%');
66521           // disallow scrolling
66522           select('.inspector-wrap').on('wheel.intro', eventCancel);
66523
66524           // preset match, in case the user happened to change it.
66525           var entity = context.entity(context.selectedIDs()[0]);
66526           var preset = context.presets().match(entity, context.graph());
66527
66528           var onClick = function() { continueTo(fieldsTownHall); };
66529
66530           context.on('exit.intro', function() {
66531               continueTo(clickTownHall);
66532           });
66533
66534           context.history().on('change.intro', function() {
66535               if (!context.hasEntity(hallId)) {
66536                   continueTo(clickTownHall);
66537               }
66538           });
66539
66540           reveal('.inspector-body .preset-list-item.inspector-inner',
66541               t('intro.navigation.preset_townhall', { preset: preset.name() }),
66542               { buttonText: t('intro.ok'), buttonCallback: onClick }
66543           );
66544
66545           function continueTo(nextStep) {
66546               context.on('exit.intro', null);
66547               context.history().on('change.intro', null);
66548               select('.inspector-wrap').on('wheel.intro', null);
66549               nextStep();
66550           }
66551       }
66552
66553
66554       function fieldsTownHall() {
66555           if (!isTownHallSelected()) return clickTownHall();
66556
66557           // reset pane, in case user happened to change it..
66558           select('.inspector-wrap .panewrap').style('right', '0%');
66559           // disallow scrolling
66560           select('.inspector-wrap').on('wheel.intro', eventCancel);
66561
66562           var onClick = function() { continueTo(closeTownHall); };
66563
66564           reveal('.inspector-body .preset-editor',
66565               t('intro.navigation.fields_townhall'),
66566               { buttonText: t('intro.ok'), buttonCallback: onClick }
66567           );
66568
66569           context.on('exit.intro', function() {
66570               continueTo(clickTownHall);
66571           });
66572
66573           context.history().on('change.intro', function() {
66574               if (!context.hasEntity(hallId)) {
66575                   continueTo(clickTownHall);
66576               }
66577           });
66578
66579           function continueTo(nextStep) {
66580               context.on('exit.intro', null);
66581               context.history().on('change.intro', null);
66582               select('.inspector-wrap').on('wheel.intro', null);
66583               nextStep();
66584           }
66585       }
66586
66587
66588       function closeTownHall() {
66589           if (!isTownHallSelected()) return clickTownHall();
66590
66591           var selector = '.entity-editor-pane button.preset-close svg use';
66592           var href = select(selector).attr('href') || '#iD-icon-close';
66593
66594           reveal('.entity-editor-pane',
66595               t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
66596           );
66597
66598           context.on('exit.intro', function() {
66599               continueTo(searchStreet);
66600           });
66601
66602           context.history().on('change.intro', function() {
66603               // update the close icon in the tooltip if the user edits something.
66604               var selector = '.entity-editor-pane button.preset-close svg use';
66605               var href = select(selector).attr('href') || '#iD-icon-close';
66606
66607               reveal('.entity-editor-pane',
66608                   t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
66609                   { duration: 0 }
66610               );
66611           });
66612
66613           function continueTo(nextStep) {
66614               context.on('exit.intro', null);
66615               context.history().on('change.intro', null);
66616               nextStep();
66617           }
66618       }
66619
66620
66621       function searchStreet() {
66622           context.enter(modeBrowse(context));
66623           context.history().reset('initial');  // ensure spring street exists
66624
66625           var msec = transitionTime(springStreet, context.map().center());
66626           if (msec) { reveal(null, null, { duration: 0 }); }
66627           context.map().centerZoomEase(springStreet, 19, msec);  // ..and user can see it
66628
66629           timeout(function() {
66630               reveal('.search-header input',
66631                   t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
66632               );
66633
66634               select('.search-header input')
66635                   .on('keyup.intro', checkSearchResult);
66636           }, msec + 100);
66637       }
66638
66639
66640       function checkSearchResult() {
66641           var first = select('.feature-list-item:nth-child(0n+2)');  // skip "No Results" item
66642           var firstName = first.select('.entity-name');
66643           var name = t('intro.graph.name.spring-street');
66644
66645           if (!firstName.empty() && firstName.text() === name) {
66646               reveal(first.node(),
66647                   t('intro.navigation.choose_street', { name: name }),
66648                   { duration: 300 }
66649               );
66650
66651               context.on('exit.intro', function() {
66652                   continueTo(selectedStreet);
66653               });
66654
66655               select('.search-header input')
66656                   .on('keydown.intro', eventCancel, true)
66657                   .on('keyup.intro', null);
66658           }
66659
66660           function continueTo(nextStep) {
66661               context.on('exit.intro', null);
66662               select('.search-header input')
66663                   .on('keydown.intro', null)
66664                   .on('keyup.intro', null);
66665               nextStep();
66666           }
66667       }
66668
66669
66670       function selectedStreet() {
66671           if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
66672               return searchStreet();
66673           }
66674
66675           var onClick = function() { continueTo(editorStreet); };
66676           var entity = context.entity(springStreetEndId);
66677           var box = pointBox(entity.loc, context);
66678           box.height = 500;
66679
66680           reveal(box,
66681               t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
66682               { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
66683           );
66684
66685           timeout(function() {
66686               context.map().on('move.intro drawn.intro', function() {
66687                   var entity = context.hasEntity(springStreetEndId);
66688                   if (!entity) return;
66689                   var box = pointBox(entity.loc, context);
66690                   box.height = 500;
66691                   reveal(box,
66692                       t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
66693                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
66694                   );
66695               });
66696           }, 600);  // after reveal.
66697
66698           context.on('enter.intro', function(mode) {
66699               if (!context.hasEntity(springStreetId)) {
66700                   return continueTo(searchStreet);
66701               }
66702               var ids = context.selectedIDs();
66703               if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
66704                   // keep Spring Street selected..
66705                   context.enter(modeSelect(context, [springStreetId]));
66706               }
66707           });
66708
66709           context.history().on('change.intro', function() {
66710               if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
66711                   timeout(function() {
66712                       continueTo(searchStreet);
66713                   }, 300);  // after any transition (e.g. if user deleted intersection)
66714               }
66715           });
66716
66717           function continueTo(nextStep) {
66718               context.map().on('move.intro drawn.intro', null);
66719               context.on('enter.intro', null);
66720               context.history().on('change.intro', null);
66721               nextStep();
66722           }
66723       }
66724
66725
66726       function editorStreet() {
66727           var selector = '.entity-editor-pane button.preset-close svg use';
66728           var href = select(selector).attr('href') || '#iD-icon-close';
66729
66730           reveal('.entity-editor-pane',
66731               t('intro.navigation.editor_street', {
66732                   button: icon(href, 'pre-text'),
66733                   field1: onewayField.label(),
66734                   field2: maxspeedField.label()
66735               })
66736           );
66737
66738           context.on('exit.intro', function() {
66739               continueTo(play);
66740           });
66741
66742           context.history().on('change.intro', function() {
66743               // update the close icon in the tooltip if the user edits something.
66744               var selector = '.entity-editor-pane button.preset-close svg use';
66745               var href = select(selector).attr('href') || '#iD-icon-close';
66746
66747               reveal('.entity-editor-pane',
66748                   t('intro.navigation.editor_street', {
66749                       button: icon(href, 'pre-text'),
66750                       field1: onewayField.label().toLowerCase(),
66751                       field2: maxspeedField.label().toLowerCase()
66752                   }), { duration: 0 }
66753               );
66754           });
66755
66756           function continueTo(nextStep) {
66757               context.on('exit.intro', null);
66758               context.history().on('change.intro', null);
66759               nextStep();
66760           }
66761       }
66762
66763
66764       function play() {
66765           dispatch$1.call('done');
66766           reveal('#id-container',
66767               t('intro.navigation.play', { next: t('intro.points.title') }), {
66768                   tooltipBox: '.intro-nav-wrap .chapter-point',
66769                   buttonText: t('intro.ok'),
66770                   buttonCallback: function() { reveal('#id-container'); }
66771               }
66772           );
66773       }
66774
66775
66776       chapter.enter = function() {
66777           dragMap();
66778       };
66779
66780
66781       chapter.exit = function() {
66782           timeouts.forEach(window.clearTimeout);
66783           context.on('enter.intro exit.intro', null);
66784           context.map().on('move.intro drawn.intro', null);
66785           context.history().on('change.intro', null);
66786           select('.inspector-wrap').on('wheel.intro', null);
66787           select('.search-header input').on('keydown.intro keyup.intro', null);
66788       };
66789
66790
66791       chapter.restart = function() {
66792           chapter.exit();
66793           chapter.enter();
66794       };
66795
66796
66797       return utilRebind(chapter, dispatch$1, 'on');
66798   }
66799
66800   function uiIntroPoint(context, reveal) {
66801       var dispatch$1 = dispatch('done');
66802       var timeouts = [];
66803       var intersection = [-85.63279, 41.94394];
66804       var building = [-85.632422, 41.944045];
66805       var cafePreset = context.presets().item('amenity/cafe');
66806       var _pointID = null;
66807
66808
66809       var chapter = {
66810           title: 'intro.points.title'
66811       };
66812
66813
66814       function timeout(f, t) {
66815           timeouts.push(window.setTimeout(f, t));
66816       }
66817
66818
66819       function revealEditMenu(loc, text, options) {
66820           var rect = context.surfaceRect();
66821           var point = context.curtainProjection(loc);
66822           var pad = 40;
66823           var width = 250 + (2 * pad);
66824           var height = 250;
66825           var startX = rect.left + point[0];
66826           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
66827           var box = {
66828               left: left,
66829               top: point[1] + rect.top - 60,
66830               width: width,
66831               height: height
66832           };
66833           reveal(box, text, options);
66834       }
66835
66836
66837       function eventCancel() {
66838           event.stopPropagation();
66839           event.preventDefault();
66840       }
66841
66842
66843       function addPoint() {
66844           context.enter(modeBrowse(context));
66845           context.history().reset('initial');
66846
66847           var msec = transitionTime(intersection, context.map().center());
66848           if (msec) { reveal(null, null, { duration: 0 }); }
66849           context.map().centerZoomEase(intersection, 19, msec);
66850
66851           timeout(function() {
66852               var tooltip = reveal('button.add-point',
66853                   t('intro.points.add_point', { button: icon('#iD-icon-point', 'pre-text') }));
66854
66855               _pointID = null;
66856
66857               tooltip.selectAll('.tooltip-inner')
66858                   .insert('svg', 'span')
66859                   .attr('class', 'tooltip-illustration')
66860                   .append('use')
66861                   .attr('xlink:href', '#iD-graphic-points');
66862
66863               context.on('enter.intro', function(mode) {
66864                   if (mode.id !== 'add-point') return;
66865                   continueTo(placePoint);
66866               });
66867           }, msec + 100);
66868
66869           function continueTo(nextStep) {
66870               context.on('enter.intro', null);
66871               nextStep();
66872           }
66873       }
66874
66875
66876       function placePoint() {
66877           if (context.mode().id !== 'add-point') {
66878               return chapter.restart();
66879           }
66880
66881           var pointBox = pad$1(building, 150, context);
66882           reveal(pointBox, t('intro.points.place_point'));
66883
66884           context.map().on('move.intro drawn.intro', function() {
66885               pointBox = pad$1(building, 150, context);
66886               reveal(pointBox, t('intro.points.place_point'), { duration: 0 });
66887           });
66888
66889           context.on('enter.intro', function(mode) {
66890               if (mode.id !== 'select') return chapter.restart();
66891               _pointID = context.mode().selectedIDs()[0];
66892               continueTo(searchPreset);
66893           });
66894
66895           function continueTo(nextStep) {
66896               context.map().on('move.intro drawn.intro', null);
66897               context.on('enter.intro', null);
66898               nextStep();
66899           }
66900       }
66901
66902
66903       function searchPreset() {
66904           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
66905               return addPoint();
66906           }
66907
66908           // disallow scrolling
66909           select('.inspector-wrap').on('wheel.intro', eventCancel);
66910
66911           select('.preset-search-input')
66912               .on('keydown.intro', null)
66913               .on('keyup.intro', checkPresetSearch);
66914
66915           reveal('.preset-search-input',
66916               t('intro.points.search_cafe', { preset: cafePreset.name() })
66917           );
66918
66919           context.on('enter.intro', function(mode) {
66920               if (!_pointID || !context.hasEntity(_pointID)) {
66921                   return continueTo(addPoint);
66922               }
66923
66924               var ids = context.selectedIDs();
66925               if (mode.id !== 'select' || !ids.length || ids[0] !== _pointID) {
66926                   // keep the user's point selected..
66927                   context.enter(modeSelect(context, [_pointID]));
66928
66929                   // disallow scrolling
66930                   select('.inspector-wrap').on('wheel.intro', eventCancel);
66931
66932                   select('.preset-search-input')
66933                       .on('keydown.intro', null)
66934                       .on('keyup.intro', checkPresetSearch);
66935
66936                   reveal('.preset-search-input',
66937                       t('intro.points.search_cafe', { preset: cafePreset.name() })
66938                   );
66939
66940                   context.history().on('change.intro', null);
66941               }
66942           });
66943
66944
66945           function checkPresetSearch() {
66946               var first = select('.preset-list-item:first-child');
66947
66948               if (first.classed('preset-amenity-cafe')) {
66949                   select('.preset-search-input')
66950                       .on('keydown.intro', eventCancel, true)
66951                       .on('keyup.intro', null);
66952
66953                   reveal(first.select('.preset-list-button').node(),
66954                       t('intro.points.choose_cafe', { preset: cafePreset.name() }),
66955                       { duration: 300 }
66956                   );
66957
66958                   context.history().on('change.intro', function() {
66959                       continueTo(aboutFeatureEditor);
66960                   });
66961               }
66962           }
66963
66964           function continueTo(nextStep) {
66965               context.on('enter.intro', null);
66966               context.history().on('change.intro', null);
66967               select('.inspector-wrap').on('wheel.intro', null);
66968               select('.preset-search-input').on('keydown.intro keyup.intro', null);
66969               nextStep();
66970           }
66971       }
66972
66973
66974       function aboutFeatureEditor() {
66975           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
66976               return addPoint();
66977           }
66978
66979           timeout(function() {
66980               reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
66981                   tooltipClass: 'intro-points-describe',
66982                   buttonText: t('intro.ok'),
66983                   buttonCallback: function() { continueTo(addName); }
66984               });
66985           }, 400);
66986
66987           context.on('exit.intro', function() {
66988               // if user leaves select mode here, just continue with the tutorial.
66989               continueTo(reselectPoint);
66990           });
66991
66992           function continueTo(nextStep) {
66993               context.on('exit.intro', null);
66994               nextStep();
66995           }
66996       }
66997
66998
66999       function addName() {
67000           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
67001               return addPoint();
67002           }
67003
67004           // reset pane, in case user happened to change it..
67005           select('.inspector-wrap .panewrap').style('right', '0%');
67006
67007           timeout(function() {
67008               // It's possible for the user to add a name in a previous step..
67009               // If so, don't tell them to add the name in this step.
67010               // Give them an OK button instead.
67011               var entity = context.entity(_pointID);
67012               if (entity.tags.name) {
67013                   var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
67014                       tooltipClass: 'intro-points-describe',
67015                       buttonText: t('intro.ok'),
67016                       buttonCallback: function() { continueTo(addCloseEditor); }
67017                   });
67018                   tooltip.select('.instruction').style('display', 'none');
67019
67020               } else {
67021                   reveal('.entity-editor-pane', t('intro.points.add_name'),
67022                       { tooltipClass: 'intro-points-describe' }
67023                   );
67024               }
67025           }, 400);
67026
67027           context.history().on('change.intro', function() {
67028               continueTo(addCloseEditor);
67029           });
67030
67031           context.on('exit.intro', function() {
67032               // if user leaves select mode here, just continue with the tutorial.
67033               continueTo(reselectPoint);
67034           });
67035
67036           function continueTo(nextStep) {
67037               context.on('exit.intro', null);
67038               context.history().on('change.intro', null);
67039               nextStep();
67040           }
67041       }
67042
67043
67044       function addCloseEditor() {
67045           // reset pane, in case user happened to change it..
67046           select('.inspector-wrap .panewrap').style('right', '0%');
67047
67048           var selector = '.entity-editor-pane button.preset-close svg use';
67049           var href = select(selector).attr('href') || '#iD-icon-close';
67050
67051           context.on('exit.intro', function() {
67052               continueTo(reselectPoint);
67053           });
67054
67055           reveal('.entity-editor-pane',
67056               t('intro.points.add_close', { button: icon(href, 'pre-text') })
67057           );
67058
67059           function continueTo(nextStep) {
67060               context.on('exit.intro', null);
67061               nextStep();
67062           }
67063       }
67064
67065
67066       function reselectPoint() {
67067           if (!_pointID) return chapter.restart();
67068           var entity = context.hasEntity(_pointID);
67069           if (!entity) return chapter.restart();
67070
67071           // make sure it's still a cafe, in case user somehow changed it..
67072           var oldPreset = context.presets().match(entity, context.graph());
67073           context.replace(actionChangePreset(_pointID, oldPreset, cafePreset));
67074
67075           context.enter(modeBrowse(context));
67076
67077           var msec = transitionTime(entity.loc, context.map().center());
67078           if (msec) { reveal(null, null, { duration: 0 }); }
67079           context.map().centerEase(entity.loc, msec);
67080
67081           timeout(function() {
67082               var box = pointBox(entity.loc, context);
67083               reveal(box, t('intro.points.reselect'), { duration: 600 });
67084
67085               timeout(function() {
67086                   context.map().on('move.intro drawn.intro', function() {
67087                       var entity = context.hasEntity(_pointID);
67088                       if (!entity) return chapter.restart();
67089                       var box = pointBox(entity.loc, context);
67090                       reveal(box, t('intro.points.reselect'), { duration: 0 });
67091                   });
67092               }, 600); // after reveal..
67093
67094               context.on('enter.intro', function(mode) {
67095                   if (mode.id !== 'select') return;
67096                   continueTo(updatePoint);
67097               });
67098
67099           }, msec + 100);
67100
67101           function continueTo(nextStep) {
67102               context.map().on('move.intro drawn.intro', null);
67103               context.on('enter.intro', null);
67104               nextStep();
67105           }
67106       }
67107
67108
67109       function updatePoint() {
67110           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
67111               return continueTo(reselectPoint);
67112           }
67113
67114           // reset pane, in case user happened to untag the point..
67115           select('.inspector-wrap .panewrap').style('right', '0%');
67116
67117           context.on('exit.intro', function() {
67118               continueTo(reselectPoint);
67119           });
67120
67121           context.history().on('change.intro', function() {
67122               continueTo(updateCloseEditor);
67123           });
67124
67125           timeout(function() {
67126               reveal('.entity-editor-pane', t('intro.points.update'),
67127                   { tooltipClass: 'intro-points-describe' }
67128               );
67129           }, 400);
67130
67131           function continueTo(nextStep) {
67132               context.on('exit.intro', null);
67133               context.history().on('change.intro', null);
67134               nextStep();
67135           }
67136       }
67137
67138
67139       function updateCloseEditor() {
67140           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
67141               return continueTo(reselectPoint);
67142           }
67143
67144           // reset pane, in case user happened to change it..
67145           select('.inspector-wrap .panewrap').style('right', '0%');
67146
67147           context.on('exit.intro', function() {
67148               continueTo(rightClickPoint);
67149           });
67150
67151           timeout(function() {
67152               reveal('.entity-editor-pane',
67153                   t('intro.points.update_close', { button: icon('#iD-icon-apply', 'pre-text') })
67154               );
67155           }, 500);
67156
67157           function continueTo(nextStep) {
67158               context.on('exit.intro', null);
67159               nextStep();
67160           }
67161       }
67162
67163
67164       function rightClickPoint() {
67165           if (!_pointID) return chapter.restart();
67166           var entity = context.hasEntity(_pointID);
67167           if (!entity) return chapter.restart();
67168
67169           context.enter(modeBrowse(context));
67170
67171           var box = pointBox(entity.loc, context);
67172           reveal(box, t('intro.points.rightclick'), { duration: 600 });
67173
67174           timeout(function() {
67175               context.map().on('move.intro drawn.intro', function() {
67176                   var entity = context.hasEntity(_pointID);
67177                   if (!entity) return chapter.restart();
67178                   var box = pointBox(entity.loc, context);
67179                   reveal(box, t('intro.points.rightclick'), { duration: 0 });
67180               });
67181           }, 600); // after reveal
67182
67183           context.on('enter.intro', function(mode) {
67184               if (mode.id !== 'select') return;
67185               var ids = context.selectedIDs();
67186               if (ids.length !== 1 || ids[0] !== _pointID) return;
67187
67188               timeout(function() {
67189                   var node = selectMenuItem('delete').node();
67190                   if (!node) return;
67191                   continueTo(enterDelete);
67192               }, 300);  // after menu visible
67193           });
67194
67195           function continueTo(nextStep) {
67196               context.on('enter.intro', null);
67197               context.map().on('move.intro drawn.intro', null);
67198               nextStep();
67199           }
67200       }
67201
67202
67203       function enterDelete() {
67204           if (!_pointID) return chapter.restart();
67205           var entity = context.hasEntity(_pointID);
67206           if (!entity) return chapter.restart();
67207
67208           var node = selectMenuItem('delete').node();
67209           if (!node) { return continueTo(rightClickPoint); }
67210
67211           revealEditMenu(entity.loc,
67212               t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') })
67213           );
67214
67215           timeout(function() {
67216               context.map().on('move.intro drawn.intro', function() {
67217                   revealEditMenu(entity.loc,
67218                       t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') }),
67219                       { duration: 0}
67220                   );
67221               });
67222           }, 300); // after menu visible
67223
67224           context.on('exit.intro', function() {
67225               if (!_pointID) return chapter.restart();
67226               var entity = context.hasEntity(_pointID);
67227               if (entity) return continueTo(rightClickPoint);  // point still exists
67228           });
67229
67230           context.history().on('change.intro', function(changed) {
67231               if (changed.deleted().length) {
67232                   continueTo(undo);
67233               }
67234           });
67235
67236           function continueTo(nextStep) {
67237               context.map().on('move.intro drawn.intro', null);
67238               context.history().on('change.intro', null);
67239               context.on('exit.intro', null);
67240               nextStep();
67241           }
67242       }
67243
67244
67245       function undo() {
67246           context.history().on('change.intro', function() {
67247               continueTo(play);
67248           });
67249
67250           var iconName = '#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
67251           reveal('#bar button.undo-button',
67252               t('intro.points.undo', { button: icon(iconName, 'pre-text') })
67253           );
67254
67255           function continueTo(nextStep) {
67256               context.history().on('change.intro', null);
67257               nextStep();
67258           }
67259       }
67260
67261
67262       function play() {
67263           dispatch$1.call('done');
67264           reveal('#id-container',
67265               t('intro.points.play', { next: t('intro.areas.title') }), {
67266                   tooltipBox: '.intro-nav-wrap .chapter-area',
67267                   buttonText: t('intro.ok'),
67268                   buttonCallback: function() { reveal('#id-container'); }
67269               }
67270           );
67271       }
67272
67273
67274       chapter.enter = function() {
67275           addPoint();
67276       };
67277
67278
67279       chapter.exit = function() {
67280           timeouts.forEach(window.clearTimeout);
67281           context.on('enter.intro exit.intro', null);
67282           context.map().on('move.intro drawn.intro', null);
67283           context.history().on('change.intro', null);
67284           select('.inspector-wrap').on('wheel.intro', eventCancel);
67285           select('.preset-search-input').on('keydown.intro keyup.intro', null);
67286       };
67287
67288
67289       chapter.restart = function() {
67290           chapter.exit();
67291           chapter.enter();
67292       };
67293
67294
67295       return utilRebind(chapter, dispatch$1, 'on');
67296   }
67297
67298   function uiIntroArea(context, reveal) {
67299       var dispatch$1 = dispatch('done');
67300       var playground = [-85.63552, 41.94159];
67301       var playgroundPreset = context.presets().item('leisure/playground');
67302       var descriptionField = context.presets().field('description');
67303       var timeouts = [];
67304       var _areaID;
67305
67306
67307       var chapter = {
67308           title: 'intro.areas.title'
67309       };
67310
67311
67312       function timeout(f, t) {
67313           timeouts.push(window.setTimeout(f, t));
67314       }
67315
67316
67317       function eventCancel() {
67318           event.stopPropagation();
67319           event.preventDefault();
67320       }
67321
67322
67323       function revealPlayground(center, text, options) {
67324           var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
67325           var box = pad$1(center, padding, context);
67326           reveal(box, text, options);
67327       }
67328
67329
67330       function addArea() {
67331           context.enter(modeBrowse(context));
67332           context.history().reset('initial');
67333           _areaID = null;
67334
67335           var msec = transitionTime(playground, context.map().center());
67336           if (msec) { reveal(null, null, { duration: 0 }); }
67337           context.map().centerZoomEase(playground, 19, msec);
67338
67339           timeout(function() {
67340               var tooltip = reveal('button.add-area',
67341                   t('intro.areas.add_playground', { button: icon('#iD-icon-area', 'pre-text') }));
67342
67343               tooltip.selectAll('.tooltip-inner')
67344                   .insert('svg', 'span')
67345                   .attr('class', 'tooltip-illustration')
67346                   .append('use')
67347                   .attr('xlink:href', '#iD-graphic-areas');
67348
67349               context.on('enter.intro', function(mode) {
67350                   if (mode.id !== 'add-area') return;
67351                   continueTo(startPlayground);
67352               });
67353           }, msec + 100);
67354
67355           function continueTo(nextStep) {
67356               context.on('enter.intro', null);
67357               nextStep();
67358           }
67359       }
67360
67361
67362       function startPlayground() {
67363           if (context.mode().id !== 'add-area') {
67364               return chapter.restart();
67365           }
67366
67367           _areaID = null;
67368           context.map().zoomEase(19.5, 500);
67369
67370           timeout(function() {
67371               revealPlayground(playground,
67372                   t('intro.areas.start_playground'), { duration: 250 }
67373               );
67374
67375               timeout(function() {
67376                   context.map().on('move.intro drawn.intro', function() {
67377                       revealPlayground(playground,
67378                           t('intro.areas.start_playground'), { duration: 0 }
67379                       );
67380                   });
67381                   context.on('enter.intro', function(mode) {
67382                       if (mode.id !== 'draw-area') return chapter.restart();
67383                       continueTo(continuePlayground);
67384                   });
67385               }, 250);  // after reveal
67386
67387           }, 550);  // after easing
67388
67389           function continueTo(nextStep) {
67390               context.map().on('move.intro drawn.intro', null);
67391               context.on('enter.intro', null);
67392               nextStep();
67393           }
67394       }
67395
67396
67397       function continuePlayground() {
67398           if (context.mode().id !== 'draw-area') {
67399               return chapter.restart();
67400           }
67401
67402           _areaID = null;
67403           revealPlayground(playground,
67404               t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
67405               { duration: 250 }
67406           );
67407
67408           timeout(function() {
67409               context.map().on('move.intro drawn.intro', function() {
67410                   revealPlayground(playground,
67411                       t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
67412                       { duration: 0 }
67413                   );
67414               });
67415           }, 250);  // after reveal
67416
67417           context.on('enter.intro', function(mode) {
67418               if (mode.id === 'draw-area') {
67419                   var entity = context.hasEntity(context.selectedIDs()[0]);
67420                   if (entity && entity.nodes.length >= 6) {
67421                       return continueTo(finishPlayground);
67422                   } else {
67423                       return;
67424                   }
67425               } else if (mode.id === 'select') {
67426                   _areaID = context.selectedIDs()[0];
67427                   return continueTo(searchPresets);
67428               } else {
67429                   return chapter.restart();
67430               }
67431           });
67432
67433           function continueTo(nextStep) {
67434               context.map().on('move.intro drawn.intro', null);
67435               context.on('enter.intro', null);
67436               nextStep();
67437           }
67438       }
67439
67440
67441       function finishPlayground() {
67442           if (context.mode().id !== 'draw-area') {
67443               return chapter.restart();
67444           }
67445
67446           _areaID = null;
67447           revealPlayground(playground,
67448               t('intro.areas.finish_playground'), { duration: 250 }
67449           );
67450
67451           timeout(function() {
67452               context.map().on('move.intro drawn.intro', function() {
67453                   revealPlayground(playground,
67454                       t('intro.areas.finish_playground'), { duration: 0 }
67455                   );
67456               });
67457           }, 250);  // after reveal
67458
67459           context.on('enter.intro', function(mode) {
67460               if (mode.id === 'draw-area') {
67461                   return;
67462               } else if (mode.id === 'select') {
67463                   _areaID = context.selectedIDs()[0];
67464                   return continueTo(searchPresets);
67465               } else {
67466                   return chapter.restart();
67467               }
67468           });
67469
67470           function continueTo(nextStep) {
67471               context.map().on('move.intro drawn.intro', null);
67472               context.on('enter.intro', null);
67473               nextStep();
67474           }
67475       }
67476
67477
67478       function searchPresets() {
67479           if (!_areaID || !context.hasEntity(_areaID)) {
67480               return addArea();
67481           }
67482           var ids = context.selectedIDs();
67483           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
67484               context.enter(modeSelect(context, [_areaID]));
67485           }
67486
67487           // disallow scrolling
67488           select('.inspector-wrap').on('wheel.intro', eventCancel);
67489
67490           timeout(function() {
67491               // reset pane, in case user somehow happened to change it..
67492               select('.inspector-wrap .panewrap').style('right', '-100%');
67493
67494               select('.preset-search-input')
67495                   .on('keydown.intro', null)
67496                   .on('keyup.intro', checkPresetSearch);
67497
67498               reveal('.preset-search-input',
67499                   t('intro.areas.search_playground', { preset: playgroundPreset.name() })
67500               );
67501           }, 400);  // after preset list pane visible..
67502
67503           context.on('enter.intro', function(mode) {
67504               if (!_areaID || !context.hasEntity(_areaID)) {
67505                   return continueTo(addArea);
67506               }
67507
67508               var ids = context.selectedIDs();
67509               if (mode.id !== 'select' || !ids.length || ids[0] !== _areaID) {
67510                   // keep the user's area selected..
67511                   context.enter(modeSelect(context, [_areaID]));
67512
67513                   // reset pane, in case user somehow happened to change it..
67514                   select('.inspector-wrap .panewrap').style('right', '-100%');
67515                   // disallow scrolling
67516                   select('.inspector-wrap').on('wheel.intro', eventCancel);
67517
67518                   select('.preset-search-input')
67519                       .on('keydown.intro', null)
67520                       .on('keyup.intro', checkPresetSearch);
67521
67522                   reveal('.preset-search-input',
67523                       t('intro.areas.search_playground', { preset: playgroundPreset.name() })
67524                   );
67525
67526                   context.history().on('change.intro', null);
67527               }
67528           });
67529
67530           function checkPresetSearch() {
67531               var first = select('.preset-list-item:first-child');
67532
67533               if (first.classed('preset-leisure-playground')) {
67534                   reveal(first.select('.preset-list-button').node(),
67535                       t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
67536                       { duration: 300 }
67537                   );
67538
67539                   select('.preset-search-input')
67540                       .on('keydown.intro', eventCancel, true)
67541                       .on('keyup.intro', null);
67542
67543                   context.history().on('change.intro', function() {
67544                       continueTo(clickAddField);
67545                   });
67546               }
67547           }
67548
67549           function continueTo(nextStep) {
67550               select('.inspector-wrap').on('wheel.intro', null);
67551               context.on('enter.intro', null);
67552               context.history().on('change.intro', null);
67553               select('.preset-search-input').on('keydown.intro keyup.intro', null);
67554               nextStep();
67555           }
67556       }
67557
67558
67559       function clickAddField() {
67560           if (!_areaID || !context.hasEntity(_areaID)) {
67561               return addArea();
67562           }
67563           var ids = context.selectedIDs();
67564           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
67565               return searchPresets();
67566           }
67567
67568           if (!select('.form-field-description').empty()) {
67569               return continueTo(describePlayground);
67570           }
67571
67572           // disallow scrolling
67573           select('.inspector-wrap').on('wheel.intro', eventCancel);
67574
67575           timeout(function() {
67576               // reset pane, in case user somehow happened to change it..
67577               select('.inspector-wrap .panewrap').style('right', '0%');
67578
67579               // It's possible for the user to add a description in a previous step..
67580               // If they did this already, just continue to next step.
67581               var entity = context.entity(_areaID);
67582               if (entity.tags.description) {
67583                   return continueTo(play);
67584               }
67585
67586               // scroll "Add field" into view
67587               var box = select('.more-fields').node().getBoundingClientRect();
67588               if (box.top > 300) {
67589                   var pane = select('.entity-editor-pane .inspector-body');
67590                   var start = pane.node().scrollTop;
67591                   var end = start + (box.top - 300);
67592
67593                   pane
67594                       .transition()
67595                       .duration(250)
67596                       .tween('scroll.inspector', function() {
67597                           var node = this;
67598                           var i = interpolateNumber(start, end);
67599                           return function(t) {
67600                               node.scrollTop = i(t);
67601                           };
67602                       });
67603               }
67604
67605               timeout(function() {
67606                   reveal('.more-fields .combobox-input',
67607                       t('intro.areas.add_field'),
67608                       { duration: 300 }
67609                   );
67610
67611                   select('.more-fields .combobox-input')
67612                       .on('click.intro', function() {
67613                           // Watch for the combobox to appear...
67614                           var watcher;
67615                           watcher = window.setInterval(function() {
67616                               if (!select('div.combobox').empty()) {
67617                                   window.clearInterval(watcher);
67618                                   continueTo(chooseDescriptionField);
67619                               }
67620                           }, 300);
67621                       });
67622               }, 300);  // after "Add Field" visible
67623
67624           }, 400);  // after editor pane visible
67625
67626           context.on('exit.intro', function() {
67627               return continueTo(searchPresets);
67628           });
67629
67630           function continueTo(nextStep) {
67631               select('.inspector-wrap').on('wheel.intro', null);
67632               select('.more-fields .combobox-input').on('click.intro', null);
67633               context.on('exit.intro', null);
67634               nextStep();
67635           }
67636       }
67637
67638
67639       function chooseDescriptionField() {
67640           if (!_areaID || !context.hasEntity(_areaID)) {
67641               return addArea();
67642           }
67643           var ids = context.selectedIDs();
67644           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
67645               return searchPresets();
67646           }
67647
67648           if (!select('.form-field-description').empty()) {
67649               return continueTo(describePlayground);
67650           }
67651
67652           // Make sure combobox is ready..
67653           if (select('div.combobox').empty()) {
67654               return continueTo(clickAddField);
67655           }
67656           // Watch for the combobox to go away..
67657           var watcher;
67658           watcher = window.setInterval(function() {
67659               if (select('div.combobox').empty()) {
67660                   window.clearInterval(watcher);
67661                   timeout(function() {
67662                       if (select('.form-field-description').empty()) {
67663                           continueTo(retryChooseDescription);
67664                       } else {
67665                           continueTo(describePlayground);
67666                       }
67667                   }, 300);  // after description field added.
67668               }
67669           }, 300);
67670
67671           reveal('div.combobox',
67672               t('intro.areas.choose_field', { field: descriptionField.label() }),
67673               { duration: 300 }
67674           );
67675
67676           context.on('exit.intro', function() {
67677               return continueTo(searchPresets);
67678           });
67679
67680           function continueTo(nextStep) {
67681               if (watcher) window.clearInterval(watcher);
67682               context.on('exit.intro', null);
67683               nextStep();
67684           }
67685       }
67686
67687
67688       function describePlayground() {
67689           if (!_areaID || !context.hasEntity(_areaID)) {
67690               return addArea();
67691           }
67692           var ids = context.selectedIDs();
67693           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
67694               return searchPresets();
67695           }
67696
67697           // reset pane, in case user happened to change it..
67698           select('.inspector-wrap .panewrap').style('right', '0%');
67699
67700           if (select('.form-field-description').empty()) {
67701               return continueTo(retryChooseDescription);
67702           }
67703
67704           context.on('exit.intro', function() {
67705               continueTo(play);
67706           });
67707
67708           reveal('.entity-editor-pane',
67709               t('intro.areas.describe_playground', { button: icon('#iD-icon-apply', 'pre-text') }),
67710               { duration: 300 }
67711           );
67712
67713           function continueTo(nextStep) {
67714               context.on('exit.intro', null);
67715               nextStep();
67716           }
67717       }
67718
67719
67720       function retryChooseDescription() {
67721           if (!_areaID || !context.hasEntity(_areaID)) {
67722               return addArea();
67723           }
67724           var ids = context.selectedIDs();
67725           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
67726               return searchPresets();
67727           }
67728
67729           // reset pane, in case user happened to change it..
67730           select('.inspector-wrap .panewrap').style('right', '0%');
67731
67732           reveal('.entity-editor-pane',
67733               t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
67734               buttonText: t('intro.ok'),
67735               buttonCallback: function() { continueTo(clickAddField); }
67736           });
67737
67738           context.on('exit.intro', function() {
67739               return continueTo(searchPresets);
67740           });
67741
67742           function continueTo(nextStep) {
67743               context.on('exit.intro', null);
67744               nextStep();
67745           }
67746       }
67747
67748
67749       function play() {
67750           dispatch$1.call('done');
67751           reveal('#id-container',
67752               t('intro.areas.play', { next: t('intro.lines.title') }), {
67753                   tooltipBox: '.intro-nav-wrap .chapter-line',
67754                   buttonText: t('intro.ok'),
67755                   buttonCallback: function() { reveal('#id-container'); }
67756               }
67757           );
67758       }
67759
67760
67761       chapter.enter = function() {
67762           addArea();
67763       };
67764
67765
67766       chapter.exit = function() {
67767           timeouts.forEach(window.clearTimeout);
67768           context.on('enter.intro exit.intro', null);
67769           context.map().on('move.intro drawn.intro', null);
67770           context.history().on('change.intro', null);
67771           select('.inspector-wrap').on('wheel.intro', null);
67772           select('.preset-search-input').on('keydown.intro keyup.intro', null);
67773           select('.more-fields .combobox-input').on('click.intro', null);
67774       };
67775
67776
67777       chapter.restart = function() {
67778           chapter.exit();
67779           chapter.enter();
67780       };
67781
67782
67783       return utilRebind(chapter, dispatch$1, 'on');
67784   }
67785
67786   function uiIntroLine(context, reveal) {
67787       var dispatch$1 = dispatch('done');
67788       var timeouts = [];
67789       var _tulipRoadID = null;
67790       var flowerRoadID = 'w646';
67791       var tulipRoadStart = [-85.6297754121684, 41.95805253325314];
67792       var tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204];
67793       var tulipRoadIntersection = [-85.62974496187628, 41.95742515554585];
67794       var roadCategory = context.presets().item('category-road');
67795       var residentialPreset = context.presets().item('highway/residential');
67796       var woodRoadID = 'w525';
67797       var woodRoadEndID = 'n2862';
67798       var woodRoadAddNode = [-85.62390110349587, 41.95397111462291];
67799       var woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487];
67800       var woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872];
67801       var washingtonStreetID = 'w522';
67802       var twelfthAvenueID = 'w1';
67803       var eleventhAvenueEndID = 'n3550';
67804       var twelfthAvenueEndID = 'n5';
67805       var _washingtonSegmentID = null;
67806       var eleventhAvenueEnd = context.entity(eleventhAvenueEndID).loc;
67807       var twelfthAvenueEnd = context.entity(twelfthAvenueEndID).loc;
67808       var deleteLinesLoc = [-85.6219395542764, 41.95228033922477];
67809       var twelfthAvenue = [-85.62219310052491, 41.952505413152956];
67810
67811
67812       var chapter = {
67813           title: 'intro.lines.title'
67814       };
67815
67816
67817       function timeout(f, t) {
67818           timeouts.push(window.setTimeout(f, t));
67819       }
67820
67821
67822       function eventCancel() {
67823           event.stopPropagation();
67824           event.preventDefault();
67825       }
67826
67827
67828       function revealEditMenu(loc, text, options) {
67829           var rect = context.surfaceRect();
67830           var point = context.curtainProjection(loc);
67831           var pad = 40;
67832           var width = 250 + (2 * pad);
67833           var height = 350;
67834           var startX = rect.left + point[0];
67835           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
67836           var box = {
67837               left: left,
67838               top: point[1] + rect.top - 60,
67839               width: width,
67840               height: height
67841           };
67842           reveal(box, text, options);
67843       }
67844
67845
67846       function addLine() {
67847           context.enter(modeBrowse(context));
67848           context.history().reset('initial');
67849
67850           var msec = transitionTime(tulipRoadStart, context.map().center());
67851           if (msec) { reveal(null, null, { duration: 0 }); }
67852           context.map().centerZoomEase(tulipRoadStart, 18.5, msec);
67853
67854           timeout(function() {
67855               var tooltip = reveal('button.add-line',
67856                   t('intro.lines.add_line', { button: icon('#iD-icon-line', 'pre-text') }));
67857
67858               tooltip.selectAll('.tooltip-inner')
67859                   .insert('svg', 'span')
67860                   .attr('class', 'tooltip-illustration')
67861                   .append('use')
67862                   .attr('xlink:href', '#iD-graphic-lines');
67863
67864               context.on('enter.intro', function(mode) {
67865                   if (mode.id !== 'add-line') return;
67866                   continueTo(startLine);
67867               });
67868           }, msec + 100);
67869
67870           function continueTo(nextStep) {
67871               context.on('enter.intro', null);
67872               nextStep();
67873           }
67874       }
67875
67876
67877       function startLine() {
67878           if (context.mode().id !== 'add-line') return chapter.restart();
67879
67880           _tulipRoadID = null;
67881
67882           var padding = 70 * Math.pow(2, context.map().zoom() - 18);
67883           var box = pad$1(tulipRoadStart, padding, context);
67884           box.height = box.height + 100;
67885           reveal(box, t('intro.lines.start_line'));
67886
67887           context.map().on('move.intro drawn.intro', function() {
67888               padding = 70 * Math.pow(2, context.map().zoom() - 18);
67889               box = pad$1(tulipRoadStart, padding, context);
67890               box.height = box.height + 100;
67891               reveal(box, t('intro.lines.start_line'), { duration: 0 });
67892           });
67893
67894           context.on('enter.intro', function(mode) {
67895               if (mode.id !== 'draw-line') return chapter.restart();
67896               continueTo(drawLine);
67897           });
67898
67899           function continueTo(nextStep) {
67900               context.map().on('move.intro drawn.intro', null);
67901               context.on('enter.intro', null);
67902               nextStep();
67903           }
67904       }
67905
67906
67907       function drawLine() {
67908           if (context.mode().id !== 'draw-line') return chapter.restart();
67909
67910           _tulipRoadID = context.mode().selectedIDs()[0];
67911           context.map().centerEase(tulipRoadMidpoint, 500);
67912
67913           timeout(function() {
67914               var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
67915               var box = pad$1(tulipRoadMidpoint, padding, context);
67916               box.height = box.height * 2;
67917               reveal(box,
67918                   t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
67919               );
67920
67921               context.map().on('move.intro drawn.intro', function() {
67922                   padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
67923                   box = pad$1(tulipRoadMidpoint, padding, context);
67924                   box.height = box.height * 2;
67925                   reveal(box,
67926                       t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
67927                       { duration: 0 }
67928                   );
67929               });
67930           }, 550);  // after easing..
67931
67932           context.history().on('change.intro', function() {
67933               if (isLineConnected()) {
67934                   continueTo(continueLine);
67935               }
67936           });
67937
67938           context.on('enter.intro', function(mode) {
67939               if (mode.id === 'draw-line') {
67940                   return;
67941               } else if (mode.id === 'select') {
67942                   continueTo(retryIntersect);
67943                   return;
67944               } else {
67945                   return chapter.restart();
67946               }
67947           });
67948
67949           function continueTo(nextStep) {
67950               context.map().on('move.intro drawn.intro', null);
67951               context.history().on('change.intro', null);
67952               context.on('enter.intro', null);
67953               nextStep();
67954           }
67955       }
67956
67957
67958       function isLineConnected() {
67959           var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
67960           if (!entity) return false;
67961
67962           var drawNodes = context.graph().childNodes(entity);
67963           return some(drawNodes, function(node) {
67964               return some(context.graph().parentWays(node), function(parent) {
67965                   return parent.id === flowerRoadID;
67966               });
67967           });
67968       }
67969
67970
67971       function retryIntersect() {
67972           select(window).on('mousedown.intro', eventCancel, true);
67973
67974           var box = pad$1(tulipRoadIntersection, 80, context);
67975           reveal(box,
67976               t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
67977           );
67978
67979           timeout(chapter.restart, 3000);
67980       }
67981
67982
67983       function continueLine() {
67984           if (context.mode().id !== 'draw-line') return chapter.restart();
67985           var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
67986           if (!entity) return chapter.restart();
67987
67988           context.map().centerEase(tulipRoadIntersection, 500);
67989
67990           reveal('#surface', t('intro.lines.continue_line'));
67991
67992           context.on('enter.intro', function(mode) {
67993               if (mode.id === 'draw-line')
67994                   return;
67995               else if (mode.id === 'select')
67996                   return continueTo(chooseCategoryRoad);
67997               else
67998                   return chapter.restart();
67999           });
68000
68001           function continueTo(nextStep) {
68002               context.on('enter.intro', null);
68003               nextStep();
68004           }
68005       }
68006
68007
68008       function chooseCategoryRoad() {
68009           if (context.mode().id !== 'select') return chapter.restart();
68010
68011           context.on('exit.intro', function() {
68012               return chapter.restart();
68013           });
68014
68015           var button = select('.preset-category-road .preset-list-button');
68016           if (button.empty()) return chapter.restart();
68017
68018           // disallow scrolling
68019           select('.inspector-wrap').on('wheel.intro', eventCancel);
68020
68021           timeout(function() {
68022               // reset pane, in case user somehow happened to change it..
68023               select('.inspector-wrap .panewrap').style('right', '-100%');
68024
68025               reveal(button.node(),
68026                   t('intro.lines.choose_category_road', { category: roadCategory.name() })
68027               );
68028
68029               button.on('click.intro', function() {
68030                   continueTo(choosePresetResidential);
68031               });
68032
68033           }, 400);  // after editor pane visible
68034
68035           function continueTo(nextStep) {
68036               select('.inspector-wrap').on('wheel.intro', null);
68037               select('.preset-list-button').on('click.intro', null);
68038               context.on('exit.intro', null);
68039               nextStep();
68040           }
68041       }
68042
68043
68044       function choosePresetResidential() {
68045           if (context.mode().id !== 'select') return chapter.restart();
68046
68047           context.on('exit.intro', function() {
68048               return chapter.restart();
68049           });
68050
68051           var subgrid = select('.preset-category-road .subgrid');
68052           if (subgrid.empty()) return chapter.restart();
68053
68054           subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
68055               .on('click.intro', function() {
68056                   continueTo(retryPresetResidential);
68057               });
68058
68059           subgrid.selectAll('.preset-highway-residential .preset-list-button')
68060               .on('click.intro', function() {
68061                   continueTo(nameRoad);
68062               });
68063
68064           timeout(function() {
68065               reveal(subgrid.node(),
68066                   t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
68067                   { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
68068               );
68069           }, 300);
68070
68071           function continueTo(nextStep) {
68072               select('.preset-list-button').on('click.intro', null);
68073               context.on('exit.intro', null);
68074               nextStep();
68075           }
68076       }
68077
68078
68079       // selected wrong road type
68080       function retryPresetResidential() {
68081           if (context.mode().id !== 'select') return chapter.restart();
68082
68083           context.on('exit.intro', function() {
68084               return chapter.restart();
68085           });
68086
68087           // disallow scrolling
68088           select('.inspector-wrap').on('wheel.intro', eventCancel);
68089
68090           timeout(function() {
68091               var button = select('.entity-editor-pane .preset-list-button');
68092
68093               reveal(button.node(),
68094                   t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
68095               );
68096
68097               button.on('click.intro', function() {
68098                   continueTo(chooseCategoryRoad);
68099               });
68100
68101           }, 500);
68102
68103           function continueTo(nextStep) {
68104               select('.inspector-wrap').on('wheel.intro', null);
68105               select('.preset-list-button').on('click.intro', null);
68106               context.on('exit.intro', null);
68107               nextStep();
68108           }
68109       }
68110
68111
68112       function nameRoad() {
68113           context.on('exit.intro', function() {
68114               continueTo(didNameRoad);
68115           });
68116
68117           timeout(function() {
68118               reveal('.entity-editor-pane',
68119                   t('intro.lines.name_road', { button: icon('#iD-icon-apply', 'pre-text') }),
68120                   { tooltipClass: 'intro-lines-name_road' }
68121               );
68122           }, 500);
68123
68124           function continueTo(nextStep) {
68125               context.on('exit.intro', null);
68126               nextStep();
68127           }
68128       }
68129
68130
68131       function didNameRoad() {
68132           context.history().checkpoint('doneAddLine');
68133
68134           timeout(function() {
68135               reveal('#surface', t('intro.lines.did_name_road'), {
68136                   buttonText: t('intro.ok'),
68137                   buttonCallback: function() { continueTo(updateLine); }
68138               });
68139           }, 500);
68140
68141           function continueTo(nextStep) {
68142               nextStep();
68143           }
68144       }
68145
68146
68147       function updateLine() {
68148           context.history().reset('doneAddLine');
68149           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68150               return chapter.restart();
68151           }
68152
68153           var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
68154           if (msec) { reveal(null, null, { duration: 0 }); }
68155           context.map().centerZoomEase(woodRoadDragMidpoint, 19, msec);
68156
68157           timeout(function() {
68158               var padding = 250 * Math.pow(2, context.map().zoom() - 19);
68159               var box = pad$1(woodRoadDragMidpoint, padding, context);
68160               var advance = function() { continueTo(addNode); };
68161
68162               reveal(box, t('intro.lines.update_line'),
68163                   { buttonText: t('intro.ok'), buttonCallback: advance }
68164               );
68165
68166               context.map().on('move.intro drawn.intro', function() {
68167                   var padding = 250 * Math.pow(2, context.map().zoom() - 19);
68168                   var box = pad$1(woodRoadDragMidpoint, padding, context);
68169                   reveal(box, t('intro.lines.update_line'),
68170                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
68171                   );
68172               });
68173           }, msec + 100);
68174
68175           function continueTo(nextStep) {
68176               context.map().on('move.intro drawn.intro', null);
68177               nextStep();
68178           }
68179       }
68180
68181
68182       function addNode() {
68183           context.history().reset('doneAddLine');
68184           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68185               return chapter.restart();
68186           }
68187
68188           var padding = 40 * Math.pow(2, context.map().zoom() - 19);
68189           var box = pad$1(woodRoadAddNode, padding, context);
68190           reveal(box, t('intro.lines.add_node'));
68191
68192           context.map().on('move.intro drawn.intro', function() {
68193               var padding = 40 * Math.pow(2, context.map().zoom() - 19);
68194               var box = pad$1(woodRoadAddNode, padding, context);
68195               reveal(box, t('intro.lines.add_node'), { duration: 0 });
68196           });
68197
68198           context.history().on('change.intro', function(changed) {
68199               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68200                   return continueTo(updateLine);
68201               }
68202               if (changed.created().length === 1) {
68203                   timeout(function() { continueTo(startDragEndpoint); }, 500);
68204               }
68205           });
68206
68207           context.on('enter.intro', function(mode) {
68208               if (mode.id !== 'select') {
68209                   continueTo(updateLine);
68210               }
68211           });
68212
68213           function continueTo(nextStep) {
68214               context.map().on('move.intro drawn.intro', null);
68215               context.history().on('change.intro', null);
68216               context.on('enter.intro', null);
68217               nextStep();
68218           }
68219       }
68220
68221
68222       function startDragEndpoint() {
68223           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68224               return continueTo(updateLine);
68225           }
68226           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
68227           var box = pad$1(woodRoadDragEndpoint, padding, context);
68228           reveal(box, t('intro.lines.start_drag_endpoint'));
68229
68230           context.map().on('move.intro drawn.intro', function() {
68231               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68232                   return continueTo(updateLine);
68233               }
68234               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
68235               var box = pad$1(woodRoadDragEndpoint, padding, context);
68236               reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
68237
68238               var entity = context.entity(woodRoadEndID);
68239               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
68240                   continueTo(finishDragEndpoint);
68241               }
68242           });
68243
68244           function continueTo(nextStep) {
68245               context.map().on('move.intro drawn.intro', null);
68246               nextStep();
68247           }
68248       }
68249
68250
68251       function finishDragEndpoint() {
68252           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68253               return continueTo(updateLine);
68254           }
68255
68256           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
68257           var box = pad$1(woodRoadDragEndpoint, padding, context);
68258           reveal(box, t('intro.lines.finish_drag_endpoint'));
68259
68260           context.map().on('move.intro drawn.intro', function() {
68261               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68262                   return continueTo(updateLine);
68263               }
68264               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
68265               var box = pad$1(woodRoadDragEndpoint, padding, context);
68266               reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
68267
68268               var entity = context.entity(woodRoadEndID);
68269               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
68270                   continueTo(startDragEndpoint);
68271               }
68272           });
68273
68274           context.on('enter.intro', function() {
68275               continueTo(startDragMidpoint);
68276           });
68277
68278           function continueTo(nextStep) {
68279               context.map().on('move.intro drawn.intro', null);
68280               context.on('enter.intro', null);
68281               nextStep();
68282           }
68283       }
68284
68285
68286       function startDragMidpoint() {
68287           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68288               return continueTo(updateLine);
68289           }
68290           if (context.selectedIDs().indexOf(woodRoadID) === -1) {
68291               context.enter(modeSelect(context, [woodRoadID]));
68292           }
68293
68294           var padding = 80 * Math.pow(2, context.map().zoom() - 19);
68295           var box = pad$1(woodRoadDragMidpoint, padding, context);
68296           reveal(box, t('intro.lines.start_drag_midpoint'));
68297
68298           context.map().on('move.intro drawn.intro', function() {
68299               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68300                   return continueTo(updateLine);
68301               }
68302               var padding = 80 * Math.pow(2, context.map().zoom() - 19);
68303               var box = pad$1(woodRoadDragMidpoint, padding, context);
68304               reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
68305           });
68306
68307           context.history().on('change.intro', function(changed) {
68308               if (changed.created().length === 1) {
68309                   continueTo(continueDragMidpoint);
68310               }
68311           });
68312
68313           context.on('enter.intro', function(mode) {
68314               if (mode.id !== 'select') {
68315                   // keep Wood Road selected so midpoint triangles are drawn..
68316                   context.enter(modeSelect(context, [woodRoadID]));
68317               }
68318           });
68319
68320           function continueTo(nextStep) {
68321               context.map().on('move.intro drawn.intro', null);
68322               context.history().on('change.intro', null);
68323               context.on('enter.intro', null);
68324               nextStep();
68325           }
68326       }
68327
68328
68329       function continueDragMidpoint() {
68330           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68331               return continueTo(updateLine);
68332           }
68333
68334           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
68335           var box = pad$1(woodRoadDragEndpoint, padding, context);
68336           box.height += 400;
68337
68338           var advance = function() {
68339               context.history().checkpoint('doneUpdateLine');
68340               continueTo(deleteLines);
68341           };
68342
68343           reveal(box, t('intro.lines.continue_drag_midpoint'),
68344               { buttonText: t('intro.ok'), buttonCallback: advance }
68345           );
68346
68347           context.map().on('move.intro drawn.intro', function() {
68348               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68349                   return continueTo(updateLine);
68350               }
68351               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
68352               var box = pad$1(woodRoadDragEndpoint, padding, context);
68353               box.height += 400;
68354               reveal(box, t('intro.lines.continue_drag_midpoint'),
68355                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
68356               );
68357           });
68358
68359           function continueTo(nextStep) {
68360               context.map().on('move.intro drawn.intro', null);
68361               nextStep();
68362           }
68363       }
68364
68365
68366       function deleteLines() {
68367           context.history().reset('doneUpdateLine');
68368           context.enter(modeBrowse(context));
68369
68370           if (!context.hasEntity(washingtonStreetID) ||
68371               !context.hasEntity(twelfthAvenueID) ||
68372               !context.hasEntity(eleventhAvenueEndID)) {
68373               return chapter.restart();
68374           }
68375
68376           var msec = transitionTime(deleteLinesLoc, context.map().center());
68377           if (msec) { reveal(null, null, { duration: 0 }); }
68378           context.map().centerZoomEase(deleteLinesLoc, 18, msec);
68379
68380           timeout(function() {
68381               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68382               var box = pad$1(deleteLinesLoc, padding, context);
68383               box.top -= 200;
68384               box.height += 400;
68385               var advance = function() { continueTo(rightClickIntersection); };
68386
68387               reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
68388                   { buttonText: t('intro.ok'), buttonCallback: advance }
68389               );
68390
68391               context.map().on('move.intro drawn.intro', function() {
68392                   var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68393                   var box = pad$1(deleteLinesLoc, padding, context);
68394                   box.top -= 200;
68395                   box.height += 400;
68396                   reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
68397                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
68398                   );
68399               });
68400
68401               context.history().on('change.intro', function() {
68402                   timeout(function() {
68403                       continueTo(deleteLines);
68404                   }, 500);  // after any transition (e.g. if user deleted intersection)
68405               });
68406
68407           }, msec + 100);
68408
68409           function continueTo(nextStep) {
68410               context.map().on('move.intro drawn.intro', null);
68411               context.history().on('change.intro', null);
68412               nextStep();
68413           }
68414       }
68415
68416
68417       function rightClickIntersection() {
68418           context.history().reset('doneUpdateLine');
68419           context.enter(modeBrowse(context));
68420
68421           context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
68422
68423           timeout(function() {
68424               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
68425               var box = pad$1(eleventhAvenueEnd, padding, context);
68426               reveal(box, t('intro.lines.rightclick_intersection',
68427                   { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
68428               );
68429
68430               context.map().on('move.intro drawn.intro', function() {
68431                   var padding = 60 * Math.pow(2, context.map().zoom() - 18);
68432                   var box = pad$1(eleventhAvenueEnd, padding, context);
68433                   reveal(box, t('intro.lines.rightclick_intersection',
68434                       { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
68435                       { duration: 0 }
68436                   );
68437               });
68438
68439               context.on('enter.intro', function(mode) {
68440                   if (mode.id !== 'select') return;
68441                   var ids = context.selectedIDs();
68442                   if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID) return;
68443
68444                   timeout(function() {
68445                       var node = selectMenuItem('split').node();
68446                       if (!node) return;
68447                       continueTo(splitIntersection);
68448                   }, 300);  // after menu visible
68449               });
68450
68451               context.history().on('change.intro', function() {
68452                   timeout(function() {
68453                       continueTo(deleteLines);
68454                   }, 300);  // after any transition (e.g. if user deleted intersection)
68455               });
68456
68457           }, 600);
68458
68459           function continueTo(nextStep) {
68460               context.map().on('move.intro drawn.intro', null);
68461               context.on('enter.intro', null);
68462               context.history().on('change.intro', null);
68463               nextStep();
68464           }
68465       }
68466
68467
68468       function splitIntersection() {
68469           if (!context.hasEntity(washingtonStreetID) ||
68470               !context.hasEntity(twelfthAvenueID) ||
68471               !context.hasEntity(eleventhAvenueEndID)) {
68472               return continueTo(deleteLines);
68473           }
68474
68475           var node = selectMenuItem('split').node();
68476           if (!node) { return continueTo(rightClickIntersection); }
68477
68478           var wasChanged = false;
68479           var menuCoords = context.map().mouseCoordinates();
68480           _washingtonSegmentID = null;
68481
68482           revealEditMenu(menuCoords, t('intro.lines.split_intersection',
68483               { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
68484           );
68485
68486           context.map().on('move.intro drawn.intro', function() {
68487               var node = selectMenuItem('split').node();
68488               if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
68489
68490               revealEditMenu(menuCoords, t('intro.lines.split_intersection',
68491                   { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
68492                   { duration: 0 }
68493               );
68494           });
68495
68496           context.history().on('change.intro', function(changed) {
68497               wasChanged = true;
68498               timeout(function() {
68499                   if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
68500                       _washingtonSegmentID = changed.created()[0].id;
68501                       continueTo(didSplit);
68502                   } else {
68503                       _washingtonSegmentID = null;
68504                       continueTo(retrySplit);
68505                   }
68506               }, 300);  // after any transition (e.g. if user deleted intersection)
68507           });
68508
68509           function continueTo(nextStep) {
68510               context.map().on('move.intro drawn.intro', null);
68511               context.history().on('change.intro', null);
68512               nextStep();
68513           }
68514       }
68515
68516
68517       function retrySplit() {
68518           context.enter(modeBrowse(context));
68519           context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
68520           var advance = function() { continueTo(rightClickIntersection); };
68521
68522           var padding = 60 * Math.pow(2, context.map().zoom() - 18);
68523           var box = pad$1(eleventhAvenueEnd, padding, context);
68524           reveal(box, t('intro.lines.retry_split'),
68525               { buttonText: t('intro.ok'), buttonCallback: advance }
68526           );
68527
68528           context.map().on('move.intro drawn.intro', function() {
68529               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
68530               var box = pad$1(eleventhAvenueEnd, padding, context);
68531               reveal(box, t('intro.lines.retry_split'),
68532                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
68533               );
68534           });
68535
68536           function continueTo(nextStep) {
68537               context.map().on('move.intro drawn.intro', null);
68538               nextStep();
68539           }
68540       }
68541
68542
68543       function didSplit() {
68544           if (!_washingtonSegmentID ||
68545               !context.hasEntity(_washingtonSegmentID) ||
68546               !context.hasEntity(washingtonStreetID) ||
68547               !context.hasEntity(twelfthAvenueID) ||
68548               !context.hasEntity(eleventhAvenueEndID)) {
68549               return continueTo(rightClickIntersection);
68550           }
68551
68552           var ids = context.selectedIDs();
68553           var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
68554           var street = t('intro.graph.name.washington-street');
68555
68556           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68557           var box = pad$1(twelfthAvenue, padding, context);
68558           box.width = box.width / 2;
68559           reveal(box, t(string, { street1: street, street2: street }),
68560               { duration: 500 }
68561           );
68562
68563           timeout(function() {
68564               context.map().centerZoomEase(twelfthAvenue, 18, 500);
68565
68566               context.map().on('move.intro drawn.intro', function() {
68567                   var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68568                   var box = pad$1(twelfthAvenue, padding, context);
68569                   box.width = box.width / 2;
68570                   reveal(box, t(string, { street1: street, street2: street }),
68571                       { duration: 0 }
68572                   );
68573               });
68574           }, 600);  // after initial reveal and curtain cut
68575
68576           context.on('enter.intro', function() {
68577               var ids = context.selectedIDs();
68578               if (ids.length === 1 && ids[0] === _washingtonSegmentID) {
68579                   continueTo(multiSelect);
68580               }
68581           });
68582
68583           context.history().on('change.intro', function() {
68584               if (!_washingtonSegmentID ||
68585                   !context.hasEntity(_washingtonSegmentID) ||
68586                   !context.hasEntity(washingtonStreetID) ||
68587                   !context.hasEntity(twelfthAvenueID) ||
68588                   !context.hasEntity(eleventhAvenueEndID)) {
68589                   return continueTo(rightClickIntersection);
68590               }
68591           });
68592
68593           function continueTo(nextStep) {
68594               context.map().on('move.intro drawn.intro', null);
68595               context.on('enter.intro', null);
68596               context.history().on('change.intro', null);
68597               nextStep();
68598           }
68599       }
68600
68601
68602       function multiSelect() {
68603           if (!_washingtonSegmentID ||
68604               !context.hasEntity(_washingtonSegmentID) ||
68605               !context.hasEntity(washingtonStreetID) ||
68606               !context.hasEntity(twelfthAvenueID) ||
68607               !context.hasEntity(eleventhAvenueEndID)) {
68608               return continueTo(rightClickIntersection);
68609           }
68610
68611           var ids = context.selectedIDs();
68612           var hasWashington = ids.indexOf(_washingtonSegmentID) !== -1;
68613           var hasTwelfth = ids.indexOf(twelfthAvenueID) !== -1;
68614
68615           if (hasWashington && hasTwelfth) {
68616               return continueTo(multiRightClick);
68617           } else if (!hasWashington && !hasTwelfth) {
68618               return continueTo(didSplit);
68619           }
68620
68621           context.map().centerZoomEase(twelfthAvenue, 18, 500);
68622
68623           timeout(function() {
68624               var selected, other, padding, box;
68625               if (hasWashington) {
68626                   selected = t('intro.graph.name.washington-street');
68627                   other = t('intro.graph.name.12th-avenue');
68628                   padding = 60 * Math.pow(2, context.map().zoom() - 18);
68629                   box = pad$1(twelfthAvenueEnd, padding, context);
68630                   box.width *= 3;
68631               } else {
68632                   selected = t('intro.graph.name.12th-avenue');
68633                   other = t('intro.graph.name.washington-street');
68634                   padding = 200 * Math.pow(2, context.map().zoom() - 18);
68635                   box = pad$1(twelfthAvenue, padding, context);
68636                   box.width /= 2;
68637               }
68638
68639               reveal(box,
68640                   t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
68641               );
68642
68643               context.map().on('move.intro drawn.intro', function() {
68644                   if (hasWashington) {
68645                       selected = t('intro.graph.name.washington-street');
68646                       other = t('intro.graph.name.12th-avenue');
68647                       padding = 60 * Math.pow(2, context.map().zoom() - 18);
68648                       box = pad$1(twelfthAvenueEnd, padding, context);
68649                       box.width *= 3;
68650                   } else {
68651                       selected = t('intro.graph.name.12th-avenue');
68652                       other = t('intro.graph.name.washington-street');
68653                       padding = 200 * Math.pow(2, context.map().zoom() - 18);
68654                       box = pad$1(twelfthAvenue, padding, context);
68655                       box.width /= 2;
68656                   }
68657
68658                   reveal(box,
68659                       t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
68660                       { duration: 0 }
68661                   );
68662               });
68663
68664               context.on('enter.intro', function() {
68665                   continueTo(multiSelect);
68666               });
68667
68668               context.history().on('change.intro', function() {
68669                   if (!_washingtonSegmentID ||
68670                       !context.hasEntity(_washingtonSegmentID) ||
68671                       !context.hasEntity(washingtonStreetID) ||
68672                       !context.hasEntity(twelfthAvenueID) ||
68673                       !context.hasEntity(eleventhAvenueEndID)) {
68674                       return continueTo(rightClickIntersection);
68675                   }
68676               });
68677           }, 600);
68678
68679           function continueTo(nextStep) {
68680               context.map().on('move.intro drawn.intro', null);
68681               context.on('enter.intro', null);
68682               context.history().on('change.intro', null);
68683               nextStep();
68684           }
68685       }
68686
68687
68688       function multiRightClick() {
68689           if (!_washingtonSegmentID ||
68690               !context.hasEntity(_washingtonSegmentID) ||
68691               !context.hasEntity(washingtonStreetID) ||
68692               !context.hasEntity(twelfthAvenueID) ||
68693               !context.hasEntity(eleventhAvenueEndID)) {
68694               return continueTo(rightClickIntersection);
68695           }
68696
68697           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68698           var box = pad$1(twelfthAvenue, padding, context);
68699           reveal(box, t('intro.lines.multi_rightclick'));
68700
68701           context.map().on('move.intro drawn.intro', function() {
68702               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68703               var box = pad$1(twelfthAvenue, padding, context);
68704               reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
68705           });
68706
68707           select(window).on('click.intro contextmenu.intro', function() {
68708               timeout(function() {
68709                   var ids = context.selectedIDs();
68710                   if (ids.length === 2 &&
68711                       ids.indexOf(twelfthAvenueID) !== -1 &&
68712                       ids.indexOf(_washingtonSegmentID) !== -1) {
68713                           var node = selectMenuItem('delete').node();
68714                           if (!node) return;
68715                           continueTo(multiDelete);
68716                   } else if (ids.length === 1 &&
68717                       ids.indexOf(_washingtonSegmentID) !== -1) {
68718                       return continueTo(multiSelect);
68719                   } else {
68720                       return continueTo(didSplit);
68721                   }
68722               }, 300);  // after edit menu visible
68723           }, true);
68724
68725           context.history().on('change.intro', function() {
68726               if (!_washingtonSegmentID ||
68727                   !context.hasEntity(_washingtonSegmentID) ||
68728                   !context.hasEntity(washingtonStreetID) ||
68729                   !context.hasEntity(twelfthAvenueID) ||
68730                   !context.hasEntity(eleventhAvenueEndID)) {
68731                   return continueTo(rightClickIntersection);
68732               }
68733           });
68734
68735           function continueTo(nextStep) {
68736               context.map().on('move.intro drawn.intro', null);
68737               select(window).on('click.intro contextmenu.intro', null, true);
68738               context.history().on('change.intro', null);
68739               nextStep();
68740           }
68741       }
68742
68743
68744       function multiDelete() {
68745           if (!_washingtonSegmentID ||
68746               !context.hasEntity(_washingtonSegmentID) ||
68747               !context.hasEntity(washingtonStreetID) ||
68748               !context.hasEntity(twelfthAvenueID) ||
68749               !context.hasEntity(eleventhAvenueEndID)) {
68750               return continueTo(rightClickIntersection);
68751           }
68752
68753           var node = selectMenuItem('delete').node();
68754           if (!node) return continueTo(multiRightClick);
68755
68756           var menuCoords = context.map().mouseCoordinates();
68757           revealEditMenu(menuCoords,
68758               t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') })
68759           );
68760
68761           context.map().on('move.intro drawn.intro', function() {
68762               revealEditMenu(menuCoords,
68763                   t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') }),
68764                   { duration: 0 }
68765               );
68766           });
68767
68768           context.on('exit.intro', function() {
68769               if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
68770                   return continueTo(multiSelect);  // left select mode but roads still exist
68771               }
68772           });
68773
68774           context.history().on('change.intro', function() {
68775               if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
68776                   continueTo(retryDelete);         // changed something but roads still exist
68777               } else {
68778                   continueTo(play);
68779               }
68780           });
68781
68782           function continueTo(nextStep) {
68783               context.map().on('move.intro drawn.intro', null);
68784               context.on('exit.intro', null);
68785               context.history().on('change.intro', null);
68786               nextStep();
68787           }
68788       }
68789
68790
68791       function retryDelete() {
68792           context.enter(modeBrowse(context));
68793
68794           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68795           var box = pad$1(twelfthAvenue, padding, context);
68796           reveal(box, t('intro.lines.retry_delete'), {
68797               buttonText: t('intro.ok'),
68798               buttonCallback: function() { continueTo(multiSelect); }
68799           });
68800
68801           function continueTo(nextStep) {
68802               nextStep();
68803           }
68804       }
68805
68806
68807       function play() {
68808           dispatch$1.call('done');
68809           reveal('#id-container',
68810               t('intro.lines.play', { next: t('intro.buildings.title') }), {
68811                   tooltipBox: '.intro-nav-wrap .chapter-building',
68812                   buttonText: t('intro.ok'),
68813                   buttonCallback: function() { reveal('#id-container'); }
68814               }
68815           );
68816      }
68817
68818
68819       chapter.enter = function() {
68820           addLine();
68821       };
68822
68823
68824       chapter.exit = function() {
68825           timeouts.forEach(window.clearTimeout);
68826           select(window).on('mousedown.intro', null, true);
68827           context.on('enter.intro exit.intro', null);
68828           context.map().on('move.intro drawn.intro', null);
68829           context.history().on('change.intro', null);
68830           select('.inspector-wrap').on('wheel.intro', null);
68831           select('.preset-list-button').on('click.intro', null);
68832       };
68833
68834
68835       chapter.restart = function() {
68836           chapter.exit();
68837           chapter.enter();
68838       };
68839
68840
68841       return utilRebind(chapter, dispatch$1, 'on');
68842   }
68843
68844   function uiIntroBuilding(context, reveal) {
68845       var dispatch$1 = dispatch('done');
68846       var house = [-85.62815, 41.95638];
68847       var tank = [-85.62732, 41.95347];
68848       var buildingCatetory = context.presets().item('category-building');
68849       var housePreset = context.presets().item('building/house');
68850       var tankPreset = context.presets().item('man_made/storage_tank');
68851       var timeouts = [];
68852       var _houseID = null;
68853       var _tankID = null;
68854
68855
68856       var chapter = {
68857           title: 'intro.buildings.title'
68858       };
68859
68860
68861       function timeout(f, t) {
68862           timeouts.push(window.setTimeout(f, t));
68863       }
68864
68865
68866       function eventCancel() {
68867           event.stopPropagation();
68868           event.preventDefault();
68869       }
68870
68871
68872       function revealHouse(center, text, options) {
68873           var padding = 160 * Math.pow(2, context.map().zoom() - 20);
68874           var box = pad$1(center, padding, context);
68875           reveal(box, text, options);
68876       }
68877
68878
68879       function revealTank(center, text, options) {
68880           var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
68881           var box = pad$1(center, padding, context);
68882           reveal(box, text, options);
68883       }
68884
68885
68886       function revealEditMenu(loc, text, options) {
68887           var rect = context.surfaceRect();
68888           var point = context.curtainProjection(loc);
68889           var pad = 40;
68890           var width = 250 + (2 * pad);
68891           var height = 350;
68892           var startX = rect.left + point[0];
68893           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
68894           var box = {
68895               left: left,
68896               top: point[1] + rect.top - 60,
68897               width: width,
68898               height: height
68899           };
68900           reveal(box, text, options);
68901       }
68902
68903
68904       function addHouse() {
68905           context.enter(modeBrowse(context));
68906           context.history().reset('initial');
68907           _houseID = null;
68908
68909           var msec = transitionTime(house, context.map().center());
68910           if (msec) { reveal(null, null, { duration: 0 }); }
68911           context.map().centerZoomEase(house, 19, msec);
68912
68913           timeout(function() {
68914               var tooltip = reveal('button.add-area',
68915                   t('intro.buildings.add_building', { button: icon('#iD-icon-area', 'pre-text') }));
68916
68917               tooltip.selectAll('.tooltip-inner')
68918                   .insert('svg', 'span')
68919                   .attr('class', 'tooltip-illustration')
68920                   .append('use')
68921                   .attr('xlink:href', '#iD-graphic-buildings');
68922
68923               context.on('enter.intro', function(mode) {
68924                   if (mode.id !== 'add-area') return;
68925                   continueTo(startHouse);
68926               });
68927           }, msec + 100);
68928
68929           function continueTo(nextStep) {
68930               context.on('enter.intro', null);
68931               nextStep();
68932           }
68933       }
68934
68935
68936       function startHouse() {
68937           if (context.mode().id !== 'add-area') {
68938               return continueTo(addHouse);
68939           }
68940
68941           _houseID = null;
68942           context.map().zoomEase(20, 500);
68943
68944           timeout(function() {
68945               revealHouse(house, t('intro.buildings.start_building'));
68946
68947               context.map().on('move.intro drawn.intro', function() {
68948                   revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
68949               });
68950
68951               context.on('enter.intro', function(mode) {
68952                   if (mode.id !== 'draw-area') return chapter.restart();
68953                   continueTo(continueHouse);
68954               });
68955
68956           }, 550);  // after easing
68957
68958           function continueTo(nextStep) {
68959               context.map().on('move.intro drawn.intro', null);
68960               context.on('enter.intro', null);
68961               nextStep();
68962           }
68963       }
68964
68965
68966       function continueHouse() {
68967           if (context.mode().id !== 'draw-area') {
68968               return continueTo(addHouse);
68969           }
68970
68971           _houseID = null;
68972
68973           revealHouse(house, t('intro.buildings.continue_building'));
68974
68975           context.map().on('move.intro drawn.intro', function() {
68976               revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
68977           });
68978
68979           context.on('enter.intro', function(mode) {
68980               if (mode.id === 'draw-area') {
68981                   return;
68982               } else if (mode.id === 'select') {
68983                   var graph = context.graph();
68984                   var way = context.entity(context.selectedIDs()[0]);
68985                   var nodes = graph.childNodes(way);
68986                   var points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
68987
68988                   if (isMostlySquare(points)) {
68989                       _houseID = way.id;
68990                       return continueTo(chooseCategoryBuilding);
68991                   } else {
68992                       return continueTo(retryHouse);
68993                   }
68994
68995               } else {
68996                   return chapter.restart();
68997               }
68998           });
68999
69000           function continueTo(nextStep) {
69001               context.map().on('move.intro drawn.intro', null);
69002               context.on('enter.intro', null);
69003               nextStep();
69004           }
69005       }
69006
69007
69008       function retryHouse() {
69009           var onClick = function() { continueTo(addHouse); };
69010
69011           revealHouse(house, t('intro.buildings.retry_building'),
69012               { buttonText: t('intro.ok'), buttonCallback: onClick }
69013           );
69014
69015           context.map().on('move.intro drawn.intro', function() {
69016               revealHouse(house, t('intro.buildings.retry_building'),
69017                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
69018               );
69019           });
69020
69021           function continueTo(nextStep) {
69022               context.map().on('move.intro drawn.intro', null);
69023               nextStep();
69024           }
69025       }
69026
69027
69028       function chooseCategoryBuilding() {
69029           if (!_houseID || !context.hasEntity(_houseID)) {
69030               return addHouse();
69031           }
69032           var ids = context.selectedIDs();
69033           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
69034               context.enter(modeSelect(context, [_houseID]));
69035           }
69036
69037           // disallow scrolling
69038           select('.inspector-wrap').on('wheel.intro', eventCancel);
69039
69040           timeout(function() {
69041               // reset pane, in case user somehow happened to change it..
69042               select('.inspector-wrap .panewrap').style('right', '-100%');
69043
69044               var button = select('.preset-category-building .preset-list-button');
69045
69046               reveal(button.node(),
69047                   t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
69048               );
69049
69050               button.on('click.intro', function() {
69051                   button.on('click.intro', null);
69052                   continueTo(choosePresetHouse);
69053               });
69054
69055           }, 400);  // after preset list pane visible..
69056
69057
69058           context.on('enter.intro', function(mode) {
69059               if (!_houseID || !context.hasEntity(_houseID)) {
69060                   return continueTo(addHouse);
69061               }
69062               var ids = context.selectedIDs();
69063               if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
69064                   return continueTo(chooseCategoryBuilding);
69065               }
69066           });
69067
69068           function continueTo(nextStep) {
69069               select('.inspector-wrap').on('wheel.intro', null);
69070               select('.preset-list-button').on('click.intro', null);
69071               context.on('enter.intro', null);
69072               nextStep();
69073           }
69074       }
69075
69076
69077       function choosePresetHouse() {
69078           if (!_houseID || !context.hasEntity(_houseID)) {
69079               return addHouse();
69080           }
69081           var ids = context.selectedIDs();
69082           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
69083               context.enter(modeSelect(context, [_houseID]));
69084           }
69085
69086           // disallow scrolling
69087           select('.inspector-wrap').on('wheel.intro', eventCancel);
69088
69089           timeout(function() {
69090               // reset pane, in case user somehow happened to change it..
69091               select('.inspector-wrap .panewrap').style('right', '-100%');
69092
69093               var button = select('.preset-building-house .preset-list-button');
69094
69095               reveal(button.node(),
69096                   t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
69097                   { duration: 300 }
69098               );
69099
69100               button.on('click.intro', function() {
69101                   button.on('click.intro', null);
69102                   continueTo(closeEditorHouse);
69103               });
69104
69105           }, 400);  // after preset list pane visible..
69106
69107           context.on('enter.intro', function(mode) {
69108               if (!_houseID || !context.hasEntity(_houseID)) {
69109                   return continueTo(addHouse);
69110               }
69111               var ids = context.selectedIDs();
69112               if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
69113                   return continueTo(chooseCategoryBuilding);
69114               }
69115           });
69116
69117           function continueTo(nextStep) {
69118               select('.inspector-wrap').on('wheel.intro', null);
69119               select('.preset-list-button').on('click.intro', null);
69120               context.on('enter.intro', null);
69121               nextStep();
69122           }
69123       }
69124
69125
69126       function closeEditorHouse() {
69127           if (!_houseID || !context.hasEntity(_houseID)) {
69128               return addHouse();
69129           }
69130           var ids = context.selectedIDs();
69131           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
69132               context.enter(modeSelect(context, [_houseID]));
69133           }
69134
69135           context.history().checkpoint('hasHouse');
69136
69137           context.on('exit.intro', function() {
69138               continueTo(rightClickHouse);
69139           });
69140
69141           timeout(function() {
69142               reveal('.entity-editor-pane',
69143                   t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
69144               );
69145           }, 500);
69146
69147           function continueTo(nextStep) {
69148               context.on('exit.intro', null);
69149               nextStep();
69150           }
69151       }
69152
69153
69154       function rightClickHouse() {
69155           if (!_houseID) return chapter.restart();
69156
69157           context.enter(modeBrowse(context));
69158           context.history().reset('hasHouse');
69159           var zoom = context.map().zoom();
69160           if (zoom < 20) {
69161               zoom = 20;
69162           }
69163           context.map().centerZoomEase(house, zoom, 500);
69164
69165           context.on('enter.intro', function(mode) {
69166               if (mode.id !== 'select') return;
69167               var ids = context.selectedIDs();
69168               if (ids.length !== 1 || ids[0] !== _houseID) return;
69169
69170               timeout(function() {
69171                   var node = selectMenuItem('orthogonalize').node();
69172                   if (!node) return;
69173                   continueTo(clickSquare);
69174               }, 300);  // after menu visible
69175           });
69176
69177           context.map().on('move.intro drawn.intro', function() {
69178               revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
69179           });
69180
69181           context.history().on('change.intro', function() {
69182               continueTo(rightClickHouse);
69183           });
69184
69185           function continueTo(nextStep) {
69186               context.on('enter.intro', null);
69187               context.map().on('move.intro drawn.intro', null);
69188               context.history().on('change.intro', null);
69189               nextStep();
69190           }
69191       }
69192
69193
69194       function clickSquare() {
69195           if (!_houseID) return chapter.restart();
69196           var entity = context.hasEntity(_houseID);
69197           if (!entity) return continueTo(rightClickHouse);
69198
69199           var node = selectMenuItem('orthogonalize').node();
69200           if (!node) { return continueTo(rightClickHouse); }
69201
69202           var wasChanged = false;
69203           var menuCoords = context.map().mouseCoordinates();
69204
69205           revealEditMenu(menuCoords,
69206               t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') })
69207           );
69208
69209           context.on('enter.intro', function(mode) {
69210               if (mode.id === 'browse') {
69211                   continueTo(rightClickHouse);
69212               } else if (mode.id === 'move' || mode.id === 'rotate') {
69213                   continueTo(retryClickSquare);
69214               }
69215           });
69216
69217           context.map().on('move.intro drawn.intro', function() {
69218               var node = selectMenuItem('orthogonalize').node();
69219               if (!wasChanged && !node) { return continueTo(rightClickHouse); }
69220
69221               revealEditMenu(menuCoords,
69222                   t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') }),
69223                   { duration: 0 }
69224               );
69225           });
69226
69227           context.history().on('change.intro', function() {
69228               wasChanged = true;
69229               context.history().on('change.intro', null);
69230
69231               // Something changed.  Wait for transition to complete and check undo annotation.
69232               timeout(function() {
69233                   if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
69234                       continueTo(doneSquare);
69235                   } else {
69236                       continueTo(retryClickSquare);
69237                   }
69238               }, 500);  // after transitioned actions
69239           });
69240
69241           function continueTo(nextStep) {
69242               context.on('enter.intro', null);
69243               context.map().on('move.intro drawn.intro', null);
69244               context.history().on('change.intro', null);
69245               nextStep();
69246           }
69247       }
69248
69249
69250       function retryClickSquare() {
69251           context.enter(modeBrowse(context));
69252
69253           revealHouse(house, t('intro.buildings.retry_square'), {
69254               buttonText: t('intro.ok'),
69255               buttonCallback: function() { continueTo(rightClickHouse); }
69256           });
69257
69258           function continueTo(nextStep) {
69259               nextStep();
69260           }
69261       }
69262
69263
69264       function doneSquare() {
69265           context.history().checkpoint('doneSquare');
69266
69267           revealHouse(house, t('intro.buildings.done_square'), {
69268               buttonText: t('intro.ok'),
69269               buttonCallback: function() { continueTo(addTank); }
69270           });
69271
69272           function continueTo(nextStep) {
69273               nextStep();
69274           }
69275       }
69276
69277
69278       function addTank() {
69279           context.enter(modeBrowse(context));
69280           context.history().reset('doneSquare');
69281           _tankID = null;
69282
69283           var msec = transitionTime(tank, context.map().center());
69284           if (msec) { reveal(null, null, { duration: 0 }); }
69285           context.map().centerZoomEase(tank, 19.5, msec);
69286
69287           timeout(function() {
69288               reveal('button.add-area',
69289                   t('intro.buildings.add_tank', { button: icon('#iD-icon-area', 'pre-text') })
69290               );
69291
69292               context.on('enter.intro', function(mode) {
69293                   if (mode.id !== 'add-area') return;
69294                   continueTo(startTank);
69295               });
69296           }, msec + 100);
69297
69298           function continueTo(nextStep) {
69299               context.on('enter.intro', null);
69300               nextStep();
69301           }
69302       }
69303
69304
69305       function startTank() {
69306           if (context.mode().id !== 'add-area') {
69307               return continueTo(addTank);
69308           }
69309
69310           _tankID = null;
69311
69312           timeout(function() {
69313               revealTank(tank, t('intro.buildings.start_tank'));
69314
69315               context.map().on('move.intro drawn.intro', function() {
69316                   revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
69317               });
69318
69319               context.on('enter.intro', function(mode) {
69320                   if (mode.id !== 'draw-area') return chapter.restart();
69321                   continueTo(continueTank);
69322               });
69323
69324           }, 550);  // after easing
69325
69326           function continueTo(nextStep) {
69327               context.map().on('move.intro drawn.intro', null);
69328               context.on('enter.intro', null);
69329               nextStep();
69330           }
69331       }
69332
69333
69334       function continueTank() {
69335           if (context.mode().id !== 'draw-area') {
69336               return continueTo(addTank);
69337           }
69338
69339           _tankID = null;
69340
69341           revealTank(tank, t('intro.buildings.continue_tank'));
69342
69343           context.map().on('move.intro drawn.intro', function() {
69344               revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
69345           });
69346
69347           context.on('enter.intro', function(mode) {
69348               if (mode.id === 'draw-area') {
69349                   return;
69350               } else if (mode.id === 'select') {
69351                   _tankID = context.selectedIDs()[0];
69352                   return continueTo(searchPresetTank);
69353               } else {
69354                   return continueTo(addTank);
69355               }
69356           });
69357
69358           function continueTo(nextStep) {
69359               context.map().on('move.intro drawn.intro', null);
69360               context.on('enter.intro', null);
69361               nextStep();
69362           }
69363       }
69364
69365
69366       function searchPresetTank() {
69367           if (!_tankID || !context.hasEntity(_tankID)) {
69368               return addTank();
69369           }
69370           var ids = context.selectedIDs();
69371           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
69372               context.enter(modeSelect(context, [_tankID]));
69373           }
69374
69375           // disallow scrolling
69376           select('.inspector-wrap').on('wheel.intro', eventCancel);
69377
69378           timeout(function() {
69379               // reset pane, in case user somehow happened to change it..
69380               select('.inspector-wrap .panewrap').style('right', '-100%');
69381
69382               select('.preset-search-input')
69383                   .on('keydown.intro', null)
69384                   .on('keyup.intro', checkPresetSearch);
69385
69386               reveal('.preset-search-input',
69387                   t('intro.buildings.search_tank', { preset: tankPreset.name() })
69388               );
69389           }, 400);  // after preset list pane visible..
69390
69391           context.on('enter.intro', function(mode) {
69392               if (!_tankID || !context.hasEntity(_tankID)) {
69393                   return continueTo(addTank);
69394               }
69395
69396               var ids = context.selectedIDs();
69397               if (mode.id !== 'select' || !ids.length || ids[0] !== _tankID) {
69398                   // keep the user's area selected..
69399                   context.enter(modeSelect(context, [_tankID]));
69400
69401                   // reset pane, in case user somehow happened to change it..
69402                   select('.inspector-wrap .panewrap').style('right', '-100%');
69403                   // disallow scrolling
69404                   select('.inspector-wrap').on('wheel.intro', eventCancel);
69405
69406                   select('.preset-search-input')
69407                       .on('keydown.intro', null)
69408                       .on('keyup.intro', checkPresetSearch);
69409
69410                   reveal('.preset-search-input',
69411                       t('intro.buildings.search_tank', { preset: tankPreset.name() })
69412                   );
69413
69414                   context.history().on('change.intro', null);
69415               }
69416           });
69417
69418           function checkPresetSearch() {
69419               var first = select('.preset-list-item:first-child');
69420
69421               if (first.classed('preset-man_made-storage_tank')) {
69422                   reveal(first.select('.preset-list-button').node(),
69423                       t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
69424                       { duration: 300 }
69425                   );
69426
69427                   select('.preset-search-input')
69428                       .on('keydown.intro', eventCancel, true)
69429                       .on('keyup.intro', null);
69430
69431                   context.history().on('change.intro', function() {
69432                       continueTo(closeEditorTank);
69433                   });
69434               }
69435           }
69436
69437           function continueTo(nextStep) {
69438               select('.inspector-wrap').on('wheel.intro', null);
69439               context.on('enter.intro', null);
69440               context.history().on('change.intro', null);
69441               select('.preset-search-input').on('keydown.intro keyup.intro', null);
69442               nextStep();
69443           }
69444       }
69445
69446
69447       function closeEditorTank() {
69448           if (!_tankID || !context.hasEntity(_tankID)) {
69449               return addTank();
69450           }
69451           var ids = context.selectedIDs();
69452           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
69453               context.enter(modeSelect(context, [_tankID]));
69454           }
69455
69456           context.history().checkpoint('hasTank');
69457
69458           context.on('exit.intro', function() {
69459               continueTo(rightClickTank);
69460           });
69461
69462           timeout(function() {
69463               reveal('.entity-editor-pane',
69464                   t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
69465               );
69466           }, 500);
69467
69468           function continueTo(nextStep) {
69469               context.on('exit.intro', null);
69470               nextStep();
69471           }
69472       }
69473
69474
69475       function rightClickTank() {
69476           if (!_tankID) return continueTo(addTank);
69477
69478           context.enter(modeBrowse(context));
69479           context.history().reset('hasTank');
69480           context.map().centerEase(tank, 500);
69481
69482           timeout(function() {
69483               context.on('enter.intro', function(mode) {
69484                   if (mode.id !== 'select') return;
69485                   var ids = context.selectedIDs();
69486                   if (ids.length !== 1 || ids[0] !== _tankID) return;
69487
69488                   timeout(function() {
69489                       var node = selectMenuItem('circularize').node();
69490                       if (!node) return;
69491                       continueTo(clickCircle);
69492                   }, 300);  // after menu visible
69493               });
69494
69495               revealTank(tank, t('intro.buildings.rightclick_tank'));
69496
69497               context.map().on('move.intro drawn.intro', function() {
69498                   revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
69499               });
69500
69501               context.history().on('change.intro', function() {
69502                   continueTo(rightClickTank);
69503               });
69504
69505           }, 600);
69506
69507           function continueTo(nextStep) {
69508               context.on('enter.intro', null);
69509               context.map().on('move.intro drawn.intro', null);
69510               context.history().on('change.intro', null);
69511               nextStep();
69512           }
69513       }
69514
69515
69516       function clickCircle() {
69517           if (!_tankID) return chapter.restart();
69518           var entity = context.hasEntity(_tankID);
69519           if (!entity) return continueTo(rightClickTank);
69520
69521           var node = selectMenuItem('circularize').node();
69522           if (!node) { return continueTo(rightClickTank); }
69523
69524           var wasChanged = false;
69525           var menuCoords = context.map().mouseCoordinates();
69526
69527           revealEditMenu(menuCoords,
69528               t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') })
69529           );
69530
69531           context.on('enter.intro', function(mode) {
69532               if (mode.id === 'browse') {
69533                   continueTo(rightClickTank);
69534               } else if (mode.id === 'move' || mode.id === 'rotate') {
69535                   continueTo(retryClickCircle);
69536               }
69537           });
69538
69539           context.map().on('move.intro drawn.intro', function() {
69540               var node = selectMenuItem('circularize').node();
69541               if (!wasChanged && !node) { return continueTo(rightClickTank); }
69542
69543               revealEditMenu(menuCoords,
69544                   t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') }),
69545                   { duration: 0 }
69546               );
69547           });
69548
69549           context.history().on('change.intro', function() {
69550               wasChanged = true;
69551               context.history().on('change.intro', null);
69552
69553               // Something changed.  Wait for transition to complete and check undo annotation.
69554               timeout(function() {
69555                   if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
69556                       continueTo(play);
69557                   } else {
69558                       continueTo(retryClickCircle);
69559                   }
69560               }, 500);  // after transitioned actions
69561           });
69562
69563           function continueTo(nextStep) {
69564               context.on('enter.intro', null);
69565               context.map().on('move.intro drawn.intro', null);
69566               context.history().on('change.intro', null);
69567               nextStep();
69568           }
69569       }
69570
69571
69572       function retryClickCircle() {
69573           context.enter(modeBrowse(context));
69574
69575           revealTank(tank, t('intro.buildings.retry_circle'), {
69576               buttonText: t('intro.ok'),
69577               buttonCallback: function() { continueTo(rightClickTank); }
69578           });
69579
69580           function continueTo(nextStep) {
69581               nextStep();
69582           }
69583       }
69584
69585
69586       function play() {
69587           dispatch$1.call('done');
69588           reveal('#id-container',
69589               t('intro.buildings.play', { next: t('intro.startediting.title') }), {
69590                   tooltipBox: '.intro-nav-wrap .chapter-startEditing',
69591                   buttonText: t('intro.ok'),
69592                   buttonCallback: function() { reveal('#id-container'); }
69593               }
69594           );
69595       }
69596
69597
69598       chapter.enter = function() {
69599           addHouse();
69600       };
69601
69602
69603       chapter.exit = function() {
69604           timeouts.forEach(window.clearTimeout);
69605           context.on('enter.intro exit.intro', null);
69606           context.map().on('move.intro drawn.intro', null);
69607           context.history().on('change.intro', null);
69608           select('.inspector-wrap').on('wheel.intro', null);
69609           select('.preset-search-input').on('keydown.intro keyup.intro', null);
69610           select('.more-fields .combobox-input').on('click.intro', null);
69611       };
69612
69613
69614       chapter.restart = function() {
69615           chapter.exit();
69616           chapter.enter();
69617       };
69618
69619
69620       return utilRebind(chapter, dispatch$1, 'on');
69621   }
69622
69623   function uiModal(selection, blocking) {
69624       var keybinding = utilKeybinding('modal');
69625       var previous = selection.select('div.modal');
69626       var animate = previous.empty();
69627
69628       previous.transition()
69629           .duration(200)
69630           .style('opacity', 0)
69631           .remove();
69632
69633       var shaded = selection
69634           .append('div')
69635           .attr('class', 'shaded')
69636           .style('opacity', 0);
69637
69638       shaded.close = function() {
69639           shaded
69640               .transition()
69641               .duration(200)
69642               .style('opacity',0)
69643               .remove();
69644
69645           modal
69646               .transition()
69647               .duration(200)
69648               .style('top','0px');
69649
69650           select(document)
69651               .call(keybinding.unbind);
69652       };
69653
69654
69655       var modal = shaded
69656           .append('div')
69657           .attr('class', 'modal fillL col6');
69658
69659       if (!blocking) {
69660           shaded.on('click.remove-modal', function() {
69661               if (event.target === this) {
69662                   shaded.close();
69663               }
69664           });
69665
69666           modal.append('button')
69667               .attr('class', 'close')
69668               .on('click', shaded.close)
69669               .call(svgIcon('#iD-icon-close'));
69670
69671           keybinding
69672               .on('⌫', shaded.close)
69673               .on('⎋', shaded.close);
69674
69675           select(document)
69676               .call(keybinding);
69677       }
69678
69679       modal
69680           .append('div')
69681           .attr('class', 'content');
69682
69683       if (animate) {
69684           shaded.transition().style('opacity', 1);
69685       } else {
69686           shaded.style('opacity', 1);
69687       }
69688
69689
69690       return shaded;
69691   }
69692
69693   function uiIntroStartEditing(context, reveal) {
69694       var dispatch$1 = dispatch('done', 'startEditing');
69695       var modalSelection = select(null);
69696
69697
69698       var chapter = {
69699           title: 'intro.startediting.title'
69700       };
69701
69702       function showHelp() {
69703           reveal('.map-control.help-control',
69704               t('intro.startediting.help', { button: icon('#iD-icon-help', 'pre-text'), key: t('help.key') }), {
69705                   buttonText: t('intro.ok'),
69706                   buttonCallback: function() { shortcuts(); }
69707               }
69708           );
69709       }
69710
69711       function shortcuts() {
69712           reveal('.map-control.help-control',
69713               t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
69714                   buttonText: t('intro.ok'),
69715                   buttonCallback: function() { showSave(); }
69716               }
69717           );
69718       }
69719
69720       function showSave() {
69721           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
69722           reveal('#bar button.save',
69723               t('intro.startediting.save'), {
69724                   buttonText: t('intro.ok'),
69725                   buttonCallback: function() { showStart(); }
69726               }
69727           );
69728       }
69729
69730       function showStart() {
69731           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
69732
69733           modalSelection = uiModal(context.container());
69734
69735           modalSelection.select('.modal')
69736               .attr('class', 'modal-splash modal col6');
69737
69738           modalSelection.selectAll('.close').remove();
69739
69740           var startbutton = modalSelection.select('.content')
69741               .attr('class', 'fillL')
69742               .append('button')
69743                   .attr('class', 'modal-section huge-modal-button')
69744                   .on('click', function() {
69745                       modalSelection.remove();
69746                   });
69747
69748               startbutton
69749                   .append('svg')
69750                   .attr('class', 'illustration')
69751                   .append('use')
69752                   .attr('xlink:href', '#iD-logo-walkthrough');
69753
69754               startbutton
69755                   .append('h2')
69756                   .text(t('intro.startediting.start'));
69757
69758           dispatch$1.call('startEditing');
69759       }
69760
69761
69762       chapter.enter = function() {
69763           showHelp();
69764       };
69765
69766
69767       chapter.exit = function() {
69768           modalSelection.remove();
69769           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
69770       };
69771
69772
69773       return utilRebind(chapter, dispatch$1, 'on');
69774   }
69775
69776   var chapterUi = {
69777       welcome: uiIntroWelcome,
69778       navigation: uiIntroNavigation,
69779       point: uiIntroPoint,
69780       area: uiIntroArea,
69781       line: uiIntroLine,
69782       building: uiIntroBuilding,
69783       startEditing: uiIntroStartEditing
69784   };
69785
69786   var chapterFlow = [
69787       'welcome',
69788       'navigation',
69789       'point',
69790       'area',
69791       'line',
69792       'building',
69793       'startEditing'
69794   ];
69795
69796
69797   function uiIntro(context) {
69798       var INTRO_IMAGERY = 'EsriWorldImageryClarity';
69799       var introGraph = {};
69800       var _currChapter;
69801
69802       // create entities for intro graph and localize names
69803       for (var id in dataIntroGraph) {
69804           introGraph[id] = osmEntity(localize(dataIntroGraph[id]));
69805       }
69806
69807
69808       function intro(selection) {
69809           context.enter(modeBrowse(context));
69810
69811           // Save current map state
69812           var osm = context.connection();
69813           var history = context.history().toJSON();
69814           var hash = window.location.hash;
69815           var center = context.map().center();
69816           var zoom = context.map().zoom();
69817           var background = context.background().baseLayerSource();
69818           var overlays = context.background().overlayLayerSources();
69819           var opacity = d3_selectAll('#map .layer-background').style('opacity');
69820           var caches = osm && osm.caches();
69821           var baseEntities = context.history().graph().base().entities;
69822           var countryCode = services.geocoder.countryCode;
69823
69824           // Show sidebar and disable the sidebar resizing button
69825           // (this needs to be before `context.inIntro(true)`)
69826           context.ui().sidebar.expand();
69827           d3_selectAll('button.sidebar-toggle').classed('disabled', true);
69828
69829           // Block saving
69830           context.inIntro(true);
69831
69832           // Load semi-real data used in intro
69833           if (osm) { osm.toggle(false).reset(); }
69834           context.history().reset();
69835           context.history().merge(values$1(coreGraph().load(introGraph).entities));
69836           context.history().checkpoint('initial');
69837
69838           // Setup imagery
69839           var imagery = context.background().findSource(INTRO_IMAGERY);
69840           if (imagery) {
69841               context.background().baseLayerSource(imagery);
69842           } else {
69843               context.background().bing();
69844           }
69845           overlays.forEach(function(d) {
69846               context.background().toggleOverlayLayer(d);
69847           });
69848
69849           // Setup data layers (only OSM)
69850           var layers = context.layers();
69851           layers.all().forEach(function(item) {
69852               // if the layer has the function `enabled`
69853               if (typeof item.layer.enabled === 'function') {
69854                   item.layer.enabled(item.id === 'osm');
69855               }
69856           });
69857
69858           // Mock geocoder
69859           services.geocoder.countryCode = function(location, callback) {
69860               callback(null, t('intro.graph.countrycode'));
69861           };
69862
69863
69864           d3_selectAll('#map .layer-background').style('opacity', 1);
69865
69866           var curtain = uiCurtain();
69867           selection.call(curtain);
69868
69869           // Store that the user started the walkthrough..
69870           context.storage('walkthrough_started', 'yes');
69871
69872           // Restore previous walkthrough progress..
69873           var storedProgress = context.storage('walkthrough_progress') || '';
69874           var progress = storedProgress.split(';').filter(Boolean);
69875
69876           var chapters = chapterFlow.map(function(chapter, i) {
69877               var s = chapterUi[chapter](context, curtain.reveal)
69878                   .on('done', function() {
69879                       context.presets().init();  // clear away "recent" presets
69880
69881                       buttons.filter(function(d) {
69882                           return d.title === s.title;
69883                       }).classed('finished', true);
69884
69885                       if (i < chapterFlow.length - 1) {
69886                           var next = chapterFlow[i + 1];
69887                           select('button.chapter-' + next)
69888                               .classed('next', true);
69889                       }
69890
69891                       // Store walkthrough progress..
69892                       progress.push(chapter);
69893                       context.storage('walkthrough_progress', uniq(progress).join(';'));
69894                   });
69895               return s;
69896           });
69897
69898           chapters[chapters.length - 1].on('startEditing', function() {
69899               // Store walkthrough progress..
69900               progress.push('startEditing');
69901               context.storage('walkthrough_progress', uniq(progress).join(';'));
69902
69903               // Store if walkthrough is completed..
69904               var incomplete = difference(chapterFlow, progress);
69905               if (!incomplete.length) {
69906                   context.storage('walkthrough_completed', 'yes');
69907               }
69908
69909               curtain.remove();
69910               navwrap.remove();
69911               d3_selectAll('#map .layer-background').style('opacity', opacity);
69912               d3_selectAll('button.sidebar-toggle').classed('disabled', false);
69913               if (osm) { osm.toggle(true).reset().caches(caches); }
69914               context.history().reset().merge(values$1(baseEntities));
69915               context.background().baseLayerSource(background);
69916               overlays.forEach(function(d) { context.background().toggleOverlayLayer(d); });
69917               if (history) { context.history().fromJSON(history, false); }
69918               context.map().centerZoom(center, zoom);
69919               window.location.replace(hash);
69920               services.geocoder.countryCode = countryCode;
69921               context.inIntro(false);
69922           });
69923
69924           var navwrap = selection
69925               .append('div')
69926               .attr('class', 'intro-nav-wrap fillD');
69927
69928           navwrap
69929               .append('svg')
69930               .attr('class', 'intro-nav-wrap-logo')
69931               .append('use')
69932               .attr('xlink:href', '#iD-logo-walkthrough');
69933
69934           var buttonwrap = navwrap
69935               .append('div')
69936               .attr('class', 'joined')
69937               .selectAll('button.chapter');
69938
69939           var buttons = buttonwrap
69940               .data(chapters)
69941               .enter()
69942               .append('button')
69943               .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
69944               .on('click', enterChapter);
69945
69946           buttons
69947               .append('span')
69948               .text(function(d) { return t(d.title); });
69949
69950           buttons
69951               .append('span')
69952               .attr('class', 'status')
69953               .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
69954
69955           enterChapter(chapters[0]);
69956
69957
69958           function enterChapter(newChapter) {
69959               if (_currChapter) { _currChapter.exit(); }
69960               context.enter(modeBrowse(context));
69961
69962               _currChapter = newChapter;
69963               _currChapter.enter();
69964
69965               buttons
69966                   .classed('next', false)
69967                   .classed('active', function(d) {
69968                       return d.title === _currChapter.title;
69969                   });
69970           }
69971       }
69972
69973
69974       return intro;
69975   }
69976
69977   function uiTooltipHtml(text, key, heading) {
69978       var s = '';
69979
69980       if (heading) {
69981           s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
69982       }
69983       if (text) {
69984           s += '<div class="tooltip-text"><span>' + text + '</span></div>';
69985       }
69986       if (key) {
69987           s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
69988               '<span class="keyhint">' + key + '</span></div>';
69989       }
69990
69991       return s;
69992   }
69993
69994   function uiIssues(context) {
69995       var key = t('issues.key');
69996       //var _featureApplicabilityList = d3_select(null);
69997       var _errorsList = select(null);
69998       var _warningsList = select(null);
69999       var _pane = select(null);
70000       var _toggleButton = select(null);
70001       var _shown = false;
70002
70003       context.validator().on('reload.issues_pane', update);
70004
70005       /*function renderIssuesOptions(selection) {
70006           var container = selection.selectAll('.issues-options-container')
70007               .data([0]);
70008
70009           container = container.enter()
70010               .append('div')
70011               .attr('class', 'issues-options-container')
70012               .merge(container);
70013
70014           _featureApplicabilityList = container.selectAll('.feature-applicability-list')
70015               .data([0]);
70016
70017           _featureApplicabilityList = _featureApplicabilityList.enter()
70018               .append('ul')
70019               .attr('class', 'layer-list feature-applicability-list')
70020               .merge(_featureApplicabilityList);
70021
70022           updateFeatureApplicabilityList();
70023       }*/
70024
70025       function addIconBadge(selection) {
70026           var d = 10;
70027           selection.selectAll('svg.icon-badge')
70028               .data([0])
70029               .enter()
70030               .append('svg')
70031               .attr('viewbox', '0 0 ' + d + ' ' + d)
70032               .attr('class', 'icon-badge')
70033               .append('circle')
70034               .attr('cx', d / 2)
70035               .attr('cy', d / 2)
70036               .attr('r', (d / 2) - 1)
70037               .attr('fill', 'currentColor');
70038       }
70039
70040       function renderErrorsList(selection) {
70041           _errorsList = selection.selectAll('.errors-list')
70042               .data([0]);
70043
70044           _errorsList = _errorsList.enter()
70045               .append('ul')
70046               .attr('class', 'layer-list errors-list issues-list')
70047               .merge(_errorsList);
70048
70049           updateErrorsList();
70050       }
70051
70052       function renderWarningsList(selection) {
70053           _warningsList = selection.selectAll('.warnings-list')
70054               .data([0]);
70055
70056           _warningsList = _warningsList.enter()
70057               .append('ul')
70058               .attr('class', 'layer-list warnings-list issues-list')
70059               .merge(_warningsList);
70060
70061           updateWarningsList();
70062       }
70063
70064
70065       function drawIssuesList(selection, issues) {
70066           var items = selection.selectAll('li')
70067               .data(issues, function(d) { return d.id(); });
70068
70069           // Exit
70070           items.exit()
70071               .remove();
70072
70073           // Enter
70074           var itemsEnter = items.enter()
70075               .append('li')
70076               .attr('class', function (d) { return 'issue severity-' + d.severity; })
70077               .on('click', function(d) {
70078                   var extent = d.extent(context.graph());
70079                   if (extent) {
70080                       var msec = 0;
70081                       var view = context.map().trimmedExtent();
70082                       var zoom = context.map().zoom();
70083
70084                       // make sure user can see the issue
70085                       if (!view.contains(extent) || zoom < 19) {
70086                           msec = 250;
70087                           context.map().centerZoomEase(extent.center(), Math.max(zoom, 19), msec);
70088                       }
70089
70090                       // select the first entity
70091                       if (d.entities && d.entities.length) {
70092                           window.setTimeout(function() {
70093                               var ids = d.entities.map(function(e) { return e.id; });
70094                               context.enter(modeSelect(context, [ids[0]]));
70095                               utilHighlightEntities(ids, true, context);
70096                           }, msec);
70097                       }
70098                   }
70099               })
70100               .on('mouseover', function(d) {
70101                   var ids = d.entities.map(function(e) { return e.id; });
70102                   utilHighlightEntities(ids, true, context);
70103               })
70104               .on('mouseout', function(d) {
70105                   var ids = d.entities.map(function(e) { return e.id; });
70106                   utilHighlightEntities(ids, false, context);
70107               });
70108
70109
70110           var messagesEnter = itemsEnter
70111               .append('button')
70112               .attr('class', 'message');
70113
70114           messagesEnter
70115               .call(tooltip()
70116                   .html(true)
70117                   .title(function(d) { return uiTooltipHtml(d.tooltip); })
70118                   .placement('top')
70119               );
70120
70121           messagesEnter
70122               .append('span')
70123               .attr('class', 'issue-icon')
70124               .call(svgIcon('', 'pre-text'));
70125
70126           messagesEnter
70127               .append('span')
70128               .attr('class', 'issue-text');
70129
70130
70131           // Update
70132           items = items
70133               .merge(itemsEnter);
70134
70135           items.select('.issue-icon svg use')     // propagate bound data
70136               .attr('href', function(d) {
70137                   return '#iD-icon-' + (d.severity === 'warning' ? 'alert' : 'error');
70138               });
70139
70140           items.select('.issue-text')     // propagate bound data
70141               .text(function(d) { return d.message; });
70142       }
70143
70144
70145       function renderNoIssuesBox(selection) {
70146           selection
70147               .append('div')
70148               .call(svgIcon('#iD-icon-apply', 'pre-text'));
70149
70150           var noIssuesMessage = selection
70151               .append('span');
70152
70153           noIssuesMessage
70154               .append('strong')
70155               .text(t('issues.no_issues.message'));
70156
70157           noIssuesMessage
70158               .append('br');
70159
70160           noIssuesMessage
70161               .append('span')
70162               .text(t('issues.no_issues.info'));
70163       }
70164
70165       /*
70166       function showsFeatureApplicability(d) {
70167           return context.validator().getFeatureApplicability() === d;
70168       }
70169
70170       function setFeatureApplicability(d) {
70171           context.validator().setFeatureApplicability(d);
70172           update();
70173       }
70174
70175       function updateFeatureApplicabilityList() {
70176           _featureApplicabilityList
70177               .call(
70178                   drawListItems,
70179                   context.validator().featureApplicabilityOptions,
70180                   'radio',
70181                   'features_to_validate',
70182                   setFeatureApplicability,
70183                   showsFeatureApplicability
70184               );
70185       }*/
70186
70187       function updateErrorsList() {
70188           var errors = context.validator().getErrors();
70189           _errorsList
70190               .call(drawIssuesList, errors);
70191       }
70192
70193
70194       function updateWarningsList() {
70195           var warnings = context.validator().getWarnings();
70196           _warningsList
70197               .call(drawIssuesList, warnings);
70198       }
70199
70200
70201       function update() {
70202           var errors = context.validator().getErrors();
70203           var warnings = context.validator().getWarnings();
70204
70205           _toggleButton.selectAll('.icon-badge')
70206               .classed('error', (errors.length > 0))
70207               .classed('warning', (errors.length === 0 && warnings.length > 0))
70208               .classed('hide', (errors.length === 0 && warnings.length === 0));
70209
70210           _pane.select('.issues-errors')
70211               .classed('hide', errors.length === 0);
70212
70213           if (errors.length > 0) {
70214               _pane.select('.hide-toggle-issues_errors .hide-toggle-text')
70215                   .text(t('issues.errors.list_title', { count: errors.length }));
70216               if (!_pane.select('.disclosure-wrap-issues_errors').classed('hide')) {
70217                   updateErrorsList();
70218               }
70219           }
70220
70221           _pane.select('.issues-warnings')
70222               .classed('hide', warnings.length === 0);
70223
70224           if (warnings.length > 0) {
70225               _pane.select('.hide-toggle-issues_warnings .hide-toggle-text')
70226                   .text(t('issues.warnings.list_title', { count: warnings.length }));
70227               if (!_pane.select('.disclosure-wrap-issues_warnings').classed('hide')) {
70228                   updateWarningsList();
70229               }
70230           }
70231
70232           _pane.select('.issues-none')
70233               .classed('hide', warnings.length > 0 || errors.length > 0);
70234
70235           //if (!_pane.select('.disclosure-wrap-issues_options').classed('hide')) {
70236           //    updateFeatureApplicabilityList();
70237           //}
70238       }
70239
70240       var paneTooltip = tooltip()
70241           .placement((textDirection === 'rtl') ? 'right' : 'left')
70242           .html(true)
70243           .title(uiTooltipHtml(t('issues.title'), key));
70244
70245       uiIssues.hidePane = function() {
70246           uiIssues.setVisible(false);
70247       };
70248
70249       uiIssues.togglePane = function() {
70250           if (event) event.preventDefault();
70251           paneTooltip.hide(_toggleButton);
70252           uiIssues.setVisible(!_toggleButton.classed('active'));
70253       };
70254
70255       uiIssues.setVisible = function(show) {
70256           if (show !== _shown) {
70257               _toggleButton.classed('active', show);
70258               _shown = show;
70259
70260               if (show) {
70261                   uiBackground.hidePane();
70262                   uiHelp.hidePane();
70263                   uiMapData.hidePane();
70264                   update();
70265
70266                   _pane
70267                       .style('display', 'block')
70268                       .style('right', '-300px')
70269                       .transition()
70270                       .duration(200)
70271                       .style('right', '0px');
70272
70273               } else {
70274                   _pane
70275                       .style('display', 'block')
70276                       .style('right', '0px')
70277                       .transition()
70278                       .duration(200)
70279                       .style('right', '-300px')
70280                       .on('end', function() {
70281                           select(this).style('display', 'none');
70282                       });
70283               }
70284           }
70285       };
70286
70287       uiIssues.renderToggleButton = function(selection) {
70288
70289           _toggleButton = selection
70290               .append('button')
70291               .attr('tabindex', -1)
70292               .on('click', uiIssues.togglePane)
70293               .call(svgIcon('#iD-icon-alert', 'light'))
70294               .call(addIconBadge)
70295               .call(paneTooltip);
70296
70297       };
70298
70299       uiIssues.renderPane = function(selection) {
70300
70301           _pane = selection
70302               .append('div')
70303               .attr('class', 'fillL map-pane issues-pane hide');
70304
70305           var heading = _pane
70306               .append('div')
70307               .attr('class', 'pane-heading');
70308
70309           heading
70310               .append('h2')
70311               .text(t('issues.title'));
70312
70313           heading
70314               .append('button')
70315               .on('click', uiIssues.hidePane)
70316               .call(svgIcon('#iD-icon-close'));
70317
70318           var content = _pane
70319               .append('div')
70320               .attr('class', 'pane-content');
70321
70322           content
70323               .append('div')
70324               .attr('class', 'issues-none')
70325               .call(renderNoIssuesBox);
70326
70327           // errors
70328           content
70329               .append('div')
70330               .attr('class', 'issues-errors')
70331               .call(uiDisclosure(context, 'issues_errors', true)
70332                   .content(renderErrorsList)
70333               );
70334
70335           // warnings
70336           content
70337               .append('div')
70338               .attr('class', 'issues-warnings')
70339               .call(uiDisclosure(context, 'issues_warnings', true)
70340                   .content(renderWarningsList)
70341               );
70342
70343           // options
70344           /*
70345           // add this back to core.yaml when re-enabling the options
70346           options:
70347             title: Options
70348           features_to_validate:
70349             edited:
70350               description: Edited features only
70351               tooltip: Flag issues with features you create and modify
70352             all:
70353               description: All features
70354               tooltip: Flag issues with all nearby features
70355
70356           content
70357               .append('div')
70358               .attr('class', 'issues-options')
70359               .call(uiDisclosure(context, 'issues_options', true)
70360                   .title(t('issues.options.title'))
70361                   .content(renderIssuesOptions)
70362               );
70363           */
70364           update();
70365
70366           context.keybinding()
70367               .on(key, uiIssues.togglePane);
70368       };
70369
70370       return uiIssues;
70371   }
70372
70373   function uiConfirm(selection) {
70374       var modalSelection = uiModal(selection);
70375
70376       modalSelection.select('.modal')
70377           .classed('modal-alert', true);
70378
70379       var section = modalSelection.select('.content');
70380
70381       section.append('div')
70382           .attr('class', 'modal-section header');
70383
70384       section.append('div')
70385           .attr('class', 'modal-section message-text');
70386
70387       var buttons = section.append('div')
70388           .attr('class', 'modal-section buttons cf');
70389
70390
70391       modalSelection.okButton = function() {
70392           buttons
70393               .append('button')
70394               .attr('class', 'button ok-button action')
70395               .on('click.confirm', function() {
70396                   modalSelection.remove();
70397               })
70398               .text(t('confirm.okay'))
70399               .node()
70400               .focus();
70401
70402           return modalSelection;
70403       };
70404
70405
70406       return modalSelection;
70407   }
70408
70409   function uiSettingsCustomData(context) {
70410       var dispatch$1 = dispatch('change');
70411
70412       function render(selection) {
70413           var dataLayer = context.layers().layer('data');
70414           var _origSettings = {
70415               fileList: (dataLayer && dataLayer.fileList()) || null,
70416               url: context.storage('settings-custom-data-url')
70417           };
70418           var _currSettings = cloneDeep(_origSettings);
70419
70420           // var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
70421           var modal = uiConfirm(selection).okButton();
70422
70423           modal
70424               .classed('settings-modal settings-custom-data', true);
70425
70426           modal.select('.modal-section.header')
70427               .append('h3')
70428               .text(t('settings.custom_data.header'));
70429
70430
70431           var textSection = modal.select('.modal-section.message-text');
70432
70433           textSection
70434               .append('pre')
70435               .attr('class', 'instructions-file')
70436               .text(t('settings.custom_data.file.instructions'));
70437
70438           textSection
70439               .append('input')
70440               .attr('class', 'field-file')
70441               .attr('type', 'file')
70442               .property('files', _currSettings.fileList)  // works for all except IE11
70443               .on('change', function() {
70444                   var files = event.target.files;
70445                   if (files && files.length) {
70446                       _currSettings.url = '';
70447                       textSection.select('.field-url').property('value', '');
70448                       _currSettings.fileList = files;
70449                   } else {
70450                       _currSettings.fileList = null;
70451                   }
70452               });
70453
70454           textSection
70455               .append('h4')
70456               .text(t('settings.custom_data.or'));
70457
70458           textSection
70459               .append('pre')
70460               .attr('class', 'instructions-url')
70461               .text(t('settings.custom_data.url.instructions'));
70462
70463           textSection
70464               .append('textarea')
70465               .attr('class', 'field-url')
70466               .attr('placeholder', t('settings.custom_data.url.placeholder'))
70467               .call(utilNoAuto)
70468               .property('value', _currSettings.url);
70469
70470
70471           // insert a cancel button
70472           var buttonSection = modal.select('.modal-section.buttons');
70473
70474           buttonSection
70475               .insert('button', '.ok-button')
70476               .attr('class', 'button cancel-button secondary-action')
70477               .text(t('confirm.cancel'));
70478
70479
70480           buttonSection.select('.cancel-button')
70481               .on('click.cancel', clickCancel);
70482
70483           buttonSection.select('.ok-button')
70484               .attr('disabled', isSaveDisabled)
70485               .on('click.save', clickSave);
70486
70487
70488           function isSaveDisabled() {
70489               return null;
70490           }
70491
70492
70493           // restore the original url
70494           function clickCancel() {
70495               textSection.select('.field-url').property('value', _origSettings.url);
70496               context.storage('settings-custom-data-url', _origSettings.url);
70497               this.blur();
70498               modal.close();
70499           }
70500
70501           // accept the current url
70502           function clickSave() {
70503               _currSettings.url = textSection.select('.field-url').property('value').trim();
70504
70505               // one or the other but not both
70506               if (_currSettings.url) { _currSettings.fileList = null; }
70507               if (_currSettings.fileList) { _currSettings.url = ''; }
70508
70509               context.storage('settings-custom-data-url', _currSettings.url);
70510               this.blur();
70511               modal.close();
70512               dispatch$1.call('change', this, _currSettings);
70513           }
70514       }
70515
70516       return utilRebind(render, dispatch$1, 'on');
70517   }
70518
70519   function uiMapData(context) {
70520       var key = t('map_data.key');
70521       var features = context.features().keys();
70522       var layers = context.layers();
70523       var fills = ['wireframe', 'partial', 'full'];
70524
70525       var settingsCustomData = uiSettingsCustomData(context)
70526           .on('change', customChanged);
70527
70528       var _pane = select(null), _toggleButton = select(null);
70529
70530       var _fillSelected = context.storage('area-fill') || 'partial';
70531       var _shown = false;
70532       var _dataLayerContainer = select(null);
70533       var _fillList = select(null);
70534       var _featureList = select(null);
70535       var _QAList = select(null);
70536
70537
70538       function showsFeature(d) {
70539           return context.features().enabled(d);
70540       }
70541
70542
70543       function autoHiddenFeature(d) {
70544           if (d.type === 'kr_error') return context.errors().autoHidden(d);
70545           return context.features().autoHidden(d);
70546       }
70547
70548
70549       function clickFeature(d) {
70550           context.features().toggle(d);
70551           update();
70552       }
70553
70554
70555       function showsQA(d) {
70556           var QAKeys = [d];
70557           var QALayers = layers.all().filter(function(obj) { return QAKeys.indexOf(obj.id) !== -1; });
70558           var data = QALayers.filter(function(obj) { return obj.layer.supported(); });
70559
70560           function layerSupported(d) {
70561               return d.layer && d.layer.supported();
70562           }
70563           function layerEnabled(d) {
70564               return layerSupported(d) && d.layer.enabled();
70565           }
70566
70567           return layerEnabled(data[0]);
70568       }
70569
70570
70571       function showsFill(d) {
70572           return _fillSelected === d;
70573       }
70574
70575
70576       function setFill(d) {
70577           fills.forEach(function(opt) {
70578               context.surface().classed('fill-' + opt, Boolean(opt === d));
70579           });
70580
70581           _fillSelected = d;
70582           context.storage('area-fill', d);
70583           if (d !== 'wireframe') {
70584               context.storage('area-fill-toggle', d);
70585           }
70586           update();
70587       }
70588
70589
70590       function showsLayer(which) {
70591           var layer = layers.layer(which);
70592           if (layer) {
70593               return layer.enabled();
70594           }
70595           return false;
70596       }
70597
70598
70599       function setLayer(which, enabled) {
70600           var layer = layers.layer(which);
70601           if (layer) {
70602               layer.enabled(enabled);
70603
70604               if (!enabled && (which === 'osm' || which === 'notes')) {
70605                   context.enter(modeBrowse(context));
70606               }
70607
70608               update();
70609           }
70610       }
70611
70612
70613       function toggleLayer(which) {
70614           setLayer(which, !showsLayer(which));
70615       }
70616
70617
70618       function drawPhotoItems(selection) {
70619           var photoKeys = ['streetside', 'mapillary-images', 'mapillary-signs', 'openstreetcam-images'];
70620           var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
70621           var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
70622
70623           function layerSupported(d) {
70624               return d.layer && d.layer.supported();
70625           }
70626           function layerEnabled(d) {
70627               return layerSupported(d) && d.layer.enabled();
70628           }
70629
70630           var ul = selection
70631               .selectAll('.layer-list-photos')
70632               .data([0]);
70633
70634           ul = ul.enter()
70635               .append('ul')
70636               .attr('class', 'layer-list layer-list-photos')
70637               .merge(ul);
70638
70639           var li = ul.selectAll('.list-item-photos')
70640               .data(data);
70641
70642           li.exit()
70643               .remove();
70644
70645           var liEnter = li.enter()
70646               .append('li')
70647               .attr('class', function(d) { return 'list-item-photos list-item-' + d.id; });
70648
70649           var labelEnter = liEnter
70650               .append('label')
70651               .each(function(d) {
70652                   select(this)
70653                       .call(tooltip()
70654                           .title(t(d.id.replace('-', '_') + '.tooltip'))
70655                           .placement('top')
70656                       );
70657               });
70658
70659           labelEnter
70660               .append('input')
70661               .attr('type', 'checkbox')
70662               .on('change', function(d) { toggleLayer(d.id); });
70663
70664           labelEnter
70665               .append('span')
70666               .text(function(d) { return t(d.id.replace('-', '_') + '.title'); });
70667
70668
70669           // Update
70670           li
70671               .merge(liEnter)
70672               .classed('active', layerEnabled)
70673               .selectAll('input')
70674               .property('checked', layerEnabled);
70675       }
70676
70677
70678       function drawOsmItems(selection) {
70679           var osmKeys = ['osm', 'notes'];
70680           var osmLayers = layers.all().filter(function(obj) { return osmKeys.indexOf(obj.id) !== -1; });
70681
70682           var ul = selection
70683               .selectAll('.layer-list-osm')
70684               .data([0]);
70685
70686           ul = ul.enter()
70687               .append('ul')
70688               .attr('class', 'layer-list layer-list-osm')
70689               .merge(ul);
70690
70691           var li = ul.selectAll('.list-item')
70692               .data(osmLayers);
70693
70694           li.exit()
70695               .remove();
70696
70697           var liEnter = li.enter()
70698               .append('li')
70699               .attr('class', function(d) { return 'list-item list-item-' + d.id; });
70700
70701           var labelEnter = liEnter
70702               .append('label')
70703               .each(function(d) {
70704                   select(this)
70705                       .call(tooltip()
70706                           .title(t('map_data.layers.' + d.id + '.tooltip'))
70707                           .placement('bottom')
70708                       );
70709               });
70710
70711           labelEnter
70712               .append('input')
70713               .attr('type', 'checkbox')
70714               .on('change', function(d) { toggleLayer(d.id); });
70715
70716           labelEnter
70717               .append('span')
70718               .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
70719
70720
70721           // Update
70722           li
70723               .merge(liEnter)
70724               .classed('active', function (d) { return d.layer.enabled(); })
70725               .selectAll('input')
70726               .property('checked', function (d) { return d.layer.enabled(); });
70727       }
70728
70729
70730       function drawQAItems(selection) {
70731           var qaKeys = ['keepRight', 'improveOSM'];
70732           var qaLayers = layers.all().filter(function(obj) { return qaKeys.indexOf(obj.id) !== -1; });
70733
70734           var ul = selection
70735               .selectAll('.layer-list-qa')
70736               .data([0]);
70737
70738           ul = ul.enter()
70739               .append('ul')
70740               .attr('class', 'layer-list layer-list-qa')
70741               .merge(ul);
70742
70743           var li = ul.selectAll('.list-item')
70744               .data(qaLayers);
70745
70746           li.exit()
70747               .remove();
70748
70749           var liEnter = li.enter()
70750               .append('li')
70751               .attr('class', function(d) { return 'list-item list-item-' + d.id; });
70752
70753           var labelEnter = liEnter
70754               .append('label')
70755               .each(function(d) {
70756                   select(this)
70757                       .call(tooltip()
70758                           .title(t('map_data.layers.' + d.id + '.tooltip'))
70759                           .placement('bottom')
70760                       );
70761               });
70762
70763           labelEnter
70764               .append('input')
70765               .attr('type', 'checkbox')
70766               .on('change', function(d) { toggleLayer(d.id); });
70767
70768           labelEnter
70769               .append('span')
70770               .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
70771
70772
70773           // Update
70774           li
70775               .merge(liEnter)
70776               .classed('active', function (d) { return d.layer.enabled(); })
70777               .selectAll('input')
70778               .property('checked', function (d) { return d.layer.enabled(); });
70779       }
70780
70781
70782       // Beta feature - sample vector layers to support Detroit Mapping Challenge
70783       // https://github.com/osmus/detroit-mapping-challenge
70784       function drawVectorItems(selection) {
70785           var dataLayer = layers.layer('data');
70786           var vtData = [
70787               {
70788                   name: 'Detroit Neighborhoods/Parks',
70789                   src: 'neighborhoods-parks',
70790                   tooltip: 'Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.',
70791                   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'
70792               }, {
70793                   name: 'Detroit Composite POIs',
70794                   src: 'composite-poi',
70795                   tooltip: 'Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.',
70796                   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'
70797               }, {
70798                   name: 'Detroit All-The-Places POIs',
70799                   src: 'alltheplaces-poi',
70800                   tooltip: 'Public domain business location data created by web scrapers.',
70801                   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'
70802               }
70803           ];
70804
70805           // Only show this if the map is around Detroit..
70806           var detroit = geoExtent([-83.5, 42.1], [-82.8, 42.5]);
70807           var showVectorItems = (context.map().zoom() > 9 && detroit.contains(context.map().center()));
70808
70809           var container = selection.selectAll('.vectortile-container')
70810               .data(showVectorItems ? [0] : []);
70811
70812           container.exit()
70813               .remove();
70814
70815           var containerEnter = container.enter()
70816               .append('div')
70817               .attr('class', 'vectortile-container');
70818
70819           containerEnter
70820               .append('h4')
70821               .attr('class', 'vectortile-header')
70822               .text('Detroit Vector Tiles (Beta)');
70823
70824           containerEnter
70825               .append('ul')
70826               .attr('class', 'layer-list layer-list-vectortile');
70827
70828           containerEnter
70829               .append('div')
70830               .attr('class', 'vectortile-footer')
70831               .append('a')
70832               .attr('target', '_blank')
70833               .attr('tabindex', -1)
70834               .call(svgIcon('#iD-icon-out-link', 'inline'))
70835               .attr('href', 'https://github.com/osmus/detroit-mapping-challenge')
70836               .append('span')
70837               .text('About these layers');
70838
70839           container = container
70840               .merge(containerEnter);
70841
70842
70843           var ul = container.selectAll('.layer-list-vectortile');
70844
70845           var li = ul.selectAll('.list-item')
70846               .data(vtData);
70847
70848           li.exit()
70849               .remove();
70850
70851           var liEnter = li.enter()
70852               .append('li')
70853               .attr('class', function(d) { return 'list-item list-item-' + d.src; });
70854
70855           var labelEnter = liEnter
70856               .append('label')
70857               .each(function(d) {
70858                   select(this).call(
70859                       tooltip().title(d.tooltip).placement('top')
70860                   );
70861               });
70862
70863           labelEnter
70864               .append('input')
70865               .attr('type', 'radio')
70866               .attr('name', 'vectortile')
70867               .on('change', selectVTLayer);
70868
70869           labelEnter
70870               .append('span')
70871               .text(function(d) { return d.name; });
70872
70873           // Update
70874           li
70875               .merge(liEnter)
70876               .classed('active', isVTLayerSelected)
70877               .selectAll('input')
70878               .property('checked', isVTLayerSelected);
70879
70880
70881           function isVTLayerSelected(d) {
70882               return dataLayer && dataLayer.template() === d.template;
70883           }
70884
70885           function selectVTLayer(d) {
70886               context.storage('settings-custom-data-url', d.template);
70887               if (dataLayer) {
70888                   dataLayer.template(d.template, d.src);
70889                   dataLayer.enabled(true);
70890               }
70891           }
70892       }
70893
70894
70895       function drawCustomDataItems(selection) {
70896           var dataLayer = layers.layer('data');
70897           var hasData = dataLayer && dataLayer.hasData();
70898           var showsData = hasData && dataLayer.enabled();
70899
70900           var ul = selection
70901               .selectAll('.layer-list-data')
70902               .data(dataLayer ? [0] : []);
70903
70904           // Exit
70905           ul.exit()
70906               .remove();
70907
70908           // Enter
70909           var ulEnter = ul.enter()
70910               .append('ul')
70911               .attr('class', 'layer-list layer-list-data');
70912
70913           var liEnter = ulEnter
70914               .append('li')
70915               .attr('class', 'list-item-data');
70916
70917           liEnter
70918               .append('button')
70919               .call(tooltip()
70920                   .title(t('settings.custom_data.tooltip'))
70921                   .placement((textDirection === 'rtl') ? 'right' : 'left')
70922               )
70923               .on('click', editCustom)
70924               .call(svgIcon('#iD-icon-more'));
70925
70926           liEnter
70927               .append('button')
70928               .call(tooltip()
70929                   .title(t('map_data.layers.custom.zoom'))
70930                   .placement((textDirection === 'rtl') ? 'right' : 'left')
70931               )
70932               .on('click', function() {
70933                   event.preventDefault();
70934                   event.stopPropagation();
70935                   dataLayer.fitZoom();
70936               })
70937               .call(svgIcon('#iD-icon-search'));
70938
70939           var labelEnter = liEnter
70940               .append('label')
70941               .call(tooltip()
70942                   .title(t('map_data.layers.custom.tooltip'))
70943                   .placement('top')
70944               );
70945
70946           labelEnter
70947               .append('input')
70948               .attr('type', 'checkbox')
70949               .on('change', function() { toggleLayer('data'); });
70950
70951           labelEnter
70952               .append('span')
70953               .text(t('map_data.layers.custom.title'));
70954
70955           // Update
70956           ul = ul
70957               .merge(ulEnter);
70958
70959           ul.selectAll('.list-item-data')
70960               .classed('active', showsData)
70961               .selectAll('label')
70962               .classed('deemphasize', !hasData)
70963               .selectAll('input')
70964               .property('disabled', !hasData)
70965               .property('checked', showsData);
70966       }
70967
70968
70969       function editCustom() {
70970           event.preventDefault();
70971           context.container()
70972               .call(settingsCustomData);
70973       }
70974
70975
70976       function customChanged(d) {
70977           var dataLayer = layers.layer('data');
70978
70979           if (d && d.url) {
70980               dataLayer.url(d.url);
70981           } else if (d && d.fileList) {
70982               dataLayer.fileList(d.fileList);
70983           }
70984       }
70985
70986
70987       function drawListItems(selection, data, type, name, change, active) {
70988           var items = selection.selectAll('li')
70989               .data(data);
70990
70991           // Exit
70992           items.exit()
70993               .remove();
70994
70995           // Enter
70996           var enter = items.enter()
70997               .append('li')
70998               .call(tooltip()
70999                   .html(true)
71000                   .title(function(d) {
71001                       var tip = t(name + '.' + d + '.tooltip');
71002                       var key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
71003                       if ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d)) {
71004                           var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
71005                           tip += '<div>' + msg + '</div>';
71006                       }
71007                       return uiTooltipHtml(tip, key);
71008                   })
71009                   .placement('top')
71010               );
71011
71012           var label = enter
71013               .append('label');
71014
71015           label
71016               .append('input')
71017               .attr('type', type)
71018               .attr('name', name)
71019               .on('change', change);
71020
71021           label
71022               .append('span')
71023               .text(function(d) { return t(name + '.' + d + '.description'); });
71024
71025           // Update
71026           items = items
71027               .merge(enter);
71028
71029           items
71030               .classed('active', active)
71031               .selectAll('input')
71032               .property('checked', active)
71033               .property('indeterminate', function(d) {
71034                   return ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d));
71035               });
71036       }
71037
71038
71039       function renderDataLayers(selection) {
71040           var container = selection.selectAll('.data-layer-container')
71041               .data([0]);
71042
71043           _dataLayerContainer = container.enter()
71044               .append('div')
71045               .attr('class', 'data-layer-container')
71046               .merge(container);
71047
71048           updateDataLayers();
71049       }
71050
71051
71052       function renderFillList(selection) {
71053           var container = selection.selectAll('.layer-fill-list')
71054               .data([0]);
71055
71056           _fillList = container.enter()
71057               .append('ul')
71058               .attr('class', 'layer-list layer-fill-list')
71059               .merge(container);
71060
71061           updateFillList();
71062       }
71063
71064
71065       function renderFeatureList(selection) {
71066           var container = selection.selectAll('.layer-feature-list')
71067               .data([0]);
71068
71069           _featureList = container.enter()
71070               .append('ul')
71071               .attr('class', 'layer-list layer-feature-list')
71072               .merge(container);
71073
71074           updateFeatureList();
71075       }
71076
71077       function updateDataLayers() {
71078           _dataLayerContainer
71079               .call(drawOsmItems)
71080               .call(drawQAItems)
71081               .call(drawPhotoItems)
71082               .call(drawCustomDataItems)
71083               .call(drawVectorItems);      // Beta - Detroit mapping challenge
71084       }
71085
71086       function updateFillList() {
71087           _fillList
71088               .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
71089       }
71090
71091       function updateFeatureList() {
71092           _featureList
71093               .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
71094       }
71095
71096       function update() {
71097
71098           if (!_pane.select('.disclosure-wrap-data_layers').classed('hide')) {
71099               updateDataLayers();
71100           }
71101           if (!_pane.select('.disclosure-wrap-fill_area').classed('hide')) {
71102               updateFillList();
71103           }
71104           if (!_pane.select('.disclosure-wrap-map_features').classed('hide')) {
71105               updateFeatureList();
71106           }
71107
71108           _QAList
71109               .call(drawListItems, ['keep-right'], 'checkbox', 'QA', function(d) { toggleLayer(d); }, showsQA);
71110       }
71111
71112
71113       function toggleWireframe() {
71114           if (event) {
71115               event.preventDefault();
71116               event.stopPropagation();
71117           }
71118
71119           if (_fillSelected === 'wireframe') {
71120               _fillSelected = context.storage('area-fill-toggle') || 'partial';
71121           } else {
71122               _fillSelected = 'wireframe';
71123           }
71124
71125           setFill(_fillSelected);
71126           context.map().pan([0,0]);  // trigger a redraw
71127       }
71128
71129       var paneTooltip = tooltip()
71130           .placement((textDirection === 'rtl') ? 'right' : 'left')
71131           .html(true)
71132           .title(uiTooltipHtml(t('map_data.description'), key));
71133
71134       uiMapData.hidePane = function() {
71135           uiMapData.setVisible(false);
71136       };
71137
71138       uiMapData.togglePane = function() {
71139           if (event) event.preventDefault();
71140           paneTooltip.hide(_toggleButton);
71141           uiMapData.setVisible(!_toggleButton.classed('active'));
71142       };
71143
71144       uiMapData.setVisible = function(show) {
71145           if (show !== _shown) {
71146               _toggleButton.classed('active', show);
71147               _shown = show;
71148
71149               if (show) {
71150                   uiBackground.hidePane();
71151                   uiHelp.hidePane();
71152                   uiIssues.hidePane();
71153                   update();
71154
71155                   _pane
71156                       .style('display', 'block')
71157                       .style('right', '-300px')
71158                       .transition()
71159                       .duration(200)
71160                       .style('right', '0px');
71161
71162               } else {
71163                   _pane
71164                       .style('display', 'block')
71165                       .style('right', '0px')
71166                       .transition()
71167                       .duration(200)
71168                       .style('right', '-300px')
71169                       .on('end', function() {
71170                           select(this).style('display', 'none');
71171                       });
71172               }
71173           }
71174       };
71175
71176       uiMapData.renderToggleButton = function(selection) {
71177
71178           _toggleButton = selection
71179               .append('button')
71180               .attr('tabindex', -1)
71181               .on('click', uiMapData.togglePane)
71182               .call(svgIcon('#iD-icon-data', 'light'))
71183               .call(paneTooltip);
71184       };
71185
71186
71187       uiMapData.renderPane = function(selection) {
71188
71189           _pane = selection
71190               .append('div')
71191               .attr('class', 'fillL map-pane map-data-pane hide');
71192
71193           var heading = _pane
71194               .append('div')
71195               .attr('class', 'pane-heading');
71196
71197           heading
71198               .append('h2')
71199               .text(t('map_data.title'));
71200
71201           heading
71202               .append('button')
71203               .on('click', uiMapData.hidePane)
71204               .call(svgIcon('#iD-icon-close'));
71205
71206
71207           var content = _pane
71208               .append('div')
71209               .attr('class', 'pane-content');
71210
71211
71212           // data layers
71213           content
71214               .append('div')
71215               .attr('class', 'map-data-data-layers')
71216               .call(uiDisclosure(context, 'data_layers', true)
71217                   .title(t('map_data.data_layers'))
71218                   .content(renderDataLayers)
71219               );
71220
71221           // area fills
71222           content
71223               .append('div')
71224               .attr('class', 'map-data-area-fills')
71225               .call(uiDisclosure(context, 'fill_area', false)
71226                   .title(t('map_data.fill_area'))
71227                   .content(renderFillList)
71228               );
71229
71230           // feature filters
71231           content
71232               .append('div')
71233               .attr('class', 'map-data-feature-filters')
71234               .call(uiDisclosure(context, 'map_features', false)
71235                   .title(t('map_data.map_features'))
71236                   .content(renderFeatureList)
71237               );
71238
71239
71240           // add listeners
71241           context.features()
71242               .on('change.map_data-update', update);
71243
71244           update();
71245           setFill(_fillSelected);
71246
71247           context.keybinding()
71248               .on(key, uiMapData.togglePane)
71249               .on(t('area_fill.wireframe.key'), toggleWireframe);
71250       };
71251
71252       return uiMapData;
71253   }
71254
71255   function uiShortcuts(context) {
71256       var detected = utilDetect();
71257       var _activeTab = 0;
71258       var _modalSelection;
71259       var _selection = select(null);
71260
71261
71262       context.keybinding()
71263           .on([t('shortcuts.toggle.key'), '?'], function () {
71264               if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
71265                   if (_modalSelection) {
71266                       _modalSelection.close();
71267                       _modalSelection = null;
71268                   }
71269               } else {
71270                   _modalSelection = uiModal(_selection);
71271                   shortcutsModal(_modalSelection);
71272               }
71273           });
71274
71275
71276       function shortcutsModal(_modalSelection) {
71277           _modalSelection.select('.modal')
71278               .classed('modal-shortcuts', true);
71279
71280           var shortcutsModal = _modalSelection.select('.content');
71281
71282           shortcutsModal
71283               .append('div')
71284               .attr('class', 'modal-section')
71285               .append('h3')
71286               .text(t('shortcuts.title'));
71287
71288           shortcutsModal
71289               .call(render);
71290       }
71291
71292
71293       function render(selection) {
71294           var wrapper = selection
71295               .selectAll('.wrapper')
71296               .data([0]);
71297
71298           var wrapperEnter = wrapper
71299               .enter()
71300               .append('div')
71301               .attr('class', 'wrapper modal-section');
71302
71303           var tabsBar = wrapperEnter
71304               .append('div')
71305               .attr('class', 'tabs-bar');
71306
71307           var shortcutsList = wrapperEnter
71308               .append('div')
71309               .attr('class', 'shortcuts-list');
71310
71311           wrapper = wrapper.merge(wrapperEnter);
71312
71313           var tabs = tabsBar
71314               .selectAll('.tab')
71315               .data(dataShortcuts);
71316
71317           var tabsEnter = tabs
71318               .enter()
71319               .append('div')
71320               .attr('class', 'tab')
71321               .on('click', function (d, i) {
71322                   _activeTab = i;
71323                   render(selection);
71324               });
71325
71326           tabsEnter
71327               .append('span')
71328               .text(function (d) { return t(d.text); });
71329
71330           tabs = tabs
71331               .merge(tabsEnter);
71332
71333           // Update
71334           wrapper.selectAll('.tab')
71335               .classed('active', function (d, i) {
71336                   return i === _activeTab;
71337               });
71338
71339
71340           var shortcuts = shortcutsList
71341               .selectAll('.shortcut-tab')
71342               .data(dataShortcuts);
71343
71344           var shortcutsEnter = shortcuts
71345               .enter()
71346               .append('div')
71347               .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
71348
71349           var columnsEnter = shortcutsEnter
71350               .selectAll('.shortcut-column')
71351               .data(function (d) { return d.columns; })
71352               .enter()
71353               .append('table')
71354               .attr('class', 'shortcut-column');
71355
71356           var rowsEnter = columnsEnter
71357               .selectAll('.shortcut-row')
71358               .data(function (d) { return d.rows; })
71359               .enter()
71360               .append('tr')
71361               .attr('class', 'shortcut-row');
71362
71363
71364           var sectionRows = rowsEnter
71365               .filter(function (d) { return !d.shortcuts; });
71366
71367           sectionRows
71368               .append('td');
71369
71370           sectionRows
71371               .append('td')
71372               .attr('class', 'shortcut-section')
71373               .append('h3')
71374               .text(function (d) { return t(d.text); });
71375
71376
71377           var shortcutRows = rowsEnter
71378               .filter(function (d) { return d.shortcuts; });
71379
71380           var shortcutKeys = shortcutRows
71381               .append('td')
71382               .attr('class', 'shortcut-keys');
71383
71384           var modifierKeys = shortcutKeys
71385               .filter(function (d) { return d.modifiers; });
71386
71387           modifierKeys
71388               .selectAll('kbd.modifier')
71389               .data(function (d) {
71390                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
71391                       return ['⌘'];
71392                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
71393                       return [];
71394                   } else {
71395                       return d.modifiers;
71396                   }
71397               })
71398               .enter()
71399               .each(function () {
71400                   var selection = select(this);
71401
71402                   selection
71403                       .append('kbd')
71404                       .attr('class', 'modifier')
71405                       .text(function (d) { return uiCmd.display(d); });
71406
71407                   selection
71408                       .append('span')
71409                       .text('+');
71410               });
71411
71412
71413           shortcutKeys
71414               .selectAll('kbd.shortcut')
71415               .data(function (d) {
71416                   var arr = d.shortcuts;
71417                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
71418                       arr = ['Y'];
71419                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
71420                       arr = ['F11'];
71421                   }
71422
71423                   // replace translations
71424                   arr = arr.map(function(s) {
71425                       return uiCmd.display(s.indexOf('.') !== -1 ? t(s) : s);
71426                   });
71427
71428                   return uniq(arr).map(function(s) {
71429                       return {
71430                           shortcut: s,
71431                           separator: d.separator
71432                       };
71433                   });
71434               })
71435               .enter()
71436               .each(function (d, i, nodes) {
71437                   var selection = select(this);
71438                   var click = d.shortcut.toLowerCase().match(/(.*).click/);
71439
71440                   if (click && click[1]) {   // replace "left_click", "right_click" with mouse icon
71441                       selection
71442                           .call(svgIcon('#iD-walkthrough-mouse', 'mouseclick', click[1]));
71443                   } else {
71444                       selection
71445                           .append('kbd')
71446                           .attr('class', 'shortcut')
71447                           .text(function (d) { return d.shortcut; });
71448                   }
71449
71450                   if (i < nodes.length - 1) {
71451                       selection
71452                           .append('span')
71453                           .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
71454                   }
71455               });
71456
71457
71458           shortcutKeys
71459               .filter(function(d) { return d.gesture; })
71460               .each(function () {
71461                   var selection = select(this);
71462
71463                   selection
71464                       .append('span')
71465                       .text('+');
71466
71467                   selection
71468                       .append('span')
71469                       .attr('class', 'gesture')
71470                       .text(function (d) { return t(d.gesture); });
71471               });
71472
71473
71474           shortcutRows
71475               .append('td')
71476               .attr('class', 'shortcut-desc')
71477               .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
71478
71479
71480           shortcuts = shortcuts
71481               .merge(shortcutsEnter);
71482
71483           // Update
71484           wrapper.selectAll('.shortcut-tab')
71485               .style('display', function (d, i) {
71486                   return i === _activeTab ? 'flex' : 'none';
71487               });
71488       }
71489
71490
71491       return function(selection, show) {
71492           _selection = selection;
71493           if (show) {
71494               _modalSelection = uiModal(selection);
71495               shortcutsModal(_modalSelection);
71496           }
71497       };
71498   }
71499
71500   function uiHelp(context) {
71501       var key = t('help.key');
71502
71503       var _pane = select(null), _toggleButton = select(null);
71504
71505       var _shown = false;
71506
71507       var docKeys = [
71508           ['help', [
71509               'welcome',
71510               'open_data_h',
71511               'open_data',
71512               'before_start_h',
71513               'before_start',
71514               'open_source_h',
71515               'open_source',
71516               'open_source_help'
71517           ]],
71518           ['overview', [
71519               'navigation_h',
71520               'navigation_drag',
71521               'navigation_zoom',
71522               'features_h',
71523               'features',
71524               'nodes_ways'
71525           ]],
71526           ['editing', [
71527               'select_h',
71528               'select_left_click',
71529               'select_right_click',
71530               'multiselect_h',
71531               'multiselect_shift_click',
71532               'multiselect_lasso',
71533               'undo_redo_h',
71534               'undo_redo',
71535               'save_h',
71536               'save',
71537               'save_validation',
71538               'upload_h',
71539               'upload',
71540               'backups_h',
71541               'backups',
71542               'keyboard_h',
71543               'keyboard'
71544           ]],
71545           ['feature_editor', [
71546               'intro',
71547               'definitions',
71548               'type_h',
71549               'type',
71550               'type_picker',
71551               'fields_h',
71552               'fields_all_fields',
71553               'fields_example',
71554               'fields_add_field',
71555               'tags_h',
71556               'tags_all_tags',
71557               'tags_resources'
71558           ]],
71559           ['points', [
71560               'intro',
71561               'add_point_h',
71562               'add_point',
71563               'add_point_finish',
71564               'move_point_h',
71565               'move_point',
71566               'delete_point_h',
71567               'delete_point',
71568               'delete_point_command'
71569           ]],
71570           ['lines', [
71571               'intro',
71572               'add_line_h',
71573               'add_line',
71574               'add_line_draw',
71575               'add_line_finish',
71576               'modify_line_h',
71577               'modify_line_dragnode',
71578               'modify_line_addnode',
71579               'connect_line_h',
71580               'connect_line',
71581               'connect_line_display',
71582               'connect_line_drag',
71583               'connect_line_tag',
71584               'disconnect_line_h',
71585               'disconnect_line_command',
71586               'move_line_h',
71587               'move_line_command',
71588               'move_line_connected',
71589               'delete_line_h',
71590               'delete_line',
71591               'delete_line_command'
71592           ]],
71593           ['areas', [
71594               'intro',
71595               'point_or_area_h',
71596               'point_or_area',
71597               'add_area_h',
71598               'add_area_command',
71599               'add_area_draw',
71600               'add_area_finish',
71601               'square_area_h',
71602               'square_area_command',
71603               'modify_area_h',
71604               'modify_area_dragnode',
71605               'modify_area_addnode',
71606               'delete_area_h',
71607               'delete_area',
71608               'delete_area_command'
71609           ]],
71610           ['relations', [
71611               'intro',
71612               'edit_relation_h',
71613               'edit_relation',
71614               'edit_relation_add',
71615               'edit_relation_delete',
71616               'maintain_relation_h',
71617               'maintain_relation',
71618               'relation_types_h',
71619               'multipolygon_h',
71620               'multipolygon',
71621               'multipolygon_create',
71622               'multipolygon_merge',
71623               'turn_restriction_h',
71624               'turn_restriction',
71625               'turn_restriction_field',
71626               'turn_restriction_editing',
71627               'route_h',
71628               'route',
71629               'route_add',
71630               'boundary_h',
71631               'boundary',
71632               'boundary_add'
71633           ]],
71634           ['notes', [
71635               'intro',
71636               'add_note_h',
71637               'add_note',
71638               'move_note',
71639               'update_note_h',
71640               'update_note',
71641               'save_note_h',
71642               'save_note'
71643           ]],
71644
71645           ['imagery', [
71646               'intro',
71647               'sources_h',
71648               'choosing',
71649               'sources',
71650               'offsets_h',
71651               'offset',
71652               'offset_change'
71653           ]],
71654           ['streetlevel', [
71655               'intro',
71656               'using_h',
71657               'using',
71658               'photos',
71659               'viewer'
71660           ]],
71661           ['gps', [
71662               'intro',
71663               'survey',
71664               'using_h',
71665               'using',
71666               'tracing',
71667               'upload'
71668           ]],
71669           ['qa', [
71670               'intro',
71671               'tools_h',
71672               'tools',
71673               'issues_h',
71674               'issues'
71675           ]]
71676       ];
71677
71678       var headings = {
71679           'help.help.open_data_h': 3,
71680           'help.help.before_start_h': 3,
71681           'help.help.open_source_h': 3,
71682           'help.overview.navigation_h': 3,
71683           'help.overview.features_h': 3,
71684           'help.editing.select_h': 3,
71685           'help.editing.multiselect_h': 3,
71686           'help.editing.undo_redo_h': 3,
71687           'help.editing.save_h': 3,
71688           'help.editing.upload_h': 3,
71689           'help.editing.backups_h': 3,
71690           'help.editing.keyboard_h': 3,
71691           'help.feature_editor.type_h': 3,
71692           'help.feature_editor.fields_h': 3,
71693           'help.feature_editor.tags_h': 3,
71694           'help.points.add_point_h': 3,
71695           'help.points.move_point_h': 3,
71696           'help.points.delete_point_h': 3,
71697           'help.lines.add_line_h': 3,
71698           'help.lines.modify_line_h': 3,
71699           'help.lines.connect_line_h': 3,
71700           'help.lines.disconnect_line_h': 3,
71701           'help.lines.move_line_h': 3,
71702           'help.lines.delete_line_h': 3,
71703           'help.areas.point_or_area_h': 3,
71704           'help.areas.add_area_h': 3,
71705           'help.areas.square_area_h': 3,
71706           'help.areas.modify_area_h': 3,
71707           'help.areas.delete_area_h': 3,
71708           'help.relations.edit_relation_h': 3,
71709           'help.relations.maintain_relation_h': 3,
71710           'help.relations.relation_types_h': 2,
71711           'help.relations.multipolygon_h': 3,
71712           'help.relations.turn_restriction_h': 3,
71713           'help.relations.route_h': 3,
71714           'help.relations.boundary_h': 3,
71715           'help.notes.add_note_h': 3,
71716           'help.notes.update_note_h': 3,
71717           'help.notes.save_note_h': 3,
71718           'help.imagery.sources_h': 3,
71719           'help.imagery.offsets_h': 3,
71720           'help.streetlevel.using_h': 3,
71721           'help.gps.using_h': 3,
71722           'help.qa.tools_h': 3,
71723           'help.qa.issues_h': 3
71724       };
71725
71726       var replacements = {
71727           point: icon('#iD-icon-point', 'pre-text'),
71728           line: icon('#iD-icon-line', 'pre-text'),
71729           area: icon('#iD-icon-area', 'pre-text'),
71730           note: icon('#iD-icon-note', 'pre-text add-note'),
71731           plus: icon('#iD-icon-plus', 'pre-text'),
71732           minus: icon('#iD-icon-minus', 'pre-text'),
71733           orthogonalize: icon('#iD-operation-orthogonalize', 'pre-text'),
71734           disconnect: icon('#iD-operation-disconnect', 'pre-text'),
71735           layers: icon('#iD-icon-layers', 'pre-text'),
71736           data: icon('#iD-icon-data', 'pre-text'),
71737           inspect: icon('#iD-icon-inspect', 'pre-text'),
71738           move: icon('#iD-operation-move', 'pre-text'),
71739           merge: icon('#iD-operation-merge', 'pre-text'),
71740           delete: icon('#iD-operation-delete', 'pre-text'),
71741           close: icon('#iD-icon-close', 'pre-text'),
71742           undo: icon(textDirection === 'rtl' ? '#iD-icon-redo' : '#iD-icon-undo', 'pre-text'),
71743           redo: icon(textDirection === 'rtl' ? '#iD-icon-undo' : '#iD-icon-redo', 'pre-text'),
71744           save: icon('#iD-icon-save', 'pre-text'),
71745           leftclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'left'),
71746           rightclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'right'),
71747           shift: uiCmd.display('⇧'),
71748           alt: uiCmd.display('⌥'),
71749           return: uiCmd.display('↵'),
71750           version: context.version
71751       };
71752
71753       // For each section, squash all the texts into a single markdown document
71754       var docs = docKeys.map(function(key) {
71755           var helpkey = 'help.' + key[0];
71756           var text = key[1].reduce(function(all, part) {
71757               var subkey = helpkey + '.' + part;
71758               var depth = headings[subkey];                              // is this subkey a heading?
71759               var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
71760               return all + hhh + t(subkey, replacements) + '\n\n';
71761           }, '');
71762
71763           return {
71764               title: t(helpkey + '.title'),
71765               html: marked(text.trim())
71766           };
71767       });
71768
71769       var paneTooltip = tooltip()
71770           .placement((textDirection === 'rtl') ? 'right' : 'left')
71771           .html(true)
71772           .title(uiTooltipHtml(t('help.title'), key));
71773
71774       uiHelp.hidePane = function() {
71775           uiHelp.setVisible(false);
71776       };
71777
71778       uiHelp.togglePane = function() {
71779           if (event) event.preventDefault();
71780           paneTooltip.hide(_toggleButton);
71781           uiHelp.setVisible(!_toggleButton.classed('active'));
71782       };
71783
71784       uiHelp.setVisible = function(show) {
71785           if (show !== _shown) {
71786               _toggleButton.classed('active', show);
71787               _shown = show;
71788
71789               if (show) {
71790                   uiBackground.hidePane();
71791                   uiIssues.hidePane();
71792                   uiMapData.hidePane();
71793
71794                   _pane.style('display', 'block')
71795                       .style('right', '-500px')
71796                       .transition()
71797                       .duration(200)
71798                       .style('right', '0px');
71799
71800               } else {
71801                   _pane.style('right', '0px')
71802                       .transition()
71803                       .duration(200)
71804                       .style('right', '-500px')
71805                       .on('end', function() {
71806                           select(this).style('display', 'none');
71807                       });
71808               }
71809           }
71810       };
71811
71812       uiHelp.renderToggleButton = function(selection) {
71813
71814           _toggleButton = selection.append('button')
71815               .attr('tabindex', -1)
71816               .on('click', uiHelp.togglePane)
71817               .call(svgIcon('#iD-icon-help', 'light'))
71818               .call(paneTooltip);
71819       };
71820
71821
71822       uiHelp.renderPane = function(selection) {
71823
71824           function clickHelp(d, i) {
71825               var rtl = (textDirection === 'rtl');
71826               content.property('scrollTop', 0);
71827               doctitle.html(d.title);
71828
71829               body.html(d.html);
71830               body.selectAll('a')
71831                   .attr('target', '_blank');
71832               menuItems.classed('selected', function(m) {
71833                   return m.title === d.title;
71834               });
71835
71836               nav.html('');
71837               if (rtl) {
71838                   nav.call(drawNext).call(drawPrevious);
71839               } else {
71840                   nav.call(drawPrevious).call(drawNext);
71841               }
71842
71843
71844               function drawNext(selection) {
71845                   if (i < docs.length - 1) {
71846                       var nextLink = selection
71847                           .append('a')
71848                           .attr('class', 'next')
71849                           .on('click', function() {
71850                               clickHelp(docs[i + 1], i + 1);
71851                           });
71852
71853                       nextLink
71854                           .append('span')
71855                           .text(docs[i + 1].title)
71856                           .call(svgIcon((rtl ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
71857                   }
71858               }
71859
71860
71861               function drawPrevious(selection) {
71862                   if (i > 0) {
71863                       var prevLink = selection
71864                           .append('a')
71865                           .attr('class', 'previous')
71866                           .on('click', function() {
71867                               clickHelp(docs[i - 1], i - 1);
71868                           });
71869
71870                       prevLink
71871                           .call(svgIcon((rtl ? '#iD-icon-forward' : '#iD-icon-backward'), 'inline'))
71872                           .append('span')
71873                           .text(docs[i - 1].title);
71874                   }
71875               }
71876           }
71877
71878
71879           function clickWalkthrough() {
71880               if (context.inIntro()) return;
71881               context.container().call(uiIntro(context));
71882               uiHelp.setVisible(false);
71883           }
71884
71885
71886           function clickShortcuts() {
71887               context.container().call(uiShortcuts(context), true);
71888           }
71889
71890
71891           _pane = selection.append('div')
71892               .attr('class', 'help-wrap map-pane fillL hide');
71893
71894           var heading = _pane
71895               .append('div')
71896               .attr('class', 'pane-heading');
71897
71898           var doctitle = heading
71899               .append('h2')
71900               .text(t('help.title'));
71901
71902           heading
71903               .append('button')
71904               .on('click', uiHelp.hidePane)
71905               .call(svgIcon('#iD-icon-close'));
71906
71907
71908           var content = _pane
71909               .append('div')
71910               .attr('class', 'pane-content');
71911
71912           var toc = content
71913               .append('ul')
71914               .attr('class', 'toc');
71915
71916           var menuItems = toc.selectAll('li')
71917               .data(docs)
71918               .enter()
71919               .append('li')
71920               .append('a')
71921               .html(function(d) { return d.title; })
71922               .on('click', clickHelp);
71923
71924           var shortcuts = toc
71925               .append('li')
71926               .attr('class', 'shortcuts')
71927               .call(tooltip()
71928                   .html(true)
71929                   .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
71930                   .placement('top')
71931               )
71932               .append('a')
71933               .on('click', clickShortcuts);
71934
71935           shortcuts
71936               .append('div')
71937               .text(t('shortcuts.title'));
71938
71939           var walkthrough = toc
71940               .append('li')
71941               .attr('class', 'walkthrough')
71942               .append('a')
71943               .on('click', clickWalkthrough);
71944
71945           walkthrough
71946               .append('svg')
71947               .attr('class', 'logo logo-walkthrough')
71948               .append('use')
71949               .attr('xlink:href', '#iD-logo-walkthrough');
71950
71951           walkthrough
71952               .append('div')
71953               .text(t('splash.walkthrough'));
71954
71955
71956           var helpContent = content
71957               .append('div')
71958               .attr('class', 'left-content');
71959
71960           var body = helpContent
71961               .append('div')
71962               .attr('class', 'body');
71963
71964           var nav = helpContent
71965               .append('div')
71966               .attr('class', 'nav');
71967
71968           clickHelp(docs[0], 0);
71969
71970           context.keybinding()
71971               .on(key, uiHelp.togglePane);
71972
71973       };
71974
71975       return uiHelp;
71976   }
71977
71978   function localeDateString(s) {
71979       if (!s) return null;
71980       var detected = utilDetect();
71981       var options = { day: 'numeric', month: 'short', year: 'numeric' };
71982       var d = new Date(s);
71983       if (isNaN(d.getTime())) return null;
71984       return d.toLocaleDateString(detected.locale, options);
71985   }
71986
71987   function vintageRange(vintage) {
71988       var s;
71989       if (vintage.start || vintage.end) {
71990           s = (vintage.start || '?');
71991           if (vintage.start !== vintage.end) {
71992               s += ' - ' + (vintage.end || '?');
71993           }
71994       }
71995       return s;
71996   }
71997
71998
71999   function rendererBackgroundSource(data) {
72000       var source = clone(data);
72001       var offset = [0, 0];
72002       var name = source.name;
72003       var description = source.description;
72004       var best = !!source.best;
72005       var template = source.template;
72006
72007       source.tileSize = data.tileSize || 256;
72008       source.zoomExtent = data.zoomExtent || [0, 22];
72009       source.overzoom = data.overzoom !== false;
72010
72011       source.offset = function(_) {
72012           if (!arguments.length) return offset;
72013           offset = _;
72014           return source;
72015       };
72016
72017
72018       source.nudge = function(_, zoomlevel) {
72019           offset[0] += _[0] / Math.pow(2, zoomlevel);
72020           offset[1] += _[1] / Math.pow(2, zoomlevel);
72021           return source;
72022       };
72023
72024
72025       source.name = function() {
72026           var id_safe = source.id.replace(/\./g, '<TX_DOT>');
72027           return t('imagery.' + id_safe + '.name', { default: name });
72028       };
72029
72030
72031       source.description = function() {
72032           var id_safe = source.id.replace(/\./g, '<TX_DOT>');
72033           return t('imagery.' + id_safe + '.description', { default: description });
72034       };
72035
72036
72037       source.best = function() {
72038           return best;
72039       };
72040
72041
72042       source.area = function() {
72043           if (!data.polygon) return Number.MAX_VALUE;  // worldwide
72044           var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
72045           return isNaN(area) ? 0 : area;
72046       };
72047
72048
72049       source.imageryUsed = function() {
72050           return name || source.id;
72051       };
72052
72053
72054       source.template = function(_) {
72055           if (!arguments.length) return template;
72056           if (source.id === 'custom') template = _;
72057           return source;
72058       };
72059
72060
72061       source.url = function(coord) {
72062           if (this.type === 'wms') {
72063               var tileToProjectedCoords = (function(x, y, z) {
72064                   //polyfill for IE11, PhantomJS
72065                   var sinh = Math.sinh || function(x) {
72066                       var y = Math.exp(x);
72067                       return (y - 1 / y) / 2;
72068                   };
72069
72070                   var zoomSize = Math.pow(2, z);
72071                   var lon = x / zoomSize * Math.PI * 2 - Math.PI;
72072                   var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
72073
72074                   switch (this.projection) {
72075                       case 'EPSG:4326':
72076                           return {
72077                               x: lon * 180 / Math.PI,
72078                               y: lat * 180 / Math.PI
72079                           };
72080                       default: // EPSG:3857 and synonyms
72081                           var mercCoords = mercatorRaw(lon, lat);
72082                           return {
72083                               x: 20037508.34 / Math.PI * mercCoords[0],
72084                               y: 20037508.34 / Math.PI * mercCoords[1]
72085                           };
72086                   }
72087               }).bind(this);
72088
72089               var tileSize = this.tileSize;
72090               var projection = this.projection;
72091               var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
72092               var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
72093               return template.replace(/\{(\w+)\}/g, function (token, key) {
72094                 switch (key) {
72095                   case 'width':
72096                   case 'height':
72097                     return tileSize;
72098                   case 'proj':
72099                     return projection;
72100                   case 'wkid':
72101                     return projection.replace(/^EPSG:/, '');
72102                   case 'bbox':
72103                     return minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y;
72104                   case 'w':
72105                     return minXmaxY.x;
72106                   case 's':
72107                     return maxXminY.y;
72108                   case 'n':
72109                     return maxXminY.x;
72110                   case 'e':
72111                     return minXmaxY.y;
72112                   default:
72113                     return token;
72114                 }
72115               });
72116           }
72117           return template
72118               .replace('{x}', coord[0])
72119               .replace('{y}', coord[1])
72120               // TMS-flipped y coordinate
72121               .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
72122               .replace(/\{z(oom)?\}/, coord[2])
72123               .replace(/\{switch:([^}]+)\}/, function(s, r) {
72124                   var subdomains = r.split(',');
72125                   return subdomains[(coord[0] + coord[1]) % subdomains.length];
72126               })
72127               .replace('{u}', function() {
72128                   var u = '';
72129                   for (var zoom = coord[2]; zoom > 0; zoom--) {
72130                       var b = 0;
72131                       var mask = 1 << (zoom - 1);
72132                       if ((coord[0] & mask) !== 0) b++;
72133                       if ((coord[1] & mask) !== 0) b += 2;
72134                       u += b.toString();
72135                   }
72136                   return u;
72137               });
72138       };
72139
72140
72141       source.validZoom = function(z) {
72142           return source.zoomExtent[0] <= z &&
72143               (source.overzoom || source.zoomExtent[1] > z);
72144       };
72145
72146
72147       source.isLocatorOverlay = function() {
72148           return source.id === 'mapbox_locator_overlay';
72149       };
72150
72151
72152       /* hides a source from the list, but leaves it available for use */
72153       source.isHidden = function() {
72154           return source.id === 'DigitalGlobe-Premium-vintage' ||
72155               source.id === 'DigitalGlobe-Standard-vintage';
72156       };
72157
72158
72159       source.copyrightNotices = function() {};
72160
72161
72162       source.getMetadata = function(center, tileCoord, callback) {
72163           var vintage = {
72164               start: localeDateString(source.startDate),
72165               end: localeDateString(source.endDate)
72166           };
72167           vintage.range = vintageRange(vintage);
72168
72169           var metadata = { vintage: vintage };
72170           callback(null, metadata);
72171       };
72172
72173
72174       return source;
72175   }
72176
72177
72178   rendererBackgroundSource.Bing = function(data, dispatch) {
72179       // http://msdn.microsoft.com/en-us/library/ff701716.aspx
72180       // http://msdn.microsoft.com/en-us/library/ff701701.aspx
72181
72182       data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
72183
72184       var bing = rendererBackgroundSource(data);
72185       var key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU'; // Same as P2 and JOSM
72186       var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
72187               key;
72188       var cache = {};
72189       var inflight = {};
72190       var providers = [];
72191
72192       d3_json(url, function(err, json) {
72193           providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
72194               return {
72195                   attribution: provider.attribution,
72196                   areas: provider.coverageAreas.map(function(area) {
72197                       return {
72198                           zoom: [area.zoomMin, area.zoomMax],
72199                           extent: geoExtent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
72200                       };
72201                   })
72202               };
72203           });
72204           dispatch.call('change');
72205       });
72206
72207
72208       bing.copyrightNotices = function(zoom, extent) {
72209           zoom = Math.min(zoom, 21);
72210           return providers.filter(function(provider) {
72211               return some(provider.areas, function(area) {
72212                   return extent.intersects(area.extent) &&
72213                       area.zoom[0] <= zoom &&
72214                       area.zoom[1] >= zoom;
72215               });
72216           }).map(function(provider) {
72217               return provider.attribution;
72218           }).join(', ');
72219       };
72220
72221
72222       bing.getMetadata = function(center, tileCoord, callback) {
72223           var tileId = tileCoord.slice(0, 3).join('/');
72224           var zoom = Math.min(tileCoord[2], 21);
72225           var centerPoint = center[1] + ',' + center[0];  // lat,lng
72226           var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
72227                   '?zl=' + zoom + '&key=' + key;
72228
72229           if (inflight[tileId]) return;
72230
72231           if (!cache[tileId]) {
72232               cache[tileId] = {};
72233           }
72234           if (cache[tileId] && cache[tileId].metadata) {
72235               return callback(null, cache[tileId].metadata);
72236           }
72237
72238           inflight[tileId] = true;
72239           d3_json(url, function(error, result) {
72240               delete inflight[tileId];
72241
72242               var err;
72243               if (error) {
72244                   err = error;
72245               } else if (!result && 'Unknown Error') {
72246                   err = result.errorDetails;
72247               }
72248               if (err) {
72249                   return callback(err);
72250               } else {
72251                   var vintage = {
72252                       start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
72253                       end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
72254                   };
72255                   vintage.range = vintageRange(vintage);
72256
72257                   var metadata = { vintage: vintage };
72258                   cache[tileId].metadata = metadata;
72259                   return callback(null, metadata);
72260               }
72261           });
72262       };
72263
72264
72265       bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
72266
72267
72268       return bing;
72269   };
72270
72271
72272
72273   rendererBackgroundSource.Esri = function(data) {
72274       // in addition to using the tilemap at zoom level 20, overzoom real tiles - #4327 (deprecated technique, but it works)
72275       if (data.template.match(/blankTile/) === null) {
72276           data.template = data.template + '?blankTile=false';
72277       }
72278
72279       var esri = rendererBackgroundSource(data);
72280       var cache = {};
72281       var inflight = {};
72282       var _prevCenter;
72283
72284       // use a tilemap service to set maximum zoom for esri tiles dynamically
72285       // https://developers.arcgis.com/documentation/tiled-elevation-service/
72286       esri.fetchTilemap = function(center) {
72287           // skip if we have already fetched a tilemap within 5km
72288           if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5000) return;
72289           _prevCenter = center;
72290
72291           // tiles are available globally to zoom level 19, afterward they may or may not be present
72292           var z = 20;
72293
72294           // first generate a random url using the template
72295           var dummyUrl = esri.url([1,2,3]);
72296
72297           // calculate url z/y/x from the lat/long of the center of the map
72298           var x = (Math.floor((center[0] + 180) / 360 * Math.pow(2, z)));
72299           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)));
72300
72301           // fetch an 8x8 grid to leverage cache
72302           var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, 'tilemap') + '/' + z + '/' + y + '/' + x + '/8/8';
72303
72304           // make the request and introspect the response from the tilemap server
72305           d3_json(tilemapUrl, function (err, tilemap) {
72306               if (err || !tilemap) return;
72307
72308               var hasTiles = true;
72309               for (var i = 0; i < tilemap.data.length; i++) {
72310                   // 0 means an individual tile in the grid doesn't exist
72311                   if (!tilemap.data[i]) {
72312                       hasTiles = false;
72313                       break;
72314                   }
72315               }
72316
72317               // if any tiles are missing at level 20 we restrict maxZoom to 19
72318               esri.zoomExtent[1] = (hasTiles ? 22 : 19);
72319           });
72320       };
72321
72322       esri.getMetadata = function(center, tileCoord, callback) {
72323           var tileId = tileCoord.slice(0, 3).join('/');
72324           var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]);
72325           var centerPoint = center[0] + ',' + center[1];  // long, lat (as it should be)
72326           var unknown = t('info_panels.background.unknown');
72327           var metadataLayer;
72328           var vintage = {};
72329           var metadata = {};
72330
72331           if (inflight[tileId]) return;
72332
72333           switch (true) {
72334               case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
72335                   metadataLayer = 4;
72336                   break;
72337               case zoom >= 19:
72338                   metadataLayer = 3;
72339                   break;
72340               case zoom >= 17:
72341                   metadataLayer = 2;
72342                   break;
72343               case zoom >= 13:
72344                   metadataLayer = 0;
72345                   break;
72346               default:
72347                   metadataLayer = 99;
72348           }
72349
72350           var url;
72351           // build up query using the layer appropriate to the current zoom
72352           if (esri.id === 'EsriWorldImagery') {
72353               url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
72354           } else if (esri.id === 'EsriWorldImageryClarity') {
72355               url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
72356           }
72357
72358           url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json';
72359
72360           if (!cache[tileId]) {
72361               cache[tileId] = {};
72362           }
72363           if (cache[tileId] && cache[tileId].metadata) {
72364               return callback(null, cache[tileId].metadata);
72365           }
72366
72367           // accurate metadata is only available >= 13
72368           if (metadataLayer === 99) {
72369               vintage = {
72370                   start: null,
72371                   end: null,
72372                   range: null
72373               };
72374               metadata = {
72375                   vintage: null,
72376                   source: unknown,
72377                   description: unknown,
72378                   resolution: unknown,
72379                   accuracy: unknown
72380               };
72381
72382               callback(null, metadata);
72383
72384           } else {
72385               inflight[tileId] = true;
72386               d3_json(url, function(error, result) {
72387                   delete inflight[tileId];
72388
72389                   var err;
72390                   if (error) {
72391                       err = error;
72392                   } else if (!result) {
72393                       err = 'Unknown Error';
72394                   } else if (result.features && result.features.length < 1) {
72395                       err = 'No Results';
72396                   } else if (result.error && result.error.message) {
72397                       err = result.error.message;
72398                   }
72399
72400                   if (err) {
72401                       return callback(err);
72402                   } else {
72403                       // pass through the discrete capture date from metadata
72404                       var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
72405                       vintage = {
72406                           start: captureDate,
72407                           end: captureDate,
72408                           range: captureDate
72409                       };
72410                       metadata = {
72411                           vintage: vintage,
72412                           source: clean(result.features[0].attributes.NICE_NAME),
72413                           description: clean(result.features[0].attributes.NICE_DESC),
72414                           resolution: clean(result.features[0].attributes.SRC_RES),
72415                           accuracy: clean(result.features[0].attributes.SRC_ACC)
72416                       };
72417
72418                       // append units - meters
72419                       if (isFinite(metadata.resolution)) {
72420                           metadata.resolution += ' m';
72421                       }
72422                       if (isFinite(metadata.accuracy)) {
72423                           metadata.accuracy += ' m';
72424                       }
72425
72426                       cache[tileId].metadata = metadata;
72427                       return callback(null, metadata);
72428                   }
72429               });
72430           }
72431
72432
72433           function clean(val) {
72434               return String(val).trim() || unknown;
72435           }
72436       };
72437
72438       return esri;
72439   };
72440
72441
72442   rendererBackgroundSource.None = function() {
72443       var source = rendererBackgroundSource({ id: 'none', template: '' });
72444
72445
72446       source.name = function() {
72447           return t('background.none');
72448       };
72449
72450
72451       source.imageryUsed = function() {
72452           return null;
72453       };
72454
72455
72456       source.area = function() {
72457           return -1;  // sources in background pane are sorted by area
72458       };
72459
72460
72461       return source;
72462   };
72463
72464
72465   rendererBackgroundSource.Custom = function(template) {
72466       var source = rendererBackgroundSource({ id: 'custom', template: template });
72467
72468
72469       source.name = function() {
72470           return t('background.custom');
72471       };
72472
72473
72474       source.imageryUsed = function() {
72475           return 'Custom (' + source.template() + ')';
72476       };
72477
72478
72479       source.area = function() {
72480           return -2;  // sources in background pane are sorted by area
72481       };
72482
72483
72484       return source;
72485   };
72486
72487   function rendererTileLayer(context) {
72488       var transformProp = utilPrefixCSSProperty('Transform');
72489       var tiler = utilTiler();
72490
72491       var _tileSize = 256;
72492       var _projection;
72493       var _cache = {};
72494       var _tileOrigin;
72495       var _zoom;
72496       var _source;
72497
72498
72499       function tileSizeAtZoom(d, z) {
72500           var EPSILON = 0.002;    // close seams
72501           return ((_tileSize * Math.pow(2, z - d[2])) / _tileSize) + EPSILON;
72502       }
72503
72504
72505       function atZoom(t, distance) {
72506           var power = Math.pow(2, distance);
72507           return [
72508               Math.floor(t[0] * power),
72509               Math.floor(t[1] * power),
72510               t[2] + distance
72511           ];
72512       }
72513
72514
72515       function lookUp(d) {
72516           for (var up = -1; up > -d[2]; up--) {
72517               var tile = atZoom(d, up);
72518               if (_cache[_source.url(tile)] !== false) {
72519                   return tile;
72520               }
72521           }
72522       }
72523
72524
72525       function uniqueBy(a, n) {
72526           var o = [];
72527           var seen = {};
72528           for (var i = 0; i < a.length; i++) {
72529               if (seen[a[i][n]] === undefined) {
72530                   o.push(a[i]);
72531                   seen[a[i][n]] = true;
72532               }
72533           }
72534           return o;
72535       }
72536
72537
72538       function addSource(d) {
72539           d.push(_source.url(d));
72540           return d;
72541       }
72542
72543
72544       // Update tiles based on current state of `projection`.
72545       function background(selection) {
72546           _zoom = geoScaleToZoom(_projection.scale(), _tileSize);
72547
72548           var pixelOffset;
72549           if (_source) {
72550               pixelOffset = [
72551                   _source.offset()[0] * Math.pow(2, _zoom),
72552                   _source.offset()[1] * Math.pow(2, _zoom)
72553               ];
72554           } else {
72555               pixelOffset = [0, 0];
72556           }
72557
72558           var translate = [
72559               _projection.translate()[0] + pixelOffset[0],
72560               _projection.translate()[1] + pixelOffset[1]
72561           ];
72562
72563           tiler
72564               .scale(_projection.scale() * 2 * Math.PI)
72565               .translate(translate);
72566
72567           _tileOrigin = [
72568               _projection.scale() * Math.PI - translate[0],
72569               _projection.scale() * Math.PI - translate[1]
72570           ];
72571
72572           render(selection);
72573       }
72574
72575
72576       // Derive the tiles onscreen, remove those offscreen and position them.
72577       // Important that this part not depend on `_projection` because it's
72578       // rentered when tiles load/error (see #644).
72579       function render(selection) {
72580           if (!_source) return;
72581           var requests = [];
72582           var showDebug = context.getDebug('tile') && !_source.overlay;
72583
72584           if (_source.validZoom(_zoom)) {
72585               tiler.skipNullIsland(!!_source.overlay);
72586
72587               tiler().forEach(function(d) {
72588                   addSource(d);
72589                   if (d[3] === '') return;
72590                   if (typeof d[3] !== 'string') return; // Workaround for #2295
72591                   requests.push(d);
72592                   if (_cache[d[3]] === false && lookUp(d)) {
72593                       requests.push(addSource(lookUp(d)));
72594                   }
72595               });
72596
72597               requests = uniqueBy(requests, 3).filter(function(r) {
72598                   // don't re-request tiles which have failed in the past
72599                   return _cache[r[3]] !== false;
72600               });
72601           }
72602
72603           function load(d) {
72604               _cache[d[3]] = true;
72605               select(this)
72606                   .on('error', null)
72607                   .on('load', null)
72608                   .classed('tile-loaded', true);
72609               render(selection);
72610           }
72611
72612           function error(d) {
72613               _cache[d[3]] = false;
72614               select(this)
72615                   .on('error', null)
72616                   .on('load', null)
72617                   .remove();
72618               render(selection);
72619           }
72620
72621           function imageTransform(d) {
72622               var ts = _tileSize * Math.pow(2, _zoom - d[2]);
72623               var scale = tileSizeAtZoom(d, _zoom);
72624               return 'translate(' +
72625                   ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
72626                   ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
72627                   'scale(' + scale + ',' + scale + ')';
72628           }
72629
72630           function tileCenter(d) {
72631               var ts = _tileSize * Math.pow(2, _zoom - d[2]);
72632               return [
72633                   ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
72634                   ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
72635               ];
72636           }
72637
72638           function debugTransform(d) {
72639               var coord = tileCenter(d);
72640               return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
72641           }
72642
72643
72644           // Pick a representative tile near the center of the viewport
72645           // (This is useful for sampling the imagery vintage)
72646           var dims = tiler.size();
72647           var mapCenter = [dims[0] / 2, dims[1] / 2];
72648           var minDist = Math.max(dims[0], dims[1]);
72649           var nearCenter;
72650
72651           requests.forEach(function(d) {
72652               var c = tileCenter(d);
72653               var dist = geoVecLength(c, mapCenter);
72654               if (dist < minDist) {
72655                   minDist = dist;
72656                   nearCenter = d;
72657               }
72658           });
72659
72660
72661           var image = selection.selectAll('img')
72662               .data(requests, function(d) { return d[3]; });
72663
72664           image.exit()
72665               .style(transformProp, imageTransform)
72666               .classed('tile-removing', true)
72667               .classed('tile-center', false)
72668               .each(function() {
72669                   var tile = select(this);
72670                   window.setTimeout(function() {
72671                       if (tile.classed('tile-removing')) {
72672                           tile.remove();
72673                       }
72674                   }, 300);
72675               });
72676
72677           image.enter()
72678             .append('img')
72679               .attr('class', 'tile')
72680               .attr('src', function(d) { return d[3]; })
72681               .on('error', error)
72682               .on('load', load)
72683             .merge(image)
72684               .style(transformProp, imageTransform)
72685               .classed('tile-debug', showDebug)
72686               .classed('tile-removing', false)
72687               .classed('tile-center', function(d) { return d === nearCenter; });
72688
72689
72690
72691           var debug = selection.selectAll('.tile-label-debug')
72692               .data(showDebug ? requests : [], function(d) { return d[3]; });
72693
72694           debug.exit()
72695               .remove();
72696
72697           if (showDebug) {
72698               var debugEnter = debug.enter()
72699                   .append('div')
72700                   .attr('class', 'tile-label-debug');
72701
72702               debugEnter
72703                   .append('div')
72704                   .attr('class', 'tile-label-debug-coord');
72705
72706               debugEnter
72707                   .append('div')
72708                   .attr('class', 'tile-label-debug-vintage');
72709
72710               debug = debug.merge(debugEnter);
72711
72712               debug
72713                   .style(transformProp, debugTransform);
72714
72715               debug
72716                   .selectAll('.tile-label-debug-coord')
72717                   .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
72718
72719               debug
72720                   .selectAll('.tile-label-debug-vintage')
72721                   .each(function(d) {
72722                       var span = select(this);
72723                       var center = context.projection.invert(tileCenter(d));
72724                       _source.getMetadata(center, d, function(err, result) {
72725                           span.text((result && result.vintage && result.vintage.range) ||
72726                               t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
72727                           );
72728                       });
72729                   });
72730           }
72731
72732       }
72733
72734
72735       background.projection = function(_) {
72736           if (!arguments.length) return _projection;
72737           _projection = _;
72738           return background;
72739       };
72740
72741
72742       background.dimensions = function(_) {
72743           if (!arguments.length) return tiler.size();
72744           tiler.size(_);
72745           return background;
72746       };
72747
72748
72749       background.source = function(_) {
72750           if (!arguments.length) return _source;
72751           _source = _;
72752           _tileSize = _source.tileSize;
72753           _cache = {};
72754           tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent);
72755           return background;
72756       };
72757
72758
72759       return background;
72760   }
72761
72762   function rendererBackground(context) {
72763       var dispatch$1 = dispatch('change');
72764       var detected = utilDetect();
72765       var baseLayer = rendererTileLayer(context).projection(context.projection);
72766       var _isValid = true;
72767       var _overlayLayers = [];
72768       var _backgroundSources = [];
72769       var _brightness = 1;
72770       var _contrast = 1;
72771       var _saturation = 1;
72772       var _sharpness = 1;
72773
72774
72775       function background(selection) {
72776           // If we are displaying an Esri basemap at high zoom,
72777           // check its tilemap to see how high the zoom can go
72778           if (context.map().zoom() > 18) {
72779               var basemap = baseLayer.source();
72780               if (basemap && /^EsriWorldImagery/.test(basemap.id)) {
72781                   var center = context.map().center();
72782                   basemap.fetchTilemap(center);
72783               }
72784           }
72785
72786           // Is the imagery valid here? - #4827
72787           var sources = background.sources(context.map().extent());
72788           var wasValid = _isValid;
72789           _isValid = !!sources
72790               .filter(function(d) { return d === baseLayer.source(); }).length;
72791
72792           if (wasValid !== _isValid) {      // change in valid status
72793               background.updateImagery();
72794           }
72795
72796
72797           var baseFilter = '';
72798           if (detected.cssfilters) {
72799               if (_brightness !== 1) {
72800                   baseFilter += 'brightness(' + _brightness + ')';
72801               }
72802               if (_contrast !== 1) {
72803                   baseFilter += 'contrast(' + _contrast + ')';
72804               }
72805               if (_saturation !== 1) {
72806                   baseFilter += 'saturate(' + _saturation + ')';
72807               }
72808               if (_sharpness < 1) {  // gaussian blur
72809                   var blur = interpolateNumber(0.5, 5)(1 - _sharpness);
72810                   baseFilter += 'blur(' + blur + 'px)';
72811               }
72812           }
72813
72814           var base = selection.selectAll('.layer-background')
72815               .data([0]);
72816
72817           base = base.enter()
72818               .insert('div', '.layer-data')
72819               .attr('class', 'layer layer-background')
72820               .merge(base);
72821
72822           if (detected.cssfilters) {
72823               base.style('filter', baseFilter || null);
72824           } else {
72825               base.style('opacity', _brightness);
72826           }
72827
72828
72829           var imagery = base.selectAll('.layer-imagery')
72830               .data([0]);
72831
72832           imagery.enter()
72833               .append('div')
72834               .attr('class', 'layer layer-imagery')
72835               .merge(imagery)
72836               .call(baseLayer);
72837
72838
72839           var maskFilter = '';
72840           var mixBlendMode = '';
72841           if (detected.cssfilters && _sharpness > 1) {  // apply unsharp mask
72842               mixBlendMode = 'overlay';
72843               maskFilter = 'saturate(0) blur(3px) invert(1)';
72844
72845               var contrast = _sharpness - 1;
72846               maskFilter += ' contrast(' + contrast + ')';
72847
72848               var brightness = interpolateNumber(1, 0.85)(_sharpness - 1);
72849               maskFilter += ' brightness(' + brightness + ')';
72850           }
72851
72852           var mask = base.selectAll('.layer-unsharp-mask')
72853               .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
72854
72855           mask.exit()
72856               .remove();
72857
72858           mask.enter()
72859               .append('div')
72860               .attr('class', 'layer layer-mask layer-unsharp-mask')
72861               .merge(mask)
72862               .call(baseLayer)
72863               .style('filter', maskFilter || null)
72864               .style('mix-blend-mode', mixBlendMode || null);
72865
72866
72867           var overlays = selection.selectAll('.layer-overlay')
72868               .data(_overlayLayers, function(d) { return d.source().name(); });
72869
72870           overlays.exit()
72871               .remove();
72872
72873           overlays.enter()
72874               .insert('div', '.layer-data')
72875               .attr('class', 'layer layer-overlay')
72876               .merge(overlays)
72877               .each(function(layer) { select(this).call(layer); });
72878       }
72879
72880
72881       background.updateImagery = function() {
72882           var b = baseLayer.source();
72883           if (context.inIntro() || !b) return;
72884
72885           var o = _overlayLayers
72886               .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
72887               .map(function (d) { return d.source().id; })
72888               .join(',');
72889
72890           var meters = geoOffsetToMeters(b.offset());
72891           var epsilon = 0.01;
72892           var x = +meters[0].toFixed(2);
72893           var y = +meters[1].toFixed(2);
72894           var q = utilStringQs(window.location.hash.substring(1));
72895
72896           var id = b.id;
72897           if (id === 'custom') {
72898               id = 'custom:' + b.template();
72899           }
72900
72901           if (id) {
72902               q.background = id;
72903           } else {
72904               delete q.background;
72905           }
72906
72907           if (o) {
72908               q.overlays = o;
72909           } else {
72910               delete q.overlays;
72911           }
72912
72913           if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
72914               q.offset = x + ',' + y;
72915           } else {
72916               delete q.offset;
72917           }
72918
72919           if (!window.mocha) {
72920               window.location.replace('#' + utilQsString(q, true));
72921           }
72922
72923           var imageryUsed = [];
72924
72925           var current = b.imageryUsed();
72926           if (current && _isValid) {
72927               imageryUsed.push(current);
72928           }
72929
72930           _overlayLayers
72931               .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
72932               .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
72933
72934           var data = context.layers().layer('data');
72935           if (data && data.enabled() && data.hasData()) {
72936               imageryUsed.push(data.getSrc());
72937           }
72938
72939           var streetside = context.layers().layer('streetside');
72940           if (streetside && streetside.enabled()) {
72941               imageryUsed.push('Bing Streetside');
72942           }
72943
72944           var mapillary_images = context.layers().layer('mapillary-images');
72945           if (mapillary_images && mapillary_images.enabled()) {
72946               imageryUsed.push('Mapillary Images');
72947           }
72948
72949           var mapillary_signs = context.layers().layer('mapillary-signs');
72950           if (mapillary_signs && mapillary_signs.enabled()) {
72951               imageryUsed.push('Mapillary Signs');
72952           }
72953
72954           var openstreetcam_images = context.layers().layer('openstreetcam-images');
72955           if (openstreetcam_images && openstreetcam_images.enabled()) {
72956               imageryUsed.push('OpenStreetCam Images');
72957           }
72958
72959           context.history().imageryUsed(imageryUsed);
72960       };
72961
72962
72963       background.sources = function(extent) {
72964           if (!data.imagery || !data.imagery.query) return [];   // called before init()?
72965
72966           var matchIDs = {};
72967           var matchImagery = data.imagery.query.bbox(extent.rectangle(), true) || [];
72968           matchImagery.forEach(function(d) { matchIDs[d.id] = true; });
72969
72970           return _backgroundSources.filter(function(source) {
72971               return matchIDs[source.id] || !source.polygon;   // no polygon = worldwide
72972           });
72973       };
72974
72975
72976       background.dimensions = function(d) {
72977           if (!d) return;
72978           baseLayer.dimensions(d);
72979
72980           _overlayLayers.forEach(function(layer) {
72981               layer.dimensions(d);
72982           });
72983       };
72984
72985
72986       background.baseLayerSource = function(d) {
72987           if (!arguments.length) return baseLayer.source();
72988
72989           // test source against OSM imagery blacklists..
72990           var osm = context.connection();
72991           if (!osm) return background;
72992
72993           var blacklists = context.connection().imageryBlacklists();
72994           var template = d.template();
72995           var fail = false;
72996           var tested = 0;
72997           var regex;
72998
72999           for (var i = 0; i < blacklists.length; i++) {
73000               try {
73001                   regex = new RegExp(blacklists[i]);
73002                   fail = regex.test(template);
73003                   tested++;
73004                   if (fail) break;
73005               } catch (e) {
73006                   /* noop */
73007               }
73008           }
73009
73010           // ensure at least one test was run.
73011           if (!tested) {
73012               regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
73013               fail = regex.test(template);
73014           }
73015
73016           baseLayer.source(!fail ? d : background.findSource('none'));
73017           dispatch$1.call('change');
73018           background.updateImagery();
73019           return background;
73020       };
73021
73022
73023       background.findSource = function(id) {
73024           return find$1(_backgroundSources, function(d) {
73025               return d.id && d.id === id;
73026           });
73027       };
73028
73029
73030       background.bing = function() {
73031           background.baseLayerSource(background.findSource('Bing'));
73032       };
73033
73034
73035       background.showsLayer = function(d) {
73036           return d.id === baseLayer.source().id ||
73037               _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
73038       };
73039
73040
73041       background.overlayLayerSources = function() {
73042           return _overlayLayers.map(function (l) { return l.source(); });
73043       };
73044
73045
73046       background.toggleOverlayLayer = function(d) {
73047           var layer;
73048           for (var i = 0; i < _overlayLayers.length; i++) {
73049               layer = _overlayLayers[i];
73050               if (layer.source() === d) {
73051                   _overlayLayers.splice(i, 1);
73052                   dispatch$1.call('change');
73053                   background.updateImagery();
73054                   return;
73055               }
73056           }
73057
73058           layer = rendererTileLayer(context)
73059               .source(d)
73060               .projection(context.projection)
73061               .dimensions(baseLayer.dimensions()
73062           );
73063
73064           _overlayLayers.push(layer);
73065           dispatch$1.call('change');
73066           background.updateImagery();
73067       };
73068
73069
73070       background.nudge = function(d, zoom) {
73071           baseLayer.source().nudge(d, zoom);
73072           dispatch$1.call('change');
73073           background.updateImagery();
73074           return background;
73075       };
73076
73077
73078       background.offset = function(d) {
73079           if (!arguments.length) return baseLayer.source().offset();
73080           baseLayer.source().offset(d);
73081           dispatch$1.call('change');
73082           background.updateImagery();
73083           return background;
73084       };
73085
73086
73087       background.brightness = function(d) {
73088           if (!arguments.length) return _brightness;
73089           _brightness = d;
73090           if (context.mode()) dispatch$1.call('change');
73091           return background;
73092       };
73093
73094
73095       background.contrast = function(d) {
73096           if (!arguments.length) return _contrast;
73097           _contrast = d;
73098           if (context.mode()) dispatch$1.call('change');
73099           return background;
73100       };
73101
73102
73103       background.saturation = function(d) {
73104           if (!arguments.length) return _saturation;
73105           _saturation = d;
73106           if (context.mode()) dispatch$1.call('change');
73107           return background;
73108       };
73109
73110
73111       background.sharpness = function(d) {
73112           if (!arguments.length) return _sharpness;
73113           _sharpness = d;
73114           if (context.mode()) dispatch$1.call('change');
73115           return background;
73116       };
73117
73118
73119       background.init = function() {
73120           function parseMap(qmap) {
73121               if (!qmap) return false;
73122               var args = qmap.split('/').map(Number);
73123               if (args.length < 3 || args.some(isNaN)) return false;
73124               return geoExtent([args[2], args[1]]);
73125           }
73126
73127           var q = utilStringQs(window.location.hash.substring(1));
73128           var requested = q.background || q.layer;
73129           var extent = parseMap(q.map);
73130           var first;
73131           var best;
73132
73133
73134           data.imagery = data.imagery || [];
73135           data.imagery.features = {};
73136
73137           // build efficient index and querying for data.imagery
73138           var features = data.imagery.map(function(source) {
73139               if (!source.polygon) return null;
73140
73141               // Add an extra array nest to each element in `source.polygon`
73142               // so the rings are not treated as a bunch of holes:
73143               // what we have: [ [[outer],[hole],[hole]] ]
73144               // what we want: [ [[outer]],[[outer]],[[outer]] ]
73145               var rings = source.polygon.map(function(ring) { return [ring]; });
73146
73147               var feature = {
73148                   type: 'Feature',
73149                   properties: { id: source.id },
73150                   geometry: { type: 'MultiPolygon', coordinates: rings }
73151               };
73152
73153               data.imagery.features[source.id] = feature;
73154               return feature;
73155
73156           }).filter(Boolean);
73157
73158           data.imagery.query = whichPolygon_1({
73159               type: 'FeatureCollection',
73160               features: features
73161           });
73162
73163
73164           // Add all the available imagery sources
73165           _backgroundSources = data.imagery.map(function(source) {
73166               if (source.type === 'bing') {
73167                   return rendererBackgroundSource.Bing(source, dispatch$1);
73168               } else if (/^EsriWorldImagery/.test(source.id)) {
73169                   return rendererBackgroundSource.Esri(source);
73170               } else {
73171                   return rendererBackgroundSource(source);
73172               }
73173           });
73174
73175           first = _backgroundSources.length && _backgroundSources[0];
73176
73177           // Add 'None'
73178           _backgroundSources.unshift(rendererBackgroundSource.None());
73179
73180           // Add 'Custom'
73181           var template = context.storage('background-custom-template') || '';
73182           var custom = rendererBackgroundSource.Custom(template);
73183           _backgroundSources.unshift(custom);
73184
73185
73186           // Decide which background layer to display
73187           if (!requested && extent) {
73188               best = find$1(this.sources(extent), function(s) { return s.best(); });
73189           }
73190           if (requested && requested.indexOf('custom:') === 0) {
73191               template = requested.replace(/^custom:/, '');
73192               background.baseLayerSource(custom.template(template));
73193               context.storage('background-custom-template', template);
73194           } else {
73195               background.baseLayerSource(
73196                   background.findSource(requested) ||
73197                   best ||
73198                   background.findSource(context.storage('background-last-used')) ||
73199                   background.findSource('Bing') ||
73200                   first ||
73201                   background.findSource('none')
73202               );
73203           }
73204
73205           var locator = find$1(_backgroundSources, function(d) {
73206               return d.overlay && d.default;
73207           });
73208
73209           if (locator) {
73210               background.toggleOverlayLayer(locator);
73211           }
73212
73213           var overlays = (q.overlays || '').split(',');
73214           overlays.forEach(function(overlay) {
73215               overlay = background.findSource(overlay);
73216               if (overlay) {
73217                   background.toggleOverlayLayer(overlay);
73218               }
73219           });
73220
73221           if (q.gpx) {
73222               var gpx = context.layers().layer('data');
73223               if (gpx) {
73224                   gpx.url(q.gpx, '.gpx');
73225               }
73226           }
73227
73228           if (q.offset) {
73229               var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
73230                   return !isNaN(n) && n;
73231               });
73232
73233               if (offset.length === 2) {
73234                   background.offset(geoMetersToOffset(offset));
73235               }
73236           }
73237       };
73238
73239
73240       return utilRebind(background, dispatch$1, 'on');
73241   }
73242
73243   function rendererFeatures(context) {
73244       var traffic_roads = {
73245           'motorway': true,
73246           'motorway_link': true,
73247           'trunk': true,
73248           'trunk_link': true,
73249           'primary': true,
73250           'primary_link': true,
73251           'secondary': true,
73252           'secondary_link': true,
73253           'tertiary': true,
73254           'tertiary_link': true,
73255           'residential': true,
73256           'unclassified': true,
73257           'living_street': true
73258       };
73259
73260       var service_roads = {
73261           'service': true,
73262           'road': true,
73263           'track': true
73264       };
73265
73266       var paths = {
73267           'path': true,
73268           'footway': true,
73269           'cycleway': true,
73270           'bridleway': true,
73271           'steps': true,
73272           'pedestrian': true,
73273           'corridor': true
73274       };
73275
73276       var past_futures = {
73277           'proposed': true,
73278           'construction': true,
73279           'abandoned': true,
73280           'dismantled': true,
73281           'disused': true,
73282           'razed': true,
73283           'demolished': true,
73284           'obliterated': true
73285       };
73286
73287       var dispatch$1 = dispatch('change', 'redraw');
73288       var _cullFactor = 1;
73289       var _cache = {};
73290       var _features = {};
73291       var _stats = {};
73292       var _keys = [];
73293       var _hidden = [];
73294       var _forceVisible = {};
73295
73296
73297       function update() {
73298           if (!window.mocha) {
73299               var q = utilStringQs(window.location.hash.substring(1));
73300               var disabled = features.disabled();
73301               if (disabled.length) {
73302                   q.disable_features = disabled.join(',');
73303               } else {
73304                   delete q.disable_features;
73305               }
73306               window.location.replace('#' + utilQsString(q, true));
73307               context.storage('disabled-features', disabled.join(','));
73308           }
73309           _hidden = features.hidden();
73310           dispatch$1.call('change');
73311           dispatch$1.call('redraw');
73312       }
73313
73314
73315       function defineFeature(k, filter, max) {
73316           var isEnabled = true;
73317
73318           _keys.push(k);
73319           _features[k] = {
73320               filter: filter,
73321               enabled: isEnabled,   // whether the user wants it enabled..
73322               count: 0,
73323               currentMax: (max || Infinity),
73324               defaultMax: (max || Infinity),
73325               enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
73326               disable: function() { this.enabled = false; this.currentMax = 0; },
73327               hidden: function() {
73328                   return !context.editable() ||
73329                       (this.count === 0 && !this.enabled) ||
73330                       this.count > this.currentMax * _cullFactor;
73331               },
73332               autoHidden: function() { return this.hidden() && this.currentMax > 0; }
73333           };
73334       }
73335
73336
73337       defineFeature('points', function isPoint(tags, geometry) {
73338           return geometry === 'point';
73339       }, 200);
73340
73341       defineFeature('traffic_roads', function isTrafficRoad(tags) {
73342           return traffic_roads[tags.highway];
73343       });
73344
73345       defineFeature('service_roads', function isServiceRoad(tags) {
73346           return service_roads[tags.highway];
73347       });
73348
73349       defineFeature('paths', function isPath(tags) {
73350           return paths[tags.highway];
73351       });
73352
73353       defineFeature('buildings', function isBuilding(tags) {
73354           return (
73355               !!tags['building:part'] ||
73356               (!!tags.building && tags.building !== 'no') ||
73357               tags.parking === 'multi-storey' ||
73358               tags.parking === 'sheds' ||
73359               tags.parking === 'carports' ||
73360               tags.parking === 'garage_boxes'
73361           );
73362       }, 250);
73363
73364       defineFeature('landuse', function isLanduse(tags, geometry) {
73365           return geometry === 'area' &&
73366               !_features.buildings.filter(tags) &&
73367               !_features.water.filter(tags);
73368       });
73369
73370       defineFeature('boundaries', function isBoundary(tags) {
73371           return (
73372               !!tags.boundary
73373           ) && !(
73374               traffic_roads[tags.highway] ||
73375               service_roads[tags.highway] ||
73376               paths[tags.highway]
73377           );
73378       });
73379
73380       defineFeature('water', function isWater(tags) {
73381           return (
73382               !!tags.waterway ||
73383               tags.natural === 'water' ||
73384               tags.natural === 'coastline' ||
73385               tags.natural === 'bay' ||
73386               tags.landuse === 'pond' ||
73387               tags.landuse === 'basin' ||
73388               tags.landuse === 'reservoir' ||
73389               tags.landuse === 'salt_pond'
73390           );
73391       });
73392
73393       defineFeature('rail', function isRail(tags) {
73394           return (
73395               !!tags.railway ||
73396               tags.landuse === 'railway'
73397           ) && !(
73398               traffic_roads[tags.highway] ||
73399               service_roads[tags.highway] ||
73400               paths[tags.highway]
73401           );
73402       });
73403
73404       defineFeature('power', function isPower(tags) {
73405           return !!tags.power;
73406       });
73407
73408       // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
73409       defineFeature('past_future', function isPastFuture(tags) {
73410           if (
73411               traffic_roads[tags.highway] ||
73412               service_roads[tags.highway] ||
73413               paths[tags.highway]
73414           ) { return false; }
73415
73416           var strings = Object.keys(tags);
73417
73418           for (var i = 0; i < strings.length; i++) {
73419               var s = strings[i];
73420               if (past_futures[s] || past_futures[tags[s]]) { return true; }
73421           }
73422           return false;
73423       });
73424
73425       // Lines or areas that don't match another feature filter.
73426       // IMPORTANT: The 'others' feature must be the last one defined,
73427       //   so that code in getMatches can skip this test if `hasMatch = true`
73428       defineFeature('others', function isOther(tags, geometry) {
73429           return (geometry === 'line' || geometry === 'area');
73430       });
73431
73432
73433       function features() {}
73434
73435
73436       features.features = function() {
73437           return _features;
73438       };
73439
73440
73441       features.keys = function() {
73442           return _keys;
73443       };
73444
73445
73446       features.enabled = function(k) {
73447           if (!arguments.length) {
73448               return _keys.filter(function(k) { return _features[k].enabled; });
73449           }
73450           return _features[k] && _features[k].enabled;
73451       };
73452
73453
73454       features.disabled = function(k) {
73455           if (!arguments.length) {
73456               return _keys.filter(function(k) { return !_features[k].enabled; });
73457           }
73458           return _features[k] && !_features[k].enabled;
73459       };
73460
73461
73462       features.hidden = function(k) {
73463           if (!arguments.length) {
73464               return _keys.filter(function(k) { return _features[k].hidden(); });
73465           }
73466           return _features[k] && _features[k].hidden();
73467       };
73468
73469
73470       features.autoHidden = function(k) {
73471           if (!arguments.length) {
73472               return _keys.filter(function(k) { return _features[k].autoHidden(); });
73473           }
73474           return _features[k] && _features[k].autoHidden();
73475       };
73476
73477
73478       features.enable = function(k) {
73479           if (_features[k] && !_features[k].enabled) {
73480               _features[k].enable();
73481               update();
73482           }
73483       };
73484
73485
73486       features.disable = function(k) {
73487           if (_features[k] && _features[k].enabled) {
73488               _features[k].disable();
73489               update();
73490           }
73491       };
73492
73493
73494       features.toggle = function(k) {
73495           if (_features[k]) {
73496               (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
73497               update();
73498           }
73499       };
73500
73501
73502       features.resetStats = function() {
73503           for (var i = 0; i < _keys.length; i++) {
73504               _features[_keys[i]].count = 0;
73505           }
73506           dispatch$1.call('change');
73507       };
73508
73509
73510       features.gatherStats = function(d, resolver, dimensions) {
73511           var needsRedraw = false;
73512           var type = groupBy(d, function(ent) { return ent.type; });
73513           var entities = [].concat(type.relation || [], type.way || [], type.node || []);
73514           var currHidden, geometry, matches, i, j;
73515
73516           for (i = 0; i < _keys.length; i++) {
73517               _features[_keys[i]].count = 0;
73518           }
73519
73520           // adjust the threshold for point/building culling based on viewport size..
73521           // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
73522           _cullFactor = dimensions[0] * dimensions[1] / 1000000;
73523
73524           for (i = 0; i < entities.length; i++) {
73525               geometry = entities[i].geometry(resolver);
73526               matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
73527               for (j = 0; j < matches.length; j++) {
73528                   _features[matches[j]].count++;
73529               }
73530           }
73531
73532           currHidden = features.hidden();
73533           if (currHidden !== _hidden) {
73534               _hidden = currHidden;
73535               needsRedraw = true;
73536               dispatch$1.call('change');
73537           }
73538
73539           return needsRedraw;
73540       };
73541
73542
73543       features.stats = function() {
73544           for (var i = 0; i < _keys.length; i++) {
73545               _stats[_keys[i]] = _features[_keys[i]].count;
73546           }
73547
73548           return _stats;
73549       };
73550
73551
73552       features.clear = function(d) {
73553           for (var i = 0; i < d.length; i++) {
73554               features.clearEntity(d[i]);
73555           }
73556       };
73557
73558
73559       features.clearEntity = function(entity) {
73560           delete _cache[osmEntity.key(entity)];
73561       };
73562
73563
73564       features.reset = function() {
73565           _cache = {};
73566       };
73567
73568       // only certain relations are worth checking
73569       function relationShouldBeChecked(relation) {
73570           // multipolygon features have `area` geometry and aren't checked here
73571           return relation.tags.type === 'boundary';
73572       }
73573
73574       features.getMatches = function(entity, resolver, geometry) {
73575           if (geometry === 'vertex' ||
73576               (geometry === 'relation' && !relationShouldBeChecked(entity))) return {};
73577
73578           var ent = osmEntity.key(entity);
73579           if (!_cache[ent]) {
73580               _cache[ent] = {};
73581           }
73582
73583           if (!_cache[ent].matches) {
73584               var matches = {};
73585               var hasMatch = false;
73586
73587               for (var i = 0; i < _keys.length; i++) {
73588                   if (_keys[i] === 'others') {
73589                       if (hasMatch) continue;
73590
73591                       // If an entity...
73592                       //   1. is a way that hasn't matched other 'interesting' feature rules,
73593                       if (entity.type === 'way') {
73594                           var parents = features.getParents(entity, resolver, geometry);
73595
73596                           //   2a. belongs only to a single multipolygon relation
73597                           if ((parents.length === 1 && parents[0].isMultipolygon()) ||
73598                               // 2b. or belongs only to boundary relations
73599                               (parents.length > 0 && parents.every(function(parent) { return parent.tags.type === 'boundary'; }))) {
73600
73601                               // ...then match whatever feature rules the parent relation has matched.
73602                               // see #2548, #2887
73603                               //
73604                               // IMPORTANT:
73605                               // For this to work, getMatches must be called on relations before ways.
73606                               //
73607                               var pkey = osmEntity.key(parents[0]);
73608                               if (_cache[pkey] && _cache[pkey].matches) {
73609                                   matches = clone(_cache[pkey].matches);
73610                                   continue;
73611                               }
73612                           }
73613                       }
73614                   }
73615
73616                   if (_features[_keys[i]].filter(entity.tags, geometry)) {
73617                       matches[_keys[i]] = hasMatch = true;
73618                   }
73619               }
73620               _cache[ent].matches = matches;
73621           }
73622
73623           return _cache[ent].matches;
73624       };
73625
73626
73627       features.getParents = function(entity, resolver, geometry) {
73628           if (geometry === 'point') return [];
73629
73630           var ent = osmEntity.key(entity);
73631           if (!_cache[ent]) {
73632               _cache[ent] = {};
73633           }
73634
73635           if (!_cache[ent].parents) {
73636               var parents = [];
73637               if (geometry === 'vertex') {
73638                   parents = resolver.parentWays(entity);
73639               } else {   // 'line', 'area', 'relation'
73640                   parents = resolver.parentRelations(entity);
73641               }
73642               _cache[ent].parents = parents;
73643           }
73644           return _cache[ent].parents;
73645       };
73646
73647
73648       features.isHiddenPreset = function(preset, geometry) {
73649           if (!_hidden.length) return false;
73650           if (!preset.tags) return false;
73651           for (var i = 0; i < _hidden.length; i++) {
73652               if (_features[_hidden[i]].filter(preset.setTags({}, geometry), geometry)) {
73653                   return _hidden[i];
73654               }
73655           }
73656           return false;
73657       };
73658
73659
73660       features.isHiddenFeature = function(entity, resolver, geometry) {
73661           if (!_hidden.length) return false;
73662           if (!entity.version) return false;
73663
73664           var matches = features.getMatches(entity, resolver, geometry);
73665
73666           for (var i = 0; i < _hidden.length; i++) {
73667               if (matches[_hidden[i]]) return true;
73668           }
73669           return false;
73670       };
73671
73672
73673       features.isHiddenChild = function(entity, resolver, geometry) {
73674           if (!_hidden.length) return false;
73675           if (!entity.version || geometry === 'point') return false;
73676
73677           var parents = features.getParents(entity, resolver, geometry);
73678           if (!parents.length) return false;
73679
73680           for (var i = 0; i < parents.length; i++) {
73681               if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
73682                   return false;
73683               }
73684           }
73685           return true;
73686       };
73687
73688
73689       features.hasHiddenConnections = function(entity, resolver) {
73690           if (!_hidden.length) return false;
73691           var childNodes, connections;
73692
73693           if (entity.type === 'midpoint') {
73694               childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
73695               connections = [];
73696           } else {
73697               childNodes = entity.nodes ? resolver.childNodes(entity) : [];
73698               connections = features.getParents(entity, resolver, entity.geometry(resolver));
73699           }
73700
73701           // gather ways connected to child nodes..
73702           connections = reduce(childNodes, function(result, e) {
73703               return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
73704           }, connections);
73705
73706           return connections.length ? some(connections, function(e) {
73707               return features.isHidden(e, resolver, e.geometry(resolver));
73708           }) : false;
73709       };
73710
73711
73712       features.isHidden = function(entity, resolver, geometry) {
73713           if (!_hidden.length) return false;
73714           if (!entity.version) return false;
73715           if (_forceVisible[entity.id]) return false;
73716
73717           var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
73718           return fn(entity, resolver, geometry);
73719       };
73720
73721
73722       features.filter = function(d, resolver) {
73723           if (!_hidden.length) return d;
73724
73725           var result = [];
73726           for (var i = 0; i < d.length; i++) {
73727               var entity = d[i];
73728               if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
73729                   result.push(entity);
73730               }
73731           }
73732           return result;
73733       };
73734
73735
73736       features.forceVisible = function(entityIDs) {
73737           if (!arguments.length) return Object.keys(_forceVisible);
73738           _forceVisible = {};
73739           for (var i = 0; i < entityIDs.length; i++) {
73740               _forceVisible[entityIDs[i]] = true;
73741           }
73742           return features;
73743       };
73744
73745
73746       features.init = function() {
73747           var storage = context.storage('disabled-features');
73748           if (storage) {
73749               var storageDisabled = storage.replace(/;/g, ',').split(',');
73750               storageDisabled.forEach(features.disable);
73751           }
73752
73753           var q = utilStringQs(window.location.hash.substring(1));
73754           if (q.disable_features) {
73755               var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
73756               hashDisabled.forEach(features.disable);
73757           }
73758       };
73759
73760       return utilRebind(features, dispatch$1, 'on');
73761   }
73762
73763   function utilBindOnce(target, type, listener, capture) {
73764       var typeOnce = type + '.once';
73765       function one() {
73766           target.on(typeOnce, null);
73767           listener.apply(this, arguments);
73768       }
73769       target.on(typeOnce, one, capture);
73770       return this;
73771   }
73772
73773   // constants
73774   var TILESIZE = 256;
73775   var kMin = geoZoomToScale(2, TILESIZE);
73776   var kMax = geoZoomToScale(24, TILESIZE);
73777
73778   function clamp(num, min, max) {
73779       return Math.max(min, Math.min(num, max));
73780   }
73781
73782
73783   function rendererMap(context) {
73784       var dispatch$1 = dispatch('move', 'drawn');
73785       var projection = context.projection;
73786       var curtainProjection = context.curtainProjection;
73787       var drawLayers = svgLayers(projection, context);
73788       var drawPoints = svgPoints(projection, context);
73789       var drawVertices = svgVertices(projection, context);
73790       var drawLines = svgLines(projection, context);
73791       var drawAreas = svgAreas(projection, context);
73792       var drawMidpoints = svgMidpoints(projection, context);
73793       var drawLabels = svgLabels(projection, context);
73794
73795       var _selection = select(null);
73796       var supersurface = select(null);
73797       var wrapper = select(null);
73798       var surface = select(null);
73799
73800       var _dimensions = [1, 1];
73801       var _dblClickEnabled = true;
73802       var _redrawEnabled = true;
73803       var _gestureTransformStart;
73804       var _transformStart = projection.transform();
73805       var _transformLast;
73806       var _isTransformed = false;
73807       var _minzoom = 0;
73808       var _getMouseCoords;
73809       var _mouseEvent;
73810
73811       var zoom = d3_zoom()
73812           .scaleExtent([kMin, kMax])
73813           .interpolate(interpolate)
73814           .filter(zoomEventFilter)
73815           .on('zoom', zoomPan);
73816
73817       var scheduleRedraw = throttle(redraw, 750);
73818       // var isRedrawScheduled = false;
73819       // var pendingRedrawCall;
73820       // function scheduleRedraw() {
73821       //     // Only schedule the redraw if one has not already been set.
73822       //     if (isRedrawScheduled) return;
73823       //     isRedrawScheduled = true;
73824       //     var that = this;
73825       //     var args = arguments;
73826       //     pendingRedrawCall = window.requestIdleCallback(function () {
73827       //         // Reset the boolean so future redraws can be set.
73828       //         isRedrawScheduled = false;
73829       //         redraw.apply(that, args);
73830       //     }, { timeout: 1400 });
73831       // }
73832
73833       function cancelPendingRedraw() {
73834           scheduleRedraw.cancel();
73835           // isRedrawScheduled = false;
73836           // window.cancelIdleCallback(pendingRedrawCall);
73837       }
73838
73839
73840       function map(selection) {
73841           _selection = selection;
73842
73843           context
73844               .on('change.map', immediateRedraw);
73845
73846           var osm = context.connection();
73847           if (osm) {
73848               osm.on('change.map', immediateRedraw);
73849           }
73850
73851           context.history()
73852               .on('change.map', immediateRedraw)
73853               .on('undone.map redone.map', function(stack) {
73854                   var mode = context.mode().id;
73855                   if (mode !== 'browse' && mode !== 'select') return;
73856
73857                   var followSelected = false;
73858                   if (Array.isArray(stack.selectedIDs)) {
73859                       followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
73860                       context.enter(
73861                           modeSelect(context, stack.selectedIDs).follow(followSelected)
73862                       );
73863                   }
73864                   if (!followSelected && stack.transform) {
73865                       map.transformEase(stack.transform);
73866                   }
73867               });
73868
73869           context.background()
73870               .on('change.map', immediateRedraw);
73871
73872           context.features()
73873               .on('redraw.map', immediateRedraw);
73874
73875           drawLayers
73876               .on('change.map', function() {
73877                   context.background().updateImagery();
73878                   immediateRedraw();
73879               });
73880
73881           selection
73882               .on('dblclick.map', dblClick)
73883               .call(zoom)
73884               .call(zoom.transform, projection.transform());
73885
73886           supersurface = selection.append('div')
73887               .attr('id', 'supersurface')
73888               .call(utilSetTransform, 0, 0);
73889
73890           // Need a wrapper div because Opera can't cope with an absolutely positioned
73891           // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
73892           wrapper = supersurface
73893               .append('div')
73894               .attr('class', 'layer layer-data');
73895
73896           map.surface = surface = wrapper
73897               .call(drawLayers)
73898               .selectAll('.surface')
73899               .attr('id', 'surface');
73900
73901           surface
73902               .call(drawLabels.observe)
73903               .on('gesturestart.surface', function() {
73904                   _gestureTransformStart = projection.transform();
73905               })
73906               .on('gesturechange.surface', gestureChange)
73907               .on('mousedown.zoom', function() {
73908                   if (event.button === 2) {
73909                       event.stopPropagation();
73910                   }
73911               }, true)
73912               .on('mouseup.zoom', function() {
73913                   if (resetTransform()) {
73914                       immediateRedraw();
73915                   }
73916               })
73917               .on('mousemove.map', function() {
73918                   _mouseEvent = event;
73919               })
73920               .on('mouseover.vertices', function() {
73921                   if (map.editable() && !_isTransformed) {
73922                       var hover = event.target.__data__;
73923                       surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
73924                       dispatch$1.call('drawn', this, { full: false });
73925                   }
73926               })
73927               .on('mouseout.vertices', function() {
73928                   if (map.editable() && !_isTransformed) {
73929                       var hover = event.relatedTarget && event.relatedTarget.__data__;
73930                       surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
73931                       dispatch$1.call('drawn', this, { full: false });
73932                   }
73933               });
73934
73935           supersurface
73936               .call(context.background());
73937
73938           context.on('enter.map',  function() {
73939               if (map.editable() && !_isTransformed) {
73940                   // redraw immediately any objects affected by a change in selectedIDs.
73941                   var graph = context.graph();
73942                   var selectedAndParents = {};
73943                   context.selectedIDs().forEach(function(id) {
73944                       var entity = graph.hasEntity(id);
73945                       if (entity) {
73946                           selectedAndParents[entity.id] = entity;
73947                           if (entity.type === 'node') {
73948                               graph.parentWays(entity).forEach(function(parent) {
73949                                   selectedAndParents[parent.id] = parent;
73950                               });
73951                           }
73952                       }
73953                   });
73954                   var data = values$1(selectedAndParents);
73955                   var filter = function(d) { return d.id in selectedAndParents; };
73956
73957                   data = context.features().filter(data, graph);
73958
73959                   surface
73960                       .call(drawVertices.drawSelected, graph, map.extent())
73961                       .call(drawLines, graph, data, filter)
73962                       .call(drawAreas, graph, data, filter)
73963                       .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
73964
73965                   dispatch$1.call('drawn', this, { full: false });
73966
73967                   // redraw everything else later
73968                   scheduleRedraw();
73969               }
73970           });
73971
73972           map.dimensions(utilGetDimensions(selection));
73973       }
73974
73975
73976       function zoomEventFilter() {
73977           // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
73978           // Intercept `mousedown` and check if there is an orphaned zoom gesture.
73979           // This can happen if a previous `mousedown` occurred without a `mouseup`.
73980           // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
73981           // so that d3-zoom won't stop propagation of new `mousedown` events.
73982           if (event.type === 'mousedown') {
73983               var hasOrphan = false;
73984               var listeners = window.__on;
73985               for (var i = 0; i < listeners.length; i++) {
73986                   var listener = listeners[i];
73987                   if (listener.name === 'zoom' && listener.type === 'mouseup') {
73988                       hasOrphan = true;
73989                       break;
73990                   }
73991               }
73992               if (hasOrphan) {
73993                   var event$1 = window.CustomEvent;
73994                   if (event$1) {
73995                       event$1 = new event$1('mouseup');
73996                   } else {
73997                       event$1 = window.document.createEvent('Event');
73998                       event$1.initEvent('mouseup', false, false);
73999                   }
74000                   // Event needs to be dispatched with an event.view property.
74001                   event$1.view = window;
74002                   window.dispatchEvent(event$1);
74003               }
74004           }
74005
74006           return event.button !== 2;   // ignore right clicks
74007       }
74008
74009
74010       function pxCenter() {
74011           return [_dimensions[0] / 2, _dimensions[1] / 2];
74012       }
74013
74014
74015       function drawVector(difference, extent) {
74016           var mode = context.mode();
74017           var graph = context.graph();
74018           var features = context.features();
74019           var all = context.intersects(map.extent());
74020           var fullRedraw = false;
74021           var data;
74022           var filter;
74023
74024           if (difference) {
74025               var complete = difference.complete(map.extent());
74026               data = compact(values$1(complete));
74027               filter = function(d) { return d.id in complete; };
74028               features.clear(data);
74029
74030           } else {
74031               // force a full redraw if gatherStats detects that a feature
74032               // should be auto-hidden (e.g. points or buildings)..
74033               if (features.gatherStats(all, graph, _dimensions)) {
74034                   extent = undefined;
74035               }
74036
74037               if (extent) {
74038                   data = context.intersects(map.extent().intersection(extent));
74039                   var set = set$2(map$3(data, 'id'));
74040                   filter = function(d) { return set.has(d.id); };
74041
74042               } else {
74043                   data = all;
74044                   fullRedraw = true;
74045                   filter = utilFunctor(true);
74046               }
74047           }
74048
74049           data = features.filter(data, graph);
74050
74051           if (mode && mode.id === 'select') {
74052               // update selected vertices - the user might have just double-clicked a way,
74053               // creating a new vertex, triggering a partial redraw without a mode change
74054               surface.call(drawVertices.drawSelected, graph, map.extent());
74055           }
74056
74057           surface
74058               .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
74059               .call(drawLines, graph, data, filter)
74060               .call(drawAreas, graph, data, filter)
74061               .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
74062               .call(drawLabels, graph, data, filter, _dimensions, fullRedraw)
74063               .call(drawPoints, graph, data, filter);
74064
74065           dispatch$1.call('drawn', this, {full: true});
74066       }
74067
74068
74069       function editOff() {
74070           context.features().resetStats();
74071           surface.selectAll('.layer-osm *').remove();
74072           surface.selectAll('.layer-touch:not(.markers) *').remove();
74073
74074           var allowed = {
74075               'browse': true,
74076               'save': true,
74077               'select-note': true,
74078               'select-data': true,
74079               'select-error': true
74080           };
74081
74082           var mode = context.mode();
74083           if (mode && !allowed[mode.id]) {
74084               context.enter(modeBrowse(context));
74085           }
74086
74087           dispatch$1.call('drawn', this, {full: true});
74088       }
74089
74090
74091       function dblClick() {
74092           if (!_dblClickEnabled) {
74093               event.preventDefault();
74094               event.stopImmediatePropagation();
74095           }
74096       }
74097
74098
74099       function gestureChange() {
74100           // Remap Safari gesture events to wheel events - #5492
74101           // We want these disabled most places, but enabled for zoom/unzoom on map surface
74102           // https://developer.mozilla.org/en-US/docs/Web/API/GestureEvent
74103           var e = event;
74104           e.preventDefault();
74105
74106           var props = {
74107               deltaMode: 0,    // dummy values to ignore in zoomPan
74108               deltaY: 1,       // dummy values to ignore in zoomPan
74109               clientX: e.clientX,
74110               clientY: e.clientY,
74111               screenX: e.screenX,
74112               screenY: e.screenY,
74113               x: e.x,
74114               y: e.y
74115           };
74116
74117           var e2 = new WheelEvent('wheel', props);
74118           e2._scale = e.scale;         // preserve the original scale
74119           e2._rotation = e.rotation;   // preserve the original rotation
74120
74121           _selection.node().dispatchEvent(e2);
74122       }
74123
74124
74125       function zoomPan(manualEvent) {
74126           var event$1 = (manualEvent || event);
74127           var source = event$1.sourceEvent;
74128           var eventTransform = event$1.transform;
74129           var x = eventTransform.x;
74130           var y = eventTransform.y;
74131           var k = eventTransform.k;
74132
74133           if (_transformStart.x === x &&
74134               _transformStart.y === y &&
74135               _transformStart.k === k) {
74136               return;  // no change
74137           }
74138
74139           // Special handling of 'wheel' events:
74140           // They might be triggered by the user scrolling the mouse wheel,
74141           // or 2-finger pinch/zoom gestures, the transform may need adjustment.
74142           if (source && source.type === 'wheel') {
74143               var detected = utilDetect();
74144               var dX = source.deltaX;
74145               var dY = source.deltaY;
74146               var x2 = x;
74147               var y2 = y;
74148               var k2 = k;
74149               var t0, p0, p1;
74150
74151               // Normalize mousewheel scroll speed (Firefox) - #3029
74152               // If wheel delta is provided in LINE units, recalculate it in PIXEL units
74153               // We are essentially redoing the calculations that occur here:
74154               //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
74155               // See this for more info:
74156               //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
74157               if (source.deltaMode === 1 /* LINE */) {
74158                   // Convert from lines to pixels, more if the user is scrolling fast.
74159                   // (I made up the exp function to roughly match Firefox to what Chrome does)
74160                   // These numbers should be floats, because integers are treated as pan gesture below.
74161                   var lines = Math.abs(source.deltaY);
74162                   var sign = (source.deltaY > 0) ? 1 : -1;
74163                   dY = sign * clamp(
74164                       Math.exp((lines - 1) * 0.75) * 4.000244140625,
74165                       4.000244140625,    // min
74166                       350.000244140625   // max
74167                   );
74168
74169                   // On Firefox Windows and Linux we always get +/- the scroll line amount (default 3)
74170                   // There doesn't seem to be any scroll accelleration.
74171                   // This multiplier increases the speed a little bit - #5512
74172                   if (detected.os !== 'mac') {
74173                       dY *= 5;
74174                   }
74175
74176                   // recalculate x2,y2,k2
74177                   t0 = _isTransformed ? _transformLast : _transformStart;
74178                   p0 = _getMouseCoords(source);
74179                   p1 = t0.invert(p0);
74180                   k2 = t0.k * Math.pow(2, -dY / 500);
74181                   x2 = p0[0] - p1[0] * k2;
74182                   y2 = p0[1] - p1[1] * k2;
74183
74184               // 2 finger map pinch zooming (Safari) - #5492
74185               // These are fake `wheel` events we made from Safari `gesturechange` events..
74186               } else if (source._scale) {
74187                   // recalculate x2,y2,k2
74188                   t0 = _gestureTransformStart;
74189                   p0 = _getMouseCoords(source);
74190                   p1 = t0.invert(p0);
74191                   k2 = t0.k * source._scale;
74192                   x2 = p0[0] - p1[0] * k2;
74193                   y2 = p0[1] - p1[1] * k2;
74194
74195               // 2 finger map pinch zooming (all browsers except Safari) - #5492
74196               // Pinch zooming via the `wheel` event will always have:
74197               // - `ctrlKey = true`
74198               // - `deltaY` is not round integer pixels (ignore `deltaX`)
74199               } else if (source.ctrlKey && !isInteger(dY)) {
74200                   dY *= 6;   // slightly scale up whatever the browser gave us
74201
74202                   // recalculate x2,y2,k2
74203                   t0 = _isTransformed ? _transformLast : _transformStart;
74204                   p0 = _getMouseCoords(source);
74205                   p1 = t0.invert(p0);
74206                   k2 = t0.k * Math.pow(2, -dY / 500);
74207                   x2 = p0[0] - p1[0] * k2;
74208                   y2 = p0[1] - p1[1] * k2;
74209
74210               // Trackpad scroll zooming with shift or alt/option key down
74211               } else if ((source.altKey || source.shiftKey) && isInteger(dY)) {
74212                   // recalculate x2,y2,k2
74213                   t0 = _isTransformed ? _transformLast : _transformStart;
74214                   p0 = _getMouseCoords(source);
74215                   p1 = t0.invert(p0);
74216                   k2 = t0.k * Math.pow(2, -dY / 500);
74217                   x2 = p0[0] - p1[0] * k2;
74218                   y2 = p0[1] - p1[1] * k2;
74219
74220               // 2 finger map panning (Mac only, all browsers) - #5492, #5512
74221               // Panning via the `wheel` event will always have:
74222               // - `ctrlKey = false`
74223               // - `deltaX`,`deltaY` are round integer pixels
74224               } else if (detected.os === 'mac' && !source.ctrlKey && isInteger(dX) && isInteger(dY)) {
74225                   p1 = projection.translate();
74226                   x2 = p1[0] - dX;
74227                   y2 = p1[1] - dY;
74228                   k2 = projection.scale();
74229               }
74230
74231               // something changed - replace the event transform
74232               if (x2 !== x || y2 !== y || k2 !== k) {
74233                   x = x2;
74234                   y = y2;
74235                   k = k2;
74236                   eventTransform = identity$7.translate(x2, y2).scale(k2);
74237                   _selection.node().__zoom = eventTransform;
74238               }
74239
74240           }
74241
74242           if (geoScaleToZoom(k, TILESIZE) < _minzoom) {
74243               surface.interrupt();
74244               uiFlash().text(t('cannot_zoom'))();
74245               setCenterZoom(map.center(), context.minEditableZoom(), 0, true);
74246               scheduleRedraw();
74247               dispatch$1.call('move', this, map);
74248               return;
74249           }
74250
74251           projection.transform(eventTransform);
74252
74253           var scale = k / _transformStart.k;
74254           var tX = (x / scale - _transformStart.x) * scale;
74255           var tY = (y / scale - _transformStart.y) * scale;
74256
74257           if (context.inIntro()) {
74258               curtainProjection.transform({
74259                   x: x - tX,
74260                   y: y - tY,
74261                   k: k
74262               });
74263           }
74264
74265           if (source) {
74266               _mouseEvent = event$1;
74267           }
74268           _isTransformed = true;
74269           _transformLast = eventTransform;
74270           utilSetTransform(supersurface, tX, tY, scale);
74271           scheduleRedraw();
74272
74273           dispatch$1.call('move', this, map);
74274
74275
74276           function isInteger(val) {
74277               return typeof val === 'number' && isFinite(val) && Math.floor(val) === val;
74278           }
74279       }
74280
74281
74282       function resetTransform() {
74283           if (!_isTransformed) return false;
74284
74285           // deprecation warning - Radial Menu to be removed in iD v3
74286           surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
74287           utilSetTransform(supersurface, 0, 0);
74288           _isTransformed = false;
74289           if (context.inIntro()) {
74290               curtainProjection.transform(projection.transform());
74291           }
74292           return true;
74293       }
74294
74295
74296       function redraw(difference, extent) {
74297           if (surface.empty() || !_redrawEnabled) return;
74298
74299           // If we are in the middle of a zoom/pan, we can't do differenced redraws.
74300           // It would result in artifacts where differenced entities are redrawn with
74301           // one transform and unchanged entities with another.
74302           if (resetTransform()) {
74303               difference = extent = undefined;
74304           }
74305
74306           var zoom = map.zoom();
74307           var z = String(~~zoom);
74308
74309           if (surface.attr('data-zoom') !== z) {
74310               surface.attr('data-zoom', z);
74311           }
74312
74313           // class surface as `lowzoom` around z17-z18.5 (based on latitude)
74314           var lat = map.center()[1];
74315           var lowzoom = linear$2()
74316               .domain([-60, 0, 60])
74317               .range([17, 18.5, 17])
74318               .clamp(true);
74319
74320           surface
74321               .classed('low-zoom', zoom <= lowzoom(lat));
74322
74323
74324           if (!difference) {
74325               supersurface.call(context.background());
74326           }
74327
74328           wrapper
74329               .call(drawLayers);
74330
74331           // OSM
74332           if (map.editable()) {
74333               context.loadTiles(projection);
74334               drawVector(difference, extent);
74335           } else {
74336               editOff();
74337           }
74338
74339           _transformStart = projection.transform();
74340
74341           return map;
74342       }
74343
74344
74345
74346       var immediateRedraw = function(difference, extent) {
74347           if (!difference && !extent) cancelPendingRedraw();
74348           redraw(difference, extent);
74349       };
74350
74351
74352       map.mouse = function() {
74353           var event$1 = _mouseEvent || event;
74354           if (event$1) {
74355               var s;
74356               while ((s = event$1.sourceEvent)) { event$1 = s; }
74357               return _getMouseCoords(event$1);
74358           }
74359           return null;
74360       };
74361
74362
74363       // returns Lng/Lat
74364       map.mouseCoordinates = function() {
74365           var coord = map.mouse() || pxCenter();
74366           return projection.invert(coord);
74367       };
74368
74369
74370       map.dblclickEnable = function(val) {
74371           if (!arguments.length) return _dblClickEnabled;
74372           _dblClickEnabled = val;
74373           return map;
74374       };
74375
74376
74377       map.redrawEnable = function(val) {
74378           if (!arguments.length) return _redrawEnabled;
74379           _redrawEnabled = val;
74380           return map;
74381       };
74382
74383
74384       map.isTransformed = function() {
74385           return _isTransformed;
74386       };
74387
74388
74389       function setTransform(t2, duration, force) {
74390           var t = projection.transform();
74391           if (!force && t2.k === t.k && t2.x === t.x && t2.y === t.y) return false;
74392
74393           if (duration) {
74394               _selection
74395                   .transition()
74396                   .duration(duration)
74397                   .on('start', function() { map.startEase(); })
74398                   .call(zoom.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
74399           } else {
74400               projection.transform(t2);
74401               _transformStart = t2;
74402               _selection.call(zoom.transform, _transformStart);
74403           }
74404
74405           return true;
74406       }
74407
74408
74409       function setCenterZoom(loc2, z2, duration, force) {
74410           var c = map.center();
74411           var z = map.zoom();
74412           if (loc2[0] === c[0] && loc2[1] === c[1] && z2 === z && !force) return false;
74413
74414           var proj = geoRawMercator().transform(projection.transform());  // copy projection
74415
74416           var k2 = clamp(geoZoomToScale(z2, TILESIZE), kMin, kMax);
74417           proj.scale(k2);
74418
74419           var t = proj.translate();
74420           var point = proj(loc2);
74421
74422           var center = pxCenter();
74423           t[0] += center[0] - point[0];
74424           t[1] += center[1] - point[1];
74425
74426           return setTransform(identity$7.translate(t[0], t[1]).scale(k2), duration, force);
74427       }
74428
74429
74430       map.pan = function(delta, duration) {
74431           var t = projection.translate();
74432           var k = projection.scale();
74433
74434           t[0] += delta[0];
74435           t[1] += delta[1];
74436
74437           if (duration) {
74438               _selection
74439                   .transition()
74440                   .duration(duration)
74441                   .on('start', function() { map.startEase(); })
74442                   .call(zoom.transform, identity$7.translate(t[0], t[1]).scale(k));
74443           } else {
74444               projection.translate(t);
74445               _transformStart = projection.transform();
74446               _selection.call(zoom.transform, _transformStart);
74447               dispatch$1.call('move', this, map);
74448               immediateRedraw();
74449           }
74450
74451           return map;
74452       };
74453
74454
74455       map.dimensions = function(val) {
74456           if (!arguments.length) return _dimensions;
74457
74458           _dimensions = val;
74459           drawLayers.dimensions(_dimensions);
74460           context.background().dimensions(_dimensions);
74461           projection.clipExtent([[0, 0], _dimensions]);
74462           _getMouseCoords = utilFastMouse(supersurface.node());
74463
74464           scheduleRedraw();
74465           return map;
74466       };
74467
74468
74469       function zoomIn(delta) {
74470           setCenterZoom(map.center(), ~~map.zoom() + delta, 250, true);
74471       }
74472
74473       function zoomOut(delta) {
74474           setCenterZoom(map.center(), ~~map.zoom() - delta, 250, true);
74475       }
74476
74477       map.zoomIn = function() { zoomIn(1); };
74478       map.zoomInFurther = function() { zoomIn(4); };
74479
74480       map.zoomOut = function() { zoomOut(1); };
74481       map.zoomOutFurther = function() { zoomOut(4); };
74482
74483
74484       map.center = function(loc2) {
74485           if (!arguments.length) {
74486               return projection.invert(pxCenter());
74487           }
74488
74489           if (setCenterZoom(loc2, map.zoom())) {
74490               dispatch$1.call('move', this, map);
74491           }
74492
74493           scheduleRedraw();
74494           return map;
74495       };
74496
74497
74498       map.zoom = function(z2) {
74499           if (!arguments.length) {
74500               return Math.max(geoScaleToZoom(projection.scale(), TILESIZE), 0);
74501           }
74502
74503           if (z2 < _minzoom) {
74504               surface.interrupt();
74505               uiFlash().text(t('cannot_zoom'))();
74506               z2 = context.minEditableZoom();
74507           }
74508
74509           if (setCenterZoom(map.center(), z2)) {
74510               dispatch$1.call('move', this, map);
74511           }
74512
74513           scheduleRedraw();
74514           return map;
74515       };
74516
74517
74518       map.centerZoom = function(loc2, z2) {
74519           if (setCenterZoom(loc2, z2)) {
74520               dispatch$1.call('move', this, map);
74521           }
74522
74523           scheduleRedraw();
74524           return map;
74525       };
74526
74527
74528       map.zoomTo = function(entity) {
74529           var extent = entity.extent(context.graph());
74530           if (!isFinite(extent.area())) return map;
74531
74532           var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
74533           return map.centerZoom(extent.center(), z2);
74534       };
74535
74536
74537       map.centerEase = function(loc2, duration) {
74538           duration = duration || 250;
74539           setCenterZoom(loc2, map.zoom(), duration);
74540           return map;
74541       };
74542
74543
74544       map.zoomEase = function(z2, duration) {
74545           duration = duration || 250;
74546           setCenterZoom(map.center(), z2, duration, false);
74547           return map;
74548       };
74549
74550
74551       map.centerZoomEase = function(loc2, z2, duration) {
74552           duration = duration || 250;
74553           setCenterZoom(loc2, z2, duration, false);
74554           return map;
74555       };
74556
74557
74558       map.transformEase = function(t2, duration) {
74559           duration = duration || 250;
74560           setTransform(t2, duration, false);
74561           return map;
74562       };
74563
74564
74565       map.zoomToEase = function(entity, duration) {
74566           var extent = entity.extent(context.graph());
74567           if (!isFinite(extent.area())) return map;
74568
74569           var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
74570           return map.centerZoomEase(extent.center(), z2, duration);
74571       };
74572
74573
74574       map.startEase = function() {
74575           utilBindOnce(surface, 'mousedown.ease', function() {
74576               map.cancelEase();
74577           });
74578           return map;
74579       };
74580
74581
74582       map.cancelEase = function() {
74583           _selection.interrupt();
74584           return map;
74585       };
74586
74587
74588       map.extent = function(val) {
74589           if (!arguments.length) {
74590               return new geoExtent(
74591                   projection.invert([0, _dimensions[1]]),
74592                   projection.invert([_dimensions[0], 0])
74593               );
74594           } else {
74595               var extent = geoExtent(val);
74596               map.centerZoom(extent.center(), map.extentZoom(extent));
74597           }
74598       };
74599
74600
74601       map.trimmedExtent = function(val) {
74602           if (!arguments.length) {
74603               var headerY = 60;
74604               var footerY = 30;
74605               var pad = 10;
74606               return new geoExtent(
74607                   projection.invert([pad, _dimensions[1] - footerY - pad]),
74608                   projection.invert([_dimensions[0] - pad, headerY + pad])
74609               );
74610           } else {
74611               var extent = geoExtent(val);
74612               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
74613           }
74614       };
74615
74616
74617       function calcExtentZoom(extent, dim) {
74618           var tl = projection([extent[0][0], extent[1][1]]);
74619           var br = projection([extent[1][0], extent[0][1]]);
74620
74621           // Calculate maximum zoom that fits extent
74622           var hFactor = (br[0] - tl[0]) / dim[0];
74623           var vFactor = (br[1] - tl[1]) / dim[1];
74624           var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
74625           var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
74626           var newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
74627
74628           return newZoom;
74629       }
74630
74631
74632       map.extentZoom = function(val) {
74633           return calcExtentZoom(geoExtent(val), _dimensions);
74634       };
74635
74636
74637       map.trimmedExtentZoom = function(val) {
74638           var trimY = 120;
74639           var trimX = 40;
74640           var trimmed = [_dimensions[0] - trimX, _dimensions[1] - trimY];
74641           return calcExtentZoom(geoExtent(val), trimmed);
74642       };
74643
74644
74645       map.editable = function() {
74646           var osmLayer = surface.selectAll('.data-layer.osm');
74647           if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
74648
74649           return map.zoom() >= context.minEditableZoom();
74650       };
74651
74652
74653       map.notesEditable = function() {
74654           var noteLayer = surface.selectAll('.data-layer.notes');
74655           if (!noteLayer.empty() && noteLayer.classed('disabled')) return false;
74656
74657           return map.zoom() >= context.minEditableZoom();
74658       };
74659
74660
74661       map.minzoom = function(val) {
74662           if (!arguments.length) return _minzoom;
74663           _minzoom = val;
74664           return map;
74665       };
74666
74667
74668       map.layers = drawLayers;
74669
74670
74671       return utilRebind(map, dispatch$1, 'on');
74672   }
74673
74674   function uiMapInMap(context) {
74675
74676       function map_in_map(selection) {
74677           var backgroundLayer = rendererTileLayer(context);
74678           var overlayLayers = {};
74679           var projection = geoRawMercator();
74680           var dataLayer = svgData(projection, context).showLabels(false);
74681           var debugLayer = svgDebug(projection, context);
74682           var zoom = d3_zoom()
74683               .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
74684               .on('start', zoomStarted)
74685               .on('zoom', zoomed)
74686               .on('end', zoomEnded);
74687           var isTransformed = false;
74688           var isHidden = true;
74689           var skipEvents = false;
74690           var gesture = null;
74691           var zDiff = 6;    // by default, minimap renders at (main zoom - 6)
74692           var wrap = select(null);
74693           var tiles = select(null);
74694           var viewport = select(null);
74695           var tStart;    // transform at start of gesture
74696           var tCurr;     // transform at most recent event
74697           var timeoutId;
74698
74699
74700           function zoomStarted() {
74701               if (skipEvents) return;
74702               tStart = tCurr = projection.transform();
74703               gesture = null;
74704           }
74705
74706
74707           function zoomed() {
74708               if (skipEvents) return;
74709
74710               var x = event.transform.x;
74711               var y = event.transform.y;
74712               var k = event.transform.k;
74713               var isZooming = (k !== tStart.k);
74714               var isPanning = (x !== tStart.x || y !== tStart.y);
74715
74716               if (!isZooming && !isPanning) {
74717                   return;  // no change
74718               }
74719
74720               // lock in either zooming or panning, don't allow both in minimap.
74721               if (!gesture) {
74722                   gesture = isZooming ? 'zoom' : 'pan';
74723               }
74724
74725               var tMini = projection.transform();
74726               var tX, tY, scale;
74727
74728               if (gesture === 'zoom') {
74729                   var dMini = utilGetDimensions(wrap);
74730                   var cMini = geoVecScale(dMini, 0.5);
74731                   scale = k / tMini.k;
74732                   tX = (cMini[0] / scale - cMini[0]) * scale;
74733                   tY = (cMini[1] / scale - cMini[1]) * scale;
74734               } else {
74735                   k = tMini.k;
74736                   scale = 1;
74737                   tX = x - tMini.x;
74738                   tY = y - tMini.y;
74739               }
74740
74741               utilSetTransform(tiles, tX, tY, scale);
74742               utilSetTransform(viewport, 0, 0, scale);
74743               isTransformed = true;
74744               tCurr = identity$7.translate(x, y).scale(k);
74745
74746               var zMain = geoScaleToZoom(context.projection.scale());
74747               var zMini = geoScaleToZoom(k);
74748
74749               zDiff = zMain - zMini;
74750
74751               queueRedraw();
74752           }
74753
74754
74755           function zoomEnded() {
74756               if (skipEvents) return;
74757               if (gesture !== 'pan') return;
74758
74759               updateProjection();
74760               gesture = null;
74761               var dMini = utilGetDimensions(wrap);
74762               var cMini = geoVecScale(dMini, 0.5);
74763               context.map().center(projection.invert(cMini));   // recenter main map..
74764           }
74765
74766
74767           function updateProjection() {
74768               var loc = context.map().center();
74769               var dMini = utilGetDimensions(wrap);
74770               var cMini = geoVecScale(dMini, 0.5);
74771               var tMain = context.projection.transform();
74772               var zMain = geoScaleToZoom(tMain.k);
74773               var zMini = Math.max(zMain - zDiff, 0.5);
74774               var kMini = geoZoomToScale(zMini);
74775
74776               projection
74777                   .translate([tMain.x, tMain.y])
74778                   .scale(kMini);
74779
74780               var point = projection(loc);
74781               var mouse = (gesture === 'pan') ? geoVecSubtract([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0];
74782               var xMini = cMini[0] - point[0] + tMain.x + mouse[0];
74783               var yMini = cMini[1] - point[1] + tMain.y + mouse[1];
74784
74785               projection
74786                   .translate([xMini, yMini])
74787                   .clipExtent([[0, 0], dMini]);
74788
74789               tCurr = projection.transform();
74790
74791               if (isTransformed) {
74792                   utilSetTransform(tiles, 0, 0);
74793                   utilSetTransform(viewport, 0, 0);
74794                   isTransformed = false;
74795               }
74796
74797               zoom
74798                   .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
74799
74800               skipEvents = true;
74801               wrap.call(zoom.transform, tCurr);
74802               skipEvents = false;
74803           }
74804
74805
74806           function redraw() {
74807               clearTimeout(timeoutId);
74808               if (isHidden) return;
74809
74810               updateProjection();
74811
74812               var dMini = utilGetDimensions(wrap);
74813               var zMini = geoScaleToZoom(projection.scale());
74814
74815               // setup tile container
74816               tiles = wrap
74817                   .selectAll('.map-in-map-tiles')
74818                   .data([0]);
74819
74820               tiles = tiles.enter()
74821                   .append('div')
74822                   .attr('class', 'map-in-map-tiles')
74823                   .merge(tiles);
74824
74825               // redraw background
74826               backgroundLayer
74827                   .source(context.background().baseLayerSource())
74828                   .projection(projection)
74829                   .dimensions(dMini);
74830
74831               var background = tiles
74832                   .selectAll('.map-in-map-background')
74833                   .data([0]);
74834
74835               background.enter()
74836                   .append('div')
74837                   .attr('class', 'map-in-map-background')
74838                   .merge(background)
74839                   .call(backgroundLayer);
74840
74841
74842               // redraw overlay
74843               var overlaySources = context.background().overlayLayerSources();
74844               var activeOverlayLayers = [];
74845               for (var i = 0; i < overlaySources.length; i++) {
74846                   if (overlaySources[i].validZoom(zMini)) {
74847                       if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
74848                       activeOverlayLayers.push(overlayLayers[i]
74849                           .source(overlaySources[i])
74850                           .projection(projection)
74851                           .dimensions(dMini));
74852                   }
74853               }
74854
74855               var overlay = tiles
74856                   .selectAll('.map-in-map-overlay')
74857                   .data([0]);
74858
74859               overlay = overlay.enter()
74860                   .append('div')
74861                   .attr('class', 'map-in-map-overlay')
74862                   .merge(overlay);
74863
74864
74865               var overlays = overlay
74866                   .selectAll('div')
74867                   .data(activeOverlayLayers, function(d) { return d.source().name(); });
74868
74869               overlays.exit()
74870                   .remove();
74871
74872               overlays = overlays.enter()
74873                   .append('div')
74874                   .merge(overlays)
74875                   .each(function(layer) { select(this).call(layer); });
74876
74877
74878               var dataLayers = tiles
74879                   .selectAll('.map-in-map-data')
74880                   .data([0]);
74881
74882               dataLayers.exit()
74883                   .remove();
74884
74885               dataLayers = dataLayers.enter()
74886                   .append('svg')
74887                   .attr('class', 'map-in-map-data')
74888                   .merge(dataLayers)
74889                   .call(dataLayer)
74890                   .call(debugLayer);
74891
74892
74893               // redraw viewport bounding box
74894               if (gesture !== 'pan') {
74895                   var getPath = d3_geoPath(projection);
74896                   var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
74897
74898                   viewport = wrap.selectAll('.map-in-map-viewport')
74899                       .data([0]);
74900
74901                   viewport = viewport.enter()
74902                       .append('svg')
74903                       .attr('class', 'map-in-map-viewport')
74904                       .merge(viewport);
74905
74906
74907                   var path = viewport.selectAll('.map-in-map-bbox')
74908                       .data([bbox]);
74909
74910                   path.enter()
74911                       .append('path')
74912                       .attr('class', 'map-in-map-bbox')
74913                       .merge(path)
74914                       .attr('d', getPath)
74915                       .classed('thick', function(d) { return getPath.area(d) < 30; });
74916               }
74917           }
74918
74919
74920           function queueRedraw() {
74921               clearTimeout(timeoutId);
74922               timeoutId = setTimeout(function() { redraw(); }, 750);
74923           }
74924
74925
74926           function toggle() {
74927               if (event) event.preventDefault();
74928
74929               isHidden = !isHidden;
74930
74931               select('.minimap-toggle-item')
74932                   .classed('active', !isHidden)
74933                   .select('input')
74934                   .property('checked', !isHidden);
74935
74936               if (isHidden) {
74937                   wrap
74938                       .style('display', 'block')
74939                       .style('opacity', '1')
74940                       .transition()
74941                       .duration(200)
74942                       .style('opacity', '0')
74943                       .on('end', function() {
74944                           selection.selectAll('.map-in-map')
74945                               .style('display', 'none');
74946                       });
74947               } else {
74948                   wrap
74949                       .style('display', 'block')
74950                       .style('opacity', '0')
74951                       .transition()
74952                       .duration(200)
74953                       .style('opacity', '1')
74954                       .on('end', function() {
74955                           redraw();
74956                       });
74957               }
74958           }
74959
74960
74961           uiMapInMap.toggle = toggle;
74962
74963           wrap = selection.selectAll('.map-in-map')
74964               .data([0]);
74965
74966           wrap = wrap.enter()
74967               .append('div')
74968               .attr('class', 'map-in-map')
74969               .style('display', (isHidden ? 'none' : 'block'))
74970               .call(zoom)
74971               .on('dblclick.zoom', null)
74972               .merge(wrap);
74973
74974           context.map()
74975               .on('drawn.map-in-map', function(drawn) {
74976                   if (drawn.full === true) {
74977                       redraw();
74978                   }
74979               });
74980
74981           redraw();
74982
74983           context.keybinding()
74984               .on(t('background.minimap.key'), toggle);
74985       }
74986
74987       return map_in_map;
74988   }
74989
74990   function uiSettingsCustomBackground(context) {
74991       var dispatch$1 = dispatch('change');
74992
74993       function render(selection) {
74994           var _origSettings = {
74995               template: context.storage('background-custom-template')
74996           };
74997           var _currSettings = cloneDeep(_origSettings);
74998           var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
74999           var modal = uiConfirm(selection).okButton();
75000
75001           modal
75002               .classed('settings-modal settings-custom-background', true);
75003
75004           modal.select('.modal-section.header')
75005               .append('h3')
75006               .text(t('settings.custom_background.header'));
75007
75008
75009           var textSection = modal.select('.modal-section.message-text');
75010
75011           textSection
75012               .append('pre')
75013               .attr('class', 'instructions-template')
75014               .text(t('settings.custom_background.instructions', { example: example }));
75015
75016           textSection
75017               .append('textarea')
75018               .attr('class', 'field-template')
75019               .attr('placeholder', t('settings.custom_background.template.placeholder'))
75020               .call(utilNoAuto)
75021               .property('value', _currSettings.template);
75022
75023
75024           // insert a cancel button
75025           var buttonSection = modal.select('.modal-section.buttons');
75026
75027           buttonSection
75028               .insert('button', '.ok-button')
75029               .attr('class', 'button cancel-button secondary-action')
75030               .text(t('confirm.cancel'));
75031
75032
75033           buttonSection.select('.cancel-button')
75034               .on('click.cancel', clickCancel);
75035
75036           buttonSection.select('.ok-button')
75037               .attr('disabled', isSaveDisabled)
75038               .on('click.save', clickSave);
75039
75040
75041           function isSaveDisabled() {
75042               return null;
75043           }
75044
75045
75046           // restore the original template
75047           function clickCancel() {
75048               textSection.select('.field-template').property('value', _origSettings.template);
75049               context.storage('background-custom-template', _origSettings.template);
75050               this.blur();
75051               modal.close();
75052           }
75053
75054           // accept the current template
75055           function clickSave() {
75056               _currSettings.template = textSection.select('.field-template').property('value');
75057               context.storage('background-custom-template', _currSettings.template);
75058               this.blur();
75059               modal.close();
75060               dispatch$1.call('change', this, _currSettings);
75061           }
75062       }
75063
75064       return utilRebind(render, dispatch$1, 'on');
75065   }
75066
75067   function uiBackground(context) {
75068       var key = t('background.key');
75069
75070       var _pane = select(null), _toggleButton = select(null);
75071
75072       var _customSource = context.background().findSource('custom');
75073       var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
75074       var _shown = false;
75075
75076       var _backgroundList = select(null);
75077       var _overlayList = select(null);
75078       var _displayOptionsContainer = select(null);
75079       var _offsetContainer = select(null);
75080
75081       var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
75082       var backgroundOffset = uiBackgroundOffset(context);
75083
75084       var settingsCustomBackground = uiSettingsCustomBackground(context)
75085           .on('change', customChanged);
75086
75087
75088       function setTooltips(selection) {
75089           selection.each(function(d, i, nodes) {
75090               var item = select(this).select('label');
75091               var span = item.select('span');
75092               var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
75093               var description = d.description();
75094               var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
75095
75096               item.call(tooltip().destroyAny);
75097
75098               if (d === _previousBackground) {
75099                   item.call(tooltip()
75100                       .placement(placement)
75101                       .html(true)
75102                       .title(function() {
75103                           var tip = '<div>' + t('background.switch') + '</div>';
75104                           return uiTooltipHtml(tip, uiCmd('⌘' + key));
75105                       })
75106                   );
75107               } else if (description || isOverflowing) {
75108                   item.call(tooltip()
75109                       .placement(placement)
75110                       .title(description || d.name())
75111                   );
75112               }
75113           });
75114       }
75115
75116
75117       function updateLayerSelections(selection) {
75118           function active(d) {
75119               return context.background().showsLayer(d);
75120           }
75121
75122           selection.selectAll('li')
75123               .classed('active', active)
75124               .classed('switch', function(d) { return d === _previousBackground; })
75125               .call(setTooltips)
75126               .selectAll('input')
75127               .property('checked', active);
75128       }
75129
75130
75131       function chooseBackground(d) {
75132           if (d.id === 'custom' && !d.template()) {
75133               return editCustom();
75134           }
75135
75136           event.preventDefault();
75137           _previousBackground = context.background().baseLayerSource();
75138           context.storage('background-last-used-toggle', _previousBackground.id);
75139           context.storage('background-last-used', d.id);
75140           context.background().baseLayerSource(d);
75141           _backgroundList.call(updateLayerSelections);
75142           document.activeElement.blur();
75143       }
75144
75145
75146       function customChanged(d) {
75147           if (d && d.template) {
75148               _customSource.template(d.template);
75149               chooseBackground(_customSource);
75150           } else {
75151               _customSource.template('');
75152               chooseBackground(context.background().findSource('none'));
75153           }
75154       }
75155
75156
75157       function editCustom() {
75158           event.preventDefault();
75159           context.container()
75160               .call(settingsCustomBackground);
75161       }
75162
75163
75164       function chooseOverlay(d) {
75165           event.preventDefault();
75166           context.background().toggleOverlayLayer(d);
75167           _overlayList.call(updateLayerSelections);
75168           document.activeElement.blur();
75169       }
75170
75171
75172       function drawListItems(layerList, type, change, filter) {
75173           var sources = context.background()
75174               .sources(context.map().extent())
75175               .filter(filter);
75176
75177           var layerLinks = layerList.selectAll('li')
75178               .data(sources, function(d) { return d.name(); });
75179
75180           layerLinks.exit()
75181               .remove();
75182
75183           var enter = layerLinks.enter()
75184               .append('li')
75185               .classed('layer-custom', function(d) { return d.id === 'custom'; })
75186               .classed('best', function(d) { return d.best(); });
75187
75188           enter.filter(function(d) { return d.id === 'custom'; })
75189               .append('button')
75190               .attr('class', 'layer-browse')
75191               .call(tooltip()
75192                   .title(t('settings.custom_background.tooltip'))
75193                   .placement((textDirection === 'rtl') ? 'right' : 'left')
75194               )
75195               .on('click', editCustom)
75196               .call(svgIcon('#iD-icon-more'));
75197
75198           enter.filter(function(d) { return d.best(); })
75199               .append('div')
75200               .attr('class', 'best')
75201               .call(tooltip()
75202                   .title(t('background.best_imagery'))
75203                   .placement((textDirection === 'rtl') ? 'right' : 'left')
75204               )
75205               .append('span')
75206               .html('&#9733;');
75207
75208           var label = enter
75209               .append('label');
75210
75211           label
75212               .append('input')
75213               .attr('type', type)
75214               .attr('name', 'layers')
75215               .on('change', change);
75216
75217           label
75218               .append('span')
75219               .text(function(d) { return d.name(); });
75220
75221
75222           layerList.selectAll('li')
75223               .sort(sortSources)
75224               .style('display', layerList.selectAll('li').data().length > 0 ? 'block' : 'none');
75225
75226           layerList
75227               .call(updateLayerSelections);
75228
75229
75230           function sortSources(a, b) {
75231               return a.best() && !b.best() ? -1
75232                   : b.best() && !a.best() ? 1
75233                   : d3_descending(a.area(), b.area()) || ascending(a.name(), b.name()) || 0;
75234           }
75235       }
75236
75237
75238       function renderBackgroundList(selection) {
75239
75240           // the background list
75241           var container = selection.selectAll('.layer-background-list')
75242               .data([0]);
75243
75244           _backgroundList = container.enter()
75245               .append('ul')
75246               .attr('class', 'layer-list layer-background-list')
75247               .attr('dir', 'auto')
75248               .merge(container);
75249
75250
75251           // add minimap toggle below list
75252           var minimapEnter = selection.selectAll('.minimap-toggle-list')
75253               .data([0])
75254               .enter()
75255               .append('ul')
75256               .attr('class', 'layer-list minimap-toggle-list')
75257               .append('li')
75258               .attr('class', 'minimap-toggle-item');
75259
75260           var minimapLabelEnter = minimapEnter
75261               .append('label')
75262               .call(tooltip()
75263                   .html(true)
75264                   .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
75265                   .placement('top')
75266               );
75267
75268           minimapLabelEnter
75269               .append('input')
75270               .attr('type', 'checkbox')
75271               .on('change', function() {
75272                   event.preventDefault();
75273                   uiMapInMap.toggle();
75274               });
75275
75276           minimapLabelEnter
75277               .append('span')
75278               .text(t('background.minimap.description'));
75279
75280
75281           // "Info / Report a Problem" link
75282           selection.selectAll('.imagery-faq')
75283               .data([0])
75284               .enter()
75285               .append('div')
75286               .attr('class', 'imagery-faq')
75287               .append('a')
75288               .attr('target', '_blank')
75289               .attr('tabindex', -1)
75290               .call(svgIcon('#iD-icon-out-link', 'inline'))
75291               .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
75292               .append('span')
75293               .text(t('background.imagery_source_faq'));
75294
75295           updateBackgroundList();
75296       }
75297
75298
75299       function renderOverlayList(selection) {
75300           var container = selection.selectAll('.layer-overlay-list')
75301               .data([0]);
75302
75303           _overlayList = container.enter()
75304               .append('ul')
75305               .attr('class', 'layer-list layer-overlay-list')
75306               .attr('dir', 'auto')
75307               .merge(container);
75308
75309           updateOverlayList();
75310       }
75311
75312       function updateBackgroundList() {
75313           _backgroundList
75314               .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
75315       }
75316
75317       function updateOverlayList() {
75318           _overlayList
75319               .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
75320       }
75321
75322
75323       function update() {
75324
75325           if (!_pane.select('.disclosure-wrap-background_list').classed('hide')) {
75326               updateBackgroundList();
75327           }
75328
75329           if (!_pane.select('.disclosure-wrap-overlay_list').classed('hide')) {
75330               updateOverlayList();
75331           }
75332
75333           _displayOptionsContainer
75334               .call(backgroundDisplayOptions);
75335
75336           _offsetContainer
75337               .call(backgroundOffset);
75338       }
75339
75340
75341       function quickSwitch() {
75342           if (event) {
75343               event.stopImmediatePropagation();
75344               event.preventDefault();
75345           }
75346           if (_previousBackground) {
75347               chooseBackground(_previousBackground);
75348           }
75349       }
75350
75351       var paneTooltip = tooltip()
75352           .placement((textDirection === 'rtl') ? 'right' : 'left')
75353           .html(true)
75354           .title(uiTooltipHtml(t('background.description'), key));
75355
75356       uiBackground.togglePane = function() {
75357           if (event) event.preventDefault();
75358           paneTooltip.hide(_toggleButton);
75359           uiBackground.setVisible(!_toggleButton.classed('active'));
75360       };
75361
75362       uiBackground.hidePane = function() {
75363           uiBackground.setVisible(false);
75364       };
75365
75366       uiBackground.setVisible = function(show) {
75367           if (show !== _shown) {
75368               _toggleButton.classed('active', show);
75369               _shown = show;
75370
75371               if (show) {
75372                   uiHelp.hidePane();
75373                   uiIssues.hidePane();
75374                   uiMapData.hidePane();
75375                   update();
75376
75377                   _pane
75378                       .style('display', 'block')
75379                       .style('right', '-300px')
75380                       .transition()
75381                       .duration(200)
75382                       .style('right', '0px');
75383
75384               } else {
75385                   _pane
75386                       .style('display', 'block')
75387                       .style('right', '0px')
75388                       .transition()
75389                       .duration(200)
75390                       .style('right', '-300px')
75391                       .on('end', function() {
75392                           select(this).style('display', 'none');
75393                       });
75394               }
75395           }
75396       };
75397
75398       uiBackground.renderToggleButton = function(selection) {
75399
75400           _toggleButton = selection
75401               .append('button')
75402               .attr('tabindex', -1)
75403               .on('click', uiBackground.togglePane)
75404               .call(svgIcon('#iD-icon-layers', 'light'))
75405               .call(paneTooltip);
75406       };
75407
75408       uiBackground.renderPane = function(selection) {
75409
75410           _pane = selection
75411               .append('div')
75412               .attr('class', 'fillL map-pane background-pane hide');
75413
75414
75415           var heading = _pane
75416               .append('div')
75417               .attr('class', 'pane-heading');
75418
75419           heading
75420               .append('h2')
75421               .text(t('background.title'));
75422
75423           heading
75424               .append('button')
75425               .on('click', uiBackground.hidePane)
75426               .call(svgIcon('#iD-icon-close'));
75427
75428
75429           var content = _pane
75430               .append('div')
75431               .attr('class', 'pane-content');
75432
75433           // background list
75434           content
75435               .append('div')
75436               .attr('class', 'background-background-list-container')
75437               .call(uiDisclosure(context, 'background_list', true)
75438                   .title(t('background.backgrounds'))
75439                   .content(renderBackgroundList)
75440               );
75441
75442           // overlay list
75443           content
75444               .append('div')
75445               .attr('class', 'background-overlay-list-container')
75446               .call(uiDisclosure(context, 'overlay_list', true)
75447                   .title(t('background.overlays'))
75448                   .content(renderOverlayList)
75449               );
75450
75451           // display options
75452           _displayOptionsContainer = content
75453               .append('div')
75454               .attr('class', 'background-display-options');
75455
75456           // offset controls
75457           _offsetContainer = content
75458               .append('div')
75459               .attr('class', 'background-offset');
75460
75461
75462           // add listeners
75463           context.map()
75464               .on('move.background-update', debounce(utilCallWhenIdle(update), 1000));
75465
75466           context.background()
75467               .on('change.background-update', update);
75468
75469
75470           update();
75471
75472           context.keybinding()
75473               .on(key, uiBackground.togglePane)
75474               .on(uiCmd('⌘' + key), quickSwitch);
75475       };
75476
75477       return uiBackground;
75478   }
75479
75480   function uiContributors(context) {
75481       var osm = context.connection(),
75482           debouncedUpdate = debounce(function() { update(); }, 1000),
75483           limit = 4,
75484           hidden = false,
75485           wrap = select(null);
75486
75487
75488       function update() {
75489           if (!osm) return;
75490
75491           var users = {},
75492               entities = context.intersects(context.map().extent());
75493
75494           entities.forEach(function(entity) {
75495               if (entity && entity.user) users[entity.user] = true;
75496           });
75497
75498           var u = Object.keys(users),
75499               subset = u.slice(0, u.length > limit ? limit - 1 : limit);
75500
75501           wrap.html('')
75502               .call(svgIcon('#iD-icon-nearby', 'pre-text light'));
75503
75504           var userList = select(document.createElement('span'));
75505
75506           userList.selectAll()
75507               .data(subset)
75508               .enter()
75509               .append('a')
75510               .attr('class', 'user-link')
75511               .attr('href', function(d) { return osm.userURL(d); })
75512               .attr('target', '_blank')
75513               .attr('tabindex', -1)
75514               .text(String);
75515
75516           if (u.length > limit) {
75517               var count = select(document.createElement('span'));
75518
75519               count.append('a')
75520                   .attr('target', '_blank')
75521                   .attr('tabindex', -1)
75522                   .attr('href', function() {
75523                       return osm.changesetsURL(context.map().center(), context.map().zoom());
75524                   })
75525                   .text(u.length - limit + 1);
75526
75527               wrap.append('span')
75528                   .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
75529
75530           } else {
75531               wrap.append('span')
75532                   .html(t('contributors.list', { users: userList.html() }));
75533           }
75534
75535           if (!u.length) {
75536               hidden = true;
75537               wrap
75538                   .transition()
75539                   .style('opacity', 0);
75540
75541           } else if (hidden) {
75542               wrap
75543                   .transition()
75544                   .style('opacity', 1);
75545           }
75546       }
75547
75548
75549       return function(selection) {
75550           if (!osm) return;
75551           wrap = selection;
75552           update();
75553
75554           osm.on('loaded.contributors', debouncedUpdate);
75555           context.map().on('move.contributors', debouncedUpdate);
75556       };
75557   }
75558
75559   function uiFeatureInfo(context) {
75560       function update(selection) {
75561           var features = context.features(),
75562               stats = features.stats(),
75563               count = 0,
75564               hiddenList = compact(map$3(features.hidden(), function(k) {
75565                   if (stats[k]) {
75566                       count += stats[k];
75567                       return String(stats[k]) + ' ' + t('feature.' + k + '.description');
75568                   }
75569               }));
75570
75571           selection.html('');
75572
75573           if (hiddenList.length) {
75574               var tooltipBehavior = tooltip()
75575                   .placement('top')
75576                   .html(true)
75577                   .title(function() {
75578                       return uiTooltipHtml(hiddenList.join('<br/>'));
75579                   });
75580
75581               var warning = selection.append('a')
75582                   .attr('href', '#')
75583                   .attr('tabindex', -1)
75584                   .html(t('feature_info.hidden_warning', { count: count }))
75585                   .call(tooltipBehavior)
75586                   .on('click', function() {
75587                       tooltipBehavior.hide(warning);
75588                       // open map data panel?
75589                       event.preventDefault();
75590                   });
75591           }
75592
75593           selection
75594               .classed('hide', !hiddenList.length);
75595       }
75596
75597
75598       return function(selection) {
75599           update(selection);
75600
75601           context.features().on('change.feature_info', function() {
75602               update(selection);
75603           });
75604       };
75605   }
75606
75607   function uiFullScreen(context) {
75608       var element = context.container().node();
75609       // var button = d3_select(null);
75610
75611
75612       function getFullScreenFn() {
75613           if (element.requestFullscreen) {
75614               return element.requestFullscreen;
75615           } else if (element.msRequestFullscreen) {
75616               return element.msRequestFullscreen;
75617           } else if (element.mozRequestFullScreen) {
75618               return element.mozRequestFullScreen;
75619           } else if (element.webkitRequestFullscreen) {
75620               return element.webkitRequestFullscreen;
75621           }
75622       }
75623
75624
75625       function getExitFullScreenFn() {
75626           if (document.exitFullscreen) {
75627               return document.exitFullscreen;
75628           } else if (document.msExitFullscreen) {
75629               return document.msExitFullscreen;
75630           } else if (document.mozCancelFullScreen) {
75631               return document.mozCancelFullScreen;
75632           } else if (document.webkitExitFullscreen) {
75633               return document.webkitExitFullscreen;
75634           }
75635       }
75636
75637
75638       function isFullScreen() {
75639           return document.fullscreenElement ||
75640               document.mozFullScreenElement ||
75641               document.webkitFullscreenElement ||
75642               document.msFullscreenElement;
75643       }
75644
75645
75646       function isSupported() {
75647           return !!getFullScreenFn();
75648       }
75649
75650
75651       function fullScreen() {
75652           event.preventDefault();
75653           if (!isFullScreen()) {
75654               // button.classed('active', true);
75655               getFullScreenFn().apply(element);
75656           } else {
75657               // button.classed('active', false);
75658               getExitFullScreenFn().apply(document);
75659           }
75660       }
75661
75662
75663       return function() { // selection) {
75664           if (!isSupported()) return;
75665
75666           // button = selection.append('button')
75667           //     .attr('title', t('full_screen'))
75668           //     .attr('tabindex', -1)
75669           //     .on('click', fullScreen)
75670           //     .call(tooltip);
75671
75672           // button.append('span')
75673           //     .attr('class', 'icon full-screen');
75674
75675           var detected = utilDetect();
75676           var keys = (detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11']);
75677           context.keybinding().on(keys, fullScreen);
75678       };
75679   }
75680
75681   function uiLoading(context) {
75682       var _modalSelection = select(null);
75683       var _message = '';
75684       var _blocking = false;
75685
75686
75687       var loading = function(selection) {
75688           _modalSelection = uiModal(selection, _blocking);
75689
75690           var loadertext = _modalSelection.select('.content')
75691               .classed('loading-modal', true)
75692               .append('div')
75693               .attr('class', 'modal-section fillL');
75694
75695           loadertext
75696               .append('img')
75697               .attr('class', 'loader')
75698               .attr('src', context.imagePath('loader-white.gif'));
75699
75700           loadertext
75701               .append('h3')
75702               .text(_message);
75703
75704           _modalSelection.select('button.close')
75705               .attr('class', 'hide');
75706
75707           return loading;
75708       };
75709
75710
75711       loading.message = function(_) {
75712           if (!arguments.length) return _message;
75713           _message = _;
75714           return loading;
75715       };
75716
75717
75718       loading.blocking = function(_) {
75719           if (!arguments.length) return _blocking;
75720           _blocking = _;
75721           return loading;
75722       };
75723
75724
75725       loading.close = function() {
75726           _modalSelection.remove();
75727       };
75728
75729
75730       return loading;
75731   }
75732
75733   function uiGeolocate(context) {
75734       var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ };
75735       var locating = uiLoading(context).message(t('geolocate.locating')).blocking(true);
75736       var layer = context.layers().layer('geolocate');
75737       var _position;
75738       var _extent;
75739       var _timeoutID;
75740
75741
75742       function click() {
75743           if (context.inIntro()) return;
75744           context.enter(modeBrowse(context));
75745           if (!layer.enabled()) {
75746               if (!_position) {
75747                   context.container().call(locating);
75748                   navigator.geolocation.getCurrentPosition(success, error, geoOptions);
75749               } else {
75750                   zoomTo();
75751               }
75752           } else {
75753               layer.enabled(null, false);
75754           }
75755           // This timeout ensures that we still call finish() even if
75756           // the user declines to share their location in Firefox
75757           _timeoutID = setTimeout(finish, 10000 /* 10sec */ );
75758       }
75759
75760       function zoomTo() {
75761           var map = context.map();
75762           layer.enabled(_position, true);
75763           map.centerZoomEase(_extent.center(), Math.min(20, map.extentZoom(_extent)));
75764       }
75765
75766
75767       function success(geolocation) {
75768           _position = geolocation;
75769           var coords = _position.coords;
75770           _extent = geoExtent([coords.longitude, coords.latitude]).padByMeters(coords.accuracy);
75771           zoomTo();
75772           finish();
75773       }
75774
75775
75776       function error() {
75777           finish();
75778       }
75779
75780
75781       function finish() {
75782           locating.close();  // unblock ui
75783           if (_timeoutID) { clearTimeout(_timeoutID); }
75784           _timeoutID = undefined;
75785       }
75786
75787
75788       return function(selection) {
75789           if (!navigator.geolocation) return;
75790
75791           selection
75792               .append('button')
75793               .attr('tabindex', -1)
75794               .attr('title', t('geolocate.title'))
75795               .on('click', click)
75796               .call(svgIcon('#iD-icon-geolocate', 'light'))
75797               .call(tooltip()
75798                   .placement((textDirection === 'rtl') ? 'right' : 'left'));
75799       };
75800   }
75801
75802   function uiPanelBackground(context) {
75803       var background = context.background();
75804       var currSourceName = null;
75805       var metadata = {};
75806       var metadataKeys = [
75807           'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
75808       ];
75809
75810       var debouncedRedraw = debounce(redraw, 250);
75811
75812       function redraw(selection) {
75813           var source = background.baseLayerSource();
75814           var isDG = (source.id.match(/^DigitalGlobe/i) !== null);
75815
75816           if (currSourceName !== source.name()) {
75817               currSourceName = source.name();
75818               metadata = {};
75819           }
75820
75821           selection.html('');
75822
75823           var list = selection
75824               .append('ul')
75825               .attr('class', 'background-info');
75826
75827           list
75828               .append('li')
75829               .text(currSourceName);
75830
75831           metadataKeys.forEach(function(k) {
75832               // DigitalGlobe vintage is available in raster layers for now.
75833               if (isDG && k === 'vintage') return;
75834
75835               list
75836                   .append('li')
75837                   .attr('class', 'background-info-list-' + k)
75838                   .classed('hide', !metadata[k])
75839                   .text(t('info_panels.background.' + k) + ':')
75840                   .append('span')
75841                   .attr('class', 'background-info-span-' + k)
75842                   .text(metadata[k]);
75843           });
75844
75845           debouncedGetMetadata(selection);
75846
75847           var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
75848
75849           selection
75850               .append('a')
75851               .text(t('info_panels.background.' + toggleTiles))
75852               .attr('href', '#')
75853               .attr('class', 'button button-toggle-tiles')
75854               .on('click', function() {
75855                   event.preventDefault();
75856                   context.setDebug('tile', !context.getDebug('tile'));
75857                   selection.call(redraw);
75858               });
75859
75860           if (isDG) {
75861               var key = source.id + '-vintage';
75862               var sourceVintage = context.background().findSource(key);
75863               var showsVintage = context.background().showsLayer(sourceVintage);
75864               var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
75865               selection
75866                   .append('a')
75867                   .text(t('info_panels.background.' + toggleVintage))
75868                   .attr('href', '#')
75869                   .attr('class', 'button button-toggle-vintage')
75870                   .on('click', function() {
75871                       event.preventDefault();
75872                       context.background().toggleOverlayLayer(sourceVintage);
75873                       selection.call(redraw);
75874                   });
75875           }
75876
75877           // disable if necessary
75878           ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
75879               if (source.id !== layerId) {
75880                   var key = layerId + '-vintage';
75881                   var sourceVintage = context.background().findSource(key);
75882                   if (context.background().showsLayer(sourceVintage)) {
75883                       context.background().toggleOverlayLayer(sourceVintage);
75884                   }
75885               }
75886           });
75887       }
75888
75889
75890       var debouncedGetMetadata = debounce(getMetadata, 250);
75891
75892       function getMetadata(selection) {
75893           var tile = select('.layer-background img.tile-center');   // tile near viewport center
75894           if (tile.empty()) return;
75895
75896           var sourceName = currSourceName,
75897               d = tile.datum(),
75898               zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom()),
75899               center = context.map().center();
75900
75901           // update zoom
75902           metadata.zoom = String(zoom);
75903           selection.selectAll('.background-info-list-zoom')
75904               .classed('hide', false)
75905               .selectAll('.background-info-span-zoom')
75906               .text(metadata.zoom);
75907
75908           if (!d || !d.length >= 3) return;
75909
75910           background.baseLayerSource().getMetadata(center, d, function(err, result) {
75911               if (err || currSourceName !== sourceName) return;
75912
75913               // update vintage
75914               var vintage = result.vintage;
75915               metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
75916               selection.selectAll('.background-info-list-vintage')
75917                   .classed('hide', false)
75918                   .selectAll('.background-info-span-vintage')
75919                   .text(metadata.vintage);
75920
75921               // update other metdata
75922               without(metadataKeys, 'zoom', 'vintage')
75923                   .forEach(function(k) {
75924                       var val = result[k];
75925                       metadata[k] = val;
75926                       selection.selectAll('.background-info-list-' + k)
75927                           .classed('hide', !val)
75928                           .selectAll('.background-info-span-' + k)
75929                           .text(val);
75930                   });
75931           });
75932       }
75933
75934
75935       var panel = function(selection) {
75936           selection.call(redraw);
75937
75938           context.map()
75939               .on('drawn.info-background', function() {
75940                   selection.call(debouncedRedraw);
75941               })
75942               .on('move.info-background', function() {
75943                   selection.call(debouncedGetMetadata);
75944               });
75945
75946       };
75947
75948       panel.off = function() {
75949           context.map()
75950               .on('drawn.info-background', null)
75951               .on('move.info-background', null);
75952       };
75953
75954       panel.id = 'background';
75955       panel.title = t('info_panels.background.title');
75956       panel.key = t('info_panels.background.key');
75957
75958
75959       return panel;
75960   }
75961
75962   function uiPanelHistory(context) {
75963       var osm;
75964
75965       function displayTimestamp(timestamp) {
75966           if (!timestamp) return t('info_panels.history.unknown');
75967           var detected = utilDetect();
75968           var options = {
75969               day: 'numeric', month: 'short', year: 'numeric',
75970               hour: 'numeric', minute: 'numeric', second: 'numeric'
75971           };
75972           var d = new Date(timestamp);
75973           if (isNaN(d.getTime())) return t('info_panels.history.unknown');
75974           return d.toLocaleString(detected.locale, options);
75975       }
75976
75977
75978       function displayUser(selection, userName) {
75979           if (!userName) {
75980               selection
75981                   .append('span')
75982                   .text(t('info_panels.history.unknown'));
75983               return;
75984           }
75985
75986           selection
75987               .append('span')
75988               .attr('class', 'user-name')
75989               .text(userName);
75990
75991           var links = selection
75992               .append('div')
75993               .attr('class', 'links');
75994
75995           if (osm) {
75996               links
75997                   .append('a')
75998                   .attr('class', 'user-osm-link')
75999                   .attr('href', osm.userURL(userName))
76000                   .attr('target', '_blank')
76001                   .attr('tabindex', -1)
76002                   .text('OSM');
76003           }
76004
76005           links
76006               .append('a')
76007               .attr('class', 'user-hdyc-link')
76008               .attr('href', 'https://hdyc.neis-one.org/?' + userName)
76009               .attr('target', '_blank')
76010               .attr('tabindex', -1)
76011               .text('HDYC');
76012       }
76013
76014
76015       function displayChangeset(selection, changeset) {
76016           if (!changeset) {
76017               selection
76018                   .append('span')
76019                   .text(t('info_panels.history.unknown'));
76020               return;
76021           }
76022
76023           selection
76024               .append('span')
76025               .attr('class', 'changeset-id')
76026               .text(changeset);
76027
76028           var links = selection
76029               .append('div')
76030               .attr('class', 'links');
76031
76032           if (osm) {
76033               links
76034                   .append('a')
76035                   .attr('class', 'changeset-osm-link')
76036                   .attr('href', osm.changesetURL(changeset))
76037                   .attr('target', '_blank')
76038                   .attr('tabindex', -1)
76039                   .text('OSM');
76040           }
76041
76042           links
76043               .append('a')
76044               .attr('class', 'changeset-osmcha-link')
76045               .attr('href', 'https://osmcha.mapbox.com/changesets/' + changeset)
76046               .attr('target', '_blank')
76047               .attr('tabindex', -1)
76048               .text('OSMCha');
76049       }
76050
76051
76052       function redraw(selection) {
76053           var selectedNoteID = context.selectedNoteID();
76054           osm = context.connection();
76055
76056           var selected, note, entity;
76057           if (selectedNoteID && osm) {       // selected 1 note
76058               selected = [ t('note.note') + ' ' + selectedNoteID ];
76059               note = osm.getNote(selectedNoteID);
76060           } else {                           // selected 1..n entities
76061               selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
76062               if (selected.length) {
76063                   entity = context.entity(selected[0]);
76064               }
76065           }
76066
76067           var singular = selected.length === 1 ? selected[0] : null;
76068
76069           selection.html('');
76070
76071           selection
76072               .append('h4')
76073               .attr('class', 'history-heading')
76074               .text(singular || t('info_panels.history.selected', { n: selected.length }));
76075
76076           if (!singular) return;
76077
76078           if (entity) {
76079               selection.call(redrawEntity, entity);
76080           } else if (note) {
76081               selection.call(redrawNote, note);
76082           }
76083       }
76084
76085
76086       function redrawNote(selection, note) {
76087           if (!note || note.isNew()) {
76088               selection
76089                   .append('div')
76090                   .text(t('info_panels.history.note_no_history'));
76091               return;
76092           }
76093
76094           var list = selection
76095               .append('ul');
76096
76097           list
76098               .append('li')
76099               .text(t('info_panels.history.note_comments') + ':')
76100               .append('span')
76101               .text(note.comments.length);
76102
76103           if (note.comments.length) {
76104               list
76105                   .append('li')
76106                   .text(t('info_panels.history.note_created_date') + ':')
76107                   .append('span')
76108                   .text(displayTimestamp(note.comments[0].date));
76109
76110               list
76111                   .append('li')
76112                   .text(t('info_panels.history.note_created_user') + ':')
76113                   .call(displayUser, note.comments[0].user);
76114           }
76115
76116           if (osm) {
76117               selection
76118                   .append('a')
76119                   .attr('class', 'view-history-on-osm')
76120                   .attr('target', '_blank')
76121                   .attr('tabindex', -1)
76122                   .attr('href', osm.noteURL(note))
76123                   .call(svgIcon('#iD-icon-out-link', 'inline'))
76124                   .append('span')
76125                   .text(t('info_panels.history.note_link_text'));
76126           }
76127       }
76128
76129
76130       function redrawEntity(selection, entity) {
76131           if (!entity || entity.isNew()) {
76132               selection
76133                   .append('div')
76134                   .text(t('info_panels.history.no_history'));
76135               return;
76136           }
76137
76138           var list = selection
76139               .append('ul');
76140
76141           list
76142               .append('li')
76143               .text(t('info_panels.history.version') + ':')
76144               .append('span')
76145               .text(entity.version);
76146
76147           list
76148               .append('li')
76149               .text(t('info_panels.history.last_edit') + ':')
76150               .append('span')
76151               .text(displayTimestamp(entity.timestamp));
76152
76153           list
76154               .append('li')
76155               .text(t('info_panels.history.edited_by') + ':')
76156               .call(displayUser, entity.user);
76157
76158           list
76159               .append('li')
76160               .text(t('info_panels.history.changeset') + ':')
76161               .call(displayChangeset, entity.changeset);
76162
76163           if (osm) {
76164               selection
76165                   .append('a')
76166                   .attr('class', 'view-history-on-osm')
76167                   .attr('target', '_blank')
76168                   .attr('tabindex', -1)
76169                   .attr('href', osm.historyURL(entity))
76170                   .call(svgIcon('#iD-icon-out-link', 'inline'))
76171                   .append('span')
76172                   .text(t('info_panels.history.link_text'));
76173           }
76174       }
76175
76176
76177       var panel = function(selection) {
76178           selection.call(redraw);
76179
76180           context.map()
76181               .on('drawn.info-history', function() {
76182                   selection.call(redraw);
76183               });
76184
76185           context
76186               .on('enter.info-history', function() {
76187                   selection.call(redraw);
76188               });
76189       };
76190
76191       panel.off = function() {
76192           context.map().on('drawn.info-history', null);
76193           context.on('enter.info-history', null);
76194       };
76195
76196       panel.id = 'history';
76197       panel.title = t('info_panels.history.title');
76198       panel.key = t('info_panels.history.key');
76199
76200
76201       return panel;
76202   }
76203
76204   var OSM_PRECISION = 7;
76205   var locale$2 = utilDetect().locale;
76206
76207   /**
76208    * Returns a localized representation of the given length measurement.
76209    *
76210    * @param {Number} m area in meters
76211    * @param {Boolean} isImperial true for U.S. customary units; false for metric
76212    */
76213   function displayLength(m, isImperial) {
76214       var d = m * (isImperial ? 3.28084 : 1);
76215       var unit;
76216
76217       if (isImperial) {
76218           if (d >= 5280) {
76219               d /= 5280;
76220               unit = 'miles';
76221           } else {
76222               unit = 'feet';
76223           }
76224       } else {
76225           if (d >= 1000) {
76226               d /= 1000;
76227               unit = 'kilometers';
76228           } else {
76229               unit = 'meters';
76230           }
76231       }
76232
76233       return t('units.' + unit, {
76234           quantity: d.toLocaleString(locale$2, {
76235               maximumSignificantDigits: 4
76236           })
76237       });
76238   }
76239
76240   /**
76241    * Returns a localized representation of the given area measurement.
76242    *
76243    * @param {Number} m2 area in square meters
76244    * @param {Boolean} isImperial true for U.S. customary units; false for metric
76245    */
76246   function displayArea(m2, isImperial) {
76247       var d = m2 * (isImperial ? 10.7639111056 : 1);
76248       var d1, d2, area;
76249       var unit1 = '';
76250       var unit2 = '';
76251
76252       if (isImperial) {
76253           if (d >= 6969600) { // > 0.25mi² show mi²
76254               d1 = d / 27878400;
76255               unit1 = 'square_miles';
76256           } else {
76257               d1 = d;
76258               unit1 = 'square_feet';
76259           }
76260
76261           if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
76262               d2 = d / 43560;
76263               unit2 = 'acres';
76264           }
76265
76266       } else {
76267           if (d >= 250000) { // > 0.25km² show km²
76268               d1 = d / 1000000;
76269               unit1 = 'square_kilometers';
76270           } else {
76271               d1 = d;
76272               unit1 = 'square_meters';
76273           }
76274
76275           if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
76276               d2 = d / 10000;
76277               unit2 = 'hectares';
76278           }
76279       }
76280
76281       area = t('units.' + unit1, {
76282           quantity: d1.toLocaleString(locale$2, {
76283               maximumSignificantDigits: 4
76284           })
76285       });
76286
76287       if (d2) {
76288           return t('units.area_pair', {
76289               area1: area,
76290               area2: t('units.' + unit2, {
76291                   quantity: d2.toLocaleString(locale$2, {
76292                       maximumSignificantDigits: 2
76293                   })
76294               })
76295           });
76296       } else {
76297           return area;
76298       }
76299   }
76300
76301   function wrap(x, min, max) {
76302       var d = max - min;
76303       return ((x - min) % d + d) % d + min;
76304   }
76305
76306   function clamp$1(x, min, max) {
76307       return Math.max(min, Math.min(x, max));
76308   }
76309
76310   function displayCoordinate(deg, pos, neg) {
76311       var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
76312       var sec = (min - Math.floor(min)) * 60;
76313       var displayDegrees = t('units.arcdegrees', {
76314           quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
76315       });
76316       var displayCoordinate;
76317
76318       if (Math.floor(sec) > 0) {
76319           displayCoordinate = displayDegrees +
76320               t('units.arcminutes', {
76321                   quantity: Math.floor(min).toLocaleString(locale$2)
76322               }) +
76323               t('units.arcseconds', {
76324                   quantity: Math.round(sec).toLocaleString(locale$2)
76325               });
76326       } else if (Math.floor(min) > 0) {
76327           displayCoordinate = displayDegrees +
76328               t('units.arcminutes', {
76329                   quantity: Math.round(min).toLocaleString(locale$2)
76330               });
76331       } else {
76332           displayCoordinate = t('units.arcdegrees', {
76333               quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
76334           });
76335       }
76336
76337       if (deg === 0) {
76338           return displayCoordinate;
76339       } else {
76340           return t('units.coordinate', {
76341               coordinate: displayCoordinate,
76342               direction: t('units.' + (deg > 0 ? pos : neg))
76343           });
76344       }
76345   }
76346
76347   /**
76348    * Returns given coordinate pair in degree-minute-second format.
76349    *
76350    * @param {Array<Number>} coord longitude and latitude
76351    */
76352   function dmsCoordinatePair(coord) {
76353       return t('units.coordinate_pair', {
76354           latitude: displayCoordinate(clamp$1(coord[1], -90, 90), 'north', 'south'),
76355           longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
76356       });
76357   }
76358
76359   /**
76360    * Returns the given coordinate pair in decimal format.
76361    * note: unlocalized to avoid comma ambiguity - see #4765
76362    *
76363    * @param {Array<Number>} coord longitude and latitude
76364    */
76365   function decimalCoordinatePair(coord) {
76366       return t('units.coordinate_pair', {
76367           latitude: clamp$1(coord[1], -90, 90).toFixed(OSM_PRECISION),
76368           longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
76369       });
76370   }
76371
76372   function uiPanelLocation(context) {
76373       var currLocation = '';
76374
76375
76376       function redraw(selection) {
76377           selection.html('');
76378
76379           var list = selection
76380               .append('ul');
76381
76382           // Mouse coordinates
76383           var coord = context.map().mouseCoordinates();
76384           if (coord.some(isNaN)) {
76385               coord = context.map().center();
76386           }
76387
76388           list
76389               .append('li')
76390               .text(dmsCoordinatePair(coord))
76391               .append('li')
76392               .text(decimalCoordinatePair(coord));
76393
76394           // Location Info
76395           selection
76396               .append('div')
76397               .attr('class', 'location-info')
76398               .text(currLocation || ' ');
76399
76400           debouncedGetLocation(selection, coord);
76401       }
76402
76403
76404       var debouncedGetLocation = debounce(getLocation, 250);
76405       function getLocation(selection, coord) {
76406           if (!services.geocoder) {
76407               currLocation = t('info_panels.location.unknown_location');
76408               selection.selectAll('.location-info')
76409                   .text(currLocation);
76410           } else {
76411               services.geocoder.reverse(coord, function(err, result) {
76412                   currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
76413                   selection.selectAll('.location-info')
76414                       .text(currLocation);
76415               });
76416           }
76417       }
76418
76419
76420       var panel = function(selection) {
76421           selection.call(redraw);
76422
76423           context.surface()
76424               .on('mousemove.info-location', function() {
76425                   selection.call(redraw);
76426               });
76427       };
76428
76429       panel.off = function() {
76430           context.surface()
76431               .on('mousemove.info-location', null);
76432       };
76433
76434       panel.id = 'location';
76435       panel.title = t('info_panels.location.title');
76436       panel.key = t('info_panels.location.key');
76437
76438
76439       return panel;
76440   }
76441
76442   function uiPanelMeasurement(context) {
76443       var locale = utilDetect().locale,
76444           isImperial = (locale.toLowerCase() === 'en-us');
76445
76446
76447       function radiansToMeters(r) {
76448           // using WGS84 authalic radius (6371007.1809 m)
76449           return r * 6371007.1809;
76450       }
76451
76452       function steradiansToSqmeters(r) {
76453           // http://gis.stackexchange.com/a/124857/40446
76454           return r / (4 * Math.PI) * 510065621724000;
76455       }
76456
76457
76458       function toLineString(feature) {
76459           if (feature.type === 'LineString') return feature;
76460
76461           var result = { type: 'LineString', coordinates: [] };
76462           if (feature.type === 'Polygon') {
76463               result.coordinates = feature.coordinates[0];
76464           } else if (feature.type === 'MultiPolygon') {
76465               result.coordinates = feature.coordinates[0][0];
76466           }
76467
76468           return result;
76469       }
76470
76471
76472       function nodeCount(feature) {
76473         if (feature.type === 'LineString') return feature.coordinates.length;
76474         if (feature.type === 'Polygon') return feature.coordinates[0].length - 1;
76475       }
76476
76477
76478       function redraw(selection) {
76479           var resolver = context.graph();
76480           var selectedNoteID = context.selectedNoteID();
76481           var osm = services.osm;
76482
76483           var selected, center, entity, note, geometry;
76484
76485           if (selectedNoteID && osm) {       // selected 1 note
76486               selected = [ t('note.note') + ' ' + selectedNoteID ];
76487               note = osm.getNote(selectedNoteID);
76488               center = note.loc;
76489               geometry = 'note';
76490
76491           } else {                           // selected 1..n entities
76492               var extent = geoExtent();
76493               selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
76494               if (selected.length) {
76495                   for (var i = 0; i < selected.length; i++) {
76496                       entity = context.entity(selected[i]);
76497                       extent._extend(entity.extent(resolver));
76498                   }
76499                   center = extent.center();
76500                   geometry = entity.geometry(resolver);
76501               }
76502           }
76503
76504           var singular = selected.length === 1 ? selected[0] : null;
76505
76506           selection.html('');
76507
76508           selection
76509               .append('h4')
76510               .attr('class', 'measurement-heading')
76511               .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
76512
76513           if (!selected.length) return;
76514
76515
76516           var list = selection
76517               .append('ul');
76518           var coordItem;
76519
76520           // multiple selected features, just display extent center..
76521           if (!singular) {
76522               coordItem = list
76523                   .append('li')
76524                   .text(t('info_panels.measurement.center') + ':');
76525               coordItem.append('span')
76526                   .text(dmsCoordinatePair(center));
76527               coordItem.append('span')
76528                   .text(decimalCoordinatePair(center));
76529               return;
76530           }
76531
76532           // single selected feature, display details..
76533           if (geometry === 'line' || geometry === 'area') {
76534               var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate());
76535               var feature = entity.asGeoJSON(resolver);
76536               var length = radiansToMeters(length$1(toLineString(feature)));
76537               var lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length'));
76538               var centroid = d3_geoCentroid(feature);
76539
76540               list
76541                   .append('li')
76542                   .text(t('info_panels.measurement.geometry') + ':')
76543                   .append('span')
76544                   .text(
76545                       closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
76546                   );
76547
76548               if (entity.type !== 'relation') {
76549                   list
76550                       .append('li')
76551                       .text(t('info_panels.measurement.node_count') + ':')
76552                       .append('span')
76553                       .text(nodeCount(feature).toLocaleString(locale));
76554               }
76555
76556               if (closed) {
76557                   var area = steradiansToSqmeters(entity.area(resolver));
76558                   list
76559                       .append('li')
76560                       .text(t('info_panels.measurement.area') + ':')
76561                       .append('span')
76562                       .text(displayArea(area, isImperial));
76563               }
76564
76565
76566               list
76567                   .append('li')
76568                   .text(lengthLabel + ':')
76569                   .append('span')
76570                   .text(displayLength(length, isImperial));
76571
76572               coordItem = list
76573                   .append('li')
76574                   .text(t('info_panels.measurement.centroid') + ':');
76575               coordItem.append('span')
76576                   .text(dmsCoordinatePair(centroid));
76577               coordItem.append('span')
76578                   .text(decimalCoordinatePair(centroid));
76579
76580               var toggle  = isImperial ? 'imperial' : 'metric';
76581
76582               selection
76583                   .append('a')
76584                   .text(t('info_panels.measurement.' + toggle))
76585                   .attr('href', '#')
76586                   .attr('class', 'button button-toggle-units')
76587                   .on('click', function() {
76588                       event.preventDefault();
76589                       isImperial = !isImperial;
76590                       selection.call(redraw);
76591                   });
76592
76593           } else {
76594               var centerLabel = t('info_panels.measurement.' +
76595                   (note || entity.type === 'node' ? 'location' : 'center'));
76596
76597               list
76598                   .append('li')
76599                   .text(t('info_panels.measurement.geometry') + ':')
76600                   .append('span')
76601                   .text(t('geometry.' + geometry));
76602
76603               coordItem = list
76604                   .append('li')
76605                   .text(centerLabel + ':');
76606               coordItem.append('span')
76607                   .text(dmsCoordinatePair(center));
76608               coordItem.append('span')
76609                   .text(decimalCoordinatePair(center));
76610           }
76611       }
76612
76613
76614       var panel = function(selection) {
76615           selection.call(redraw);
76616
76617           context.map()
76618               .on('drawn.info-measurement', function() {
76619                   selection.call(redraw);
76620               });
76621
76622           context
76623               .on('enter.info-measurement', function() {
76624                   selection.call(redraw);
76625               });
76626       };
76627
76628       panel.off = function() {
76629           context.map().on('drawn.info-measurement', null);
76630           context.on('enter.info-measurement', null);
76631       };
76632
76633       panel.id = 'measurement';
76634       panel.title = t('info_panels.measurement.title');
76635       panel.key = t('info_panels.measurement.key');
76636
76637
76638       return panel;
76639   }
76640
76641   var uiInfoPanels = {
76642       background: uiPanelBackground,
76643       history: uiPanelHistory,
76644       location: uiPanelLocation,
76645       measurement: uiPanelMeasurement,
76646   };
76647
76648   function uiInfo(context) {
76649       var ids = Object.keys(uiInfoPanels);
76650       var wasActive = ['measurement'];
76651       var panels = {};
76652       var active = {};
76653
76654       // create panels
76655       ids.forEach(function(k) {
76656           if (!panels[k]) {
76657               panels[k] = uiInfoPanels[k](context);
76658               active[k] = false;
76659           }
76660       });
76661
76662
76663       function info(selection) {
76664
76665           function redraw() {
76666               var activeids = ids.filter(function(k) { return active[k]; }).sort();
76667
76668               var containers = infoPanels.selectAll('.panel-container')
76669                   .data(activeids, function(k) { return k; });
76670
76671               containers.exit()
76672                   .style('opacity', 1)
76673                   .transition()
76674                   .duration(200)
76675                   .style('opacity', 0)
76676                   .on('end', function(d) {
76677                       select(this)
76678                           .call(panels[d].off)
76679                           .remove();
76680                   });
76681
76682               var enter = containers.enter()
76683                   .append('div')
76684                   .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
76685
76686               enter
76687                   .style('opacity', 0)
76688                   .transition()
76689                   .duration(200)
76690                   .style('opacity', 1);
76691
76692               var title = enter
76693                   .append('div')
76694                   .attr('class', 'panel-title fillD2');
76695
76696               title
76697                   .append('h3')
76698                   .text(function(d) { return panels[d].title; });
76699
76700               title
76701                   .append('button')
76702                   .attr('class', 'close')
76703                   .on('click', function (d) { toggle(d); })
76704                   .call(svgIcon('#iD-icon-close'));
76705
76706               enter
76707                   .append('div')
76708                   .attr('class', function(d) { return 'panel-content panel-content-' + d; });
76709
76710
76711               // redraw the panels
76712               infoPanels.selectAll('.panel-content')
76713                   .each(function(d) {
76714                       select(this).call(panels[d]);
76715                   });
76716           }
76717
76718
76719           function toggle(which) {
76720               if (event) {
76721                   event.stopImmediatePropagation();
76722                   event.preventDefault();
76723               }
76724
76725               var activeids = ids.filter(function(k) { return active[k]; });
76726
76727               if (which) {  // toggle one
76728                   active[which] = !active[which];
76729                   if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
76730                       wasActive = [which];
76731                   }
76732               } else {      // toggle all
76733                   if (activeids.length) {
76734                       wasActive = activeids;
76735                       activeids.forEach(function(k) { active[k] = false; });
76736                   } else {
76737                       wasActive.forEach(function(k) { active[k] = true; });
76738                   }
76739               }
76740
76741               redraw();
76742           }
76743
76744
76745           var infoPanels = selection.selectAll('.info-panels')
76746               .data([0]);
76747
76748           infoPanels = infoPanels.enter()
76749               .append('div')
76750               .attr('class', 'info-panels')
76751               .merge(infoPanels);
76752
76753           redraw();
76754
76755           context.keybinding()
76756               .on(uiCmd('⌘' + t('info_panels.key')), toggle);
76757
76758           ids.forEach(function(k) {
76759               var key = t('info_panels.' + k + '.key', { default: null });
76760               if (!key) return;
76761               context.keybinding()
76762                   .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
76763           });
76764       }
76765
76766       return info;
76767   }
76768
76769   function uiModes(context) {
76770       var modes = [
76771           modeAddPoint(context),
76772           modeAddLine(context),
76773           modeAddArea(context),
76774           modeAddNote(context)
76775       ];
76776
76777
76778       function enabled(d) {
76779           if (d.id === 'add-note') {
76780               return notesEnabled() && notesEditable();
76781           } else {
76782               return osmEditable();
76783           }
76784       }
76785
76786       function osmEditable() {
76787           var mode = context.mode();
76788           return context.editable() && mode && mode.id !== 'save';
76789       }
76790
76791       function notesEnabled() {
76792           var noteLayer = context.layers().layer('notes');
76793           return noteLayer && noteLayer.enabled();
76794       }
76795
76796       function notesEditable() {
76797           var mode = context.mode();
76798           return context.map().notesEditable() && mode && mode.id !== 'save';
76799       }
76800
76801
76802       return function(selection) {
76803           context
76804               .on('enter.editor', function(entered) {
76805                   selection.selectAll('button.add-button')
76806                       .classed('active', function(mode) { return entered.button === mode.button; });
76807                   context.container()
76808                       .classed('mode-' + entered.id, true);
76809               });
76810
76811           context
76812               .on('exit.editor', function(exited) {
76813                   context.container()
76814                       .classed('mode-' + exited.id, false);
76815               });
76816
76817           modes.forEach(function(mode) {
76818               context.keybinding().on(mode.key, function() {
76819                   if (!enabled(mode)) return;
76820
76821                   if (mode.id === context.mode().id) {
76822                       context.enter(modeBrowse(context));
76823                   } else {
76824                       context.enter(mode);
76825                   }
76826               });
76827           });
76828
76829
76830           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
76831
76832           context.map()
76833               .on('move.modes', debouncedUpdate)
76834               .on('drawn.modes', debouncedUpdate);
76835
76836           context
76837               .on('enter.modes', update);
76838
76839           update();
76840
76841
76842           function update() {
76843               var showNotes = notesEnabled();
76844               var data = showNotes ? modes : modes.slice(0, 3);
76845
76846               var buttons = selection.selectAll('button.add-button')
76847                   .data(data, function(d) { return d.id; });
76848
76849               // exit
76850               buttons.exit()
76851                   .remove();
76852
76853               // enter
76854               var buttonsEnter = buttons.enter()
76855                   .append('button')
76856                   .attr('tabindex', -1)
76857                   .attr('class', function(d) { return d.id + ' add-button'; })
76858                   .on('click.mode-buttons', function(d) {
76859                       if (!enabled(d)) return;
76860
76861                       // When drawing, ignore accidental clicks on mode buttons - #4042
76862                       var currMode = context.mode().id;
76863                       if (/^draw/.test(currMode)) return;
76864
76865                       if (d.id === currMode) {
76866                           context.enter(modeBrowse(context));
76867                       } else {
76868                           context.enter(d);
76869                       }
76870                   })
76871                   .call(tooltip()
76872                       .placement('bottom')
76873                       .html(true)
76874                       .title(function(d) { return uiTooltipHtml(d.description, d.key); })
76875                   );
76876
76877               buttonsEnter
76878                   .each(function(d) {
76879                       select(this)
76880                           .call(svgIcon('#iD-icon-' + d.button));
76881                   });
76882
76883               buttonsEnter
76884                   .append('span')
76885                   .attr('class', 'label')
76886                   .text(function(mode) { return mode.title; });
76887
76888               // if we are adding/removing the buttons, check if toolbar has overflowed
76889               if (buttons.enter().size() || buttons.exit().size()) {
76890                   context.ui().checkOverflow('#bar', true);
76891               }
76892
76893               // update
76894               buttons = buttons
76895                   .merge(buttonsEnter)
76896                   .classed('disabled', function(d) { return !enabled(d); });
76897           }
76898       };
76899   }
76900
76901   function uiNotice(context) {
76902
76903       return function(selection) {
76904           var div = selection
76905               .append('div')
76906               .attr('class', 'notice');
76907
76908           var button = div
76909               .append('button')
76910               .attr('class', 'zoom-to notice fillD')
76911               .on('click', function() {
76912                   context.map().zoomEase(context.minEditableZoom());
76913               })
76914               .on('wheel', function() {   // let wheel events pass through #4482
76915                   var e2 = new WheelEvent(event.type, event);
76916                   context.surface().node().dispatchEvent(e2);
76917               });
76918
76919           button
76920               .call(svgIcon('#iD-icon-plus', 'pre-text'))
76921               .append('span')
76922               .attr('class', 'label')
76923               .text(t('zoom_in_edit'));
76924
76925
76926           function disableTooHigh() {
76927               var canEdit = context.map().zoom() >= context.minEditableZoom();
76928               div.style('display', canEdit ? 'none' : 'block');
76929           }
76930
76931           context.map()
76932               .on('move.notice', debounce(disableTooHigh, 500));
76933
76934           disableTooHigh();
76935       };
76936   }
76937
76938   function uiPhotoviewer(context) {
76939
76940       var dispatch$1 = dispatch('resize');
76941
76942       function photoviewer(selection) {
76943           selection
76944               .append('button')
76945               .attr('class', 'thumb-hide')
76946               .on('click', function () {
76947                   if (services.streetside) { services.streetside.hideViewer(); }
76948                   if (services.mapillary) { services.mapillary.hideViewer(); }
76949                   if (services.openstreetcam) { services.openstreetcam.hideViewer(); }
76950               })
76951               .append('div')
76952               .call(svgIcon('#iD-icon-close'));
76953
76954           selection
76955               .append('button')
76956               .attr('class', 'resize-handle-xy')
76957               .on(
76958                   'mousedown',
76959                   buildResizeListener(selection, 'resize', dispatch$1, { resizeOnX: true, resizeOnY: true })
76960               );
76961
76962           selection
76963               .append('button')
76964               .attr('class', 'resize-handle-x')
76965               .on(
76966                   'mousedown',
76967                   buildResizeListener(selection, 'resize', dispatch$1, { resizeOnX: true })
76968               );
76969
76970           selection
76971               .append('button')
76972               .attr('class', 'resize-handle-y')
76973               .on(
76974                   'mousedown',
76975                   buildResizeListener(selection, 'resize', dispatch$1, { resizeOnY: true })
76976               );
76977
76978
76979           function buildResizeListener(target, eventName, dispatch, options) {
76980               var resizeOnX = !!options.resizeOnX;
76981               var resizeOnY = !!options.resizeOnY;
76982               var minHeight = options.minHeight || 240;
76983               var minWidth = options.minWidth || 320;
76984               var startX;
76985               var startY;
76986               var startWidth;
76987               var startHeight;
76988
76989               function startResize() {
76990                   var mapSize = context.map().dimensions();
76991
76992                   if (resizeOnX) {
76993                       var maxWidth = mapSize[0];
76994                       var newWidth = clamp((startWidth + event.clientX - startX), minWidth, maxWidth);
76995                       target.style('width', newWidth + 'px');
76996                   }
76997
76998                   if (resizeOnY) {
76999                       var maxHeight = mapSize[1] - 90;  // preserve space at top/bottom of map
77000                       var newHeight = clamp((startHeight + startY - event.clientY), minHeight, maxHeight);
77001                       target.style('height', newHeight + 'px');
77002                   }
77003
77004                   dispatch.call(eventName, target, utilGetDimensions(target, true));
77005               }
77006
77007               function clamp(num, min, max) {
77008                   return Math.max(min, Math.min(num, max));
77009               }
77010
77011               function stopResize() {
77012                   select(window)
77013                       .on('.' + eventName, null);
77014               }
77015
77016               return function initResize() {
77017                   startX = event.clientX;
77018                   startY = event.clientY;
77019                   startWidth = target.node().getBoundingClientRect().width;
77020                   startHeight = target.node().getBoundingClientRect().height;
77021
77022                   select(window)
77023                       .on('mousemove.' + eventName, startResize, false)
77024                       .on('mouseup.' + eventName, stopResize, false);
77025               };
77026           }
77027       }
77028
77029       photoviewer.onMapResize = function() {
77030           var photoviewer = select('#photoviewer');
77031           var content = select('#content');
77032           var mapDimensions = utilGetDimensions(content, true);
77033           // shrink photo viewer if it is too big
77034           // (-90 preserves space at top and bottom of map used by menus)
77035           var photoDimensions = utilGetDimensions(photoviewer, true);
77036           if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > (mapDimensions[1] - 90)) {
77037               var setPhotoDimensions = [
77038                   Math.min(photoDimensions[0], mapDimensions[0]),
77039                   Math.min(photoDimensions[1], mapDimensions[1] - 90),
77040               ];
77041
77042               photoviewer
77043                   .style('width', setPhotoDimensions[0] + 'px')
77044                   .style('height', setPhotoDimensions[1] + 'px');
77045
77046               dispatch$1.call('resize', photoviewer, setPhotoDimensions);
77047           }
77048       };
77049
77050       return utilRebind(photoviewer, dispatch$1, 'on');
77051   }
77052
77053   function uiRestore(context) {
77054
77055       return function(selection) {
77056           if (!context.history().lock() || !context.history().restorableChanges())
77057               return;
77058
77059           var modalSelection = uiModal(selection, true);
77060
77061           modalSelection.select('.modal')
77062               .attr('class', 'modal fillL col6');
77063
77064           var introModal = modalSelection.select('.content');
77065
77066           introModal
77067               .attr('class','cf');
77068
77069           introModal
77070               .append('div')
77071               .attr('class', 'modal-section')
77072               .append('h3')
77073               .text(t('restore.heading'));
77074
77075           introModal
77076               .append('div')
77077               .attr('class','modal-section')
77078               .append('p')
77079               .text(t('restore.description'));
77080
77081           var buttonWrap = introModal
77082               .append('div')
77083               .attr('class', 'modal-actions cf');
77084
77085           var restore = buttonWrap
77086               .append('button')
77087               .attr('class', 'restore col6')
77088               .on('click', function() {
77089                   context.history().restore();
77090                   modalSelection.remove();
77091               });
77092
77093           restore
77094               .append('svg')
77095               .attr('class', 'logo logo-restore')
77096               .append('use')
77097               .attr('xlink:href', '#iD-logo-restore');
77098
77099           restore
77100               .append('div')
77101               .text(t('restore.restore'));
77102
77103           var reset = buttonWrap
77104               .append('button')
77105               .attr('class', 'reset col6')
77106               .on('click', function() {
77107                   context.history().clearSaved();
77108                   modalSelection.remove();
77109               });
77110
77111           reset
77112               .append('svg')
77113               .attr('class', 'logo logo-reset')
77114               .append('use')
77115               .attr('xlink:href', '#iD-logo-reset');
77116
77117           reset
77118               .append('div')
77119               .text(t('restore.reset'));
77120
77121           restore.node().focus();
77122       };
77123   }
77124
77125   function uiSave(context) {
77126       var history = context.history();
77127       var key = uiCmd('⌘S');
77128       var _numChanges = 0;
77129
77130
77131       return function(selection) {
77132
77133
77134           function isSaving() {
77135               var mode = context.mode();
77136               return mode && mode.id === 'save';
77137           }
77138
77139
77140           function isDisabled() {
77141               return _numChanges === 0 || isSaving();
77142           }
77143
77144
77145           function save() {
77146               event.preventDefault();
77147               if (!context.inIntro() && !isSaving() && history.hasChanges()) {
77148                   context.enter(modeSave(context));
77149               }
77150           }
77151
77152
77153           function bgColor() {
77154               var step;
77155               if (_numChanges === 0) {
77156                   return null;
77157               } else if (_numChanges <= 50) {
77158                   step = _numChanges / 50;
77159                   return interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
77160               } else {
77161                   step = Math.min((_numChanges - 50) / 50, 1.0);
77162                   return interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
77163               }
77164           }
77165
77166
77167           function updateCount() {
77168               var val = history.difference().summary().length;
77169               if (val === _numChanges) return;
77170               _numChanges = val;
77171
77172               tooltipBehavior
77173                   .title(uiTooltipHtml(
77174                       t(_numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
77175                   );
77176
77177               button
77178                   .classed('disabled', isDisabled())
77179                   .style('background', bgColor(_numChanges));
77180
77181               button.select('span.count')
77182                   .text(_numChanges);
77183           }
77184
77185
77186           var tooltipBehavior = tooltip()
77187               .placement('bottom')
77188               .html(true)
77189               .title(uiTooltipHtml(t('save.no_changes'), key));
77190
77191           var button = selection
77192               .append('button')
77193               .attr('class', 'save disabled')
77194               .attr('tabindex', -1)
77195               .on('click', save)
77196               .call(tooltipBehavior);
77197
77198           button
77199               .call(svgIcon('#iD-icon-save'));
77200
77201           button
77202               .append('span')
77203               .attr('class', 'label')
77204               .text(t('save.title'));
77205
77206           button
77207               .append('span')
77208               .attr('class', 'count')
77209               .text('0');
77210
77211           updateCount();
77212
77213
77214           context.keybinding()
77215               .on(key, save, true);
77216
77217           context.history()
77218               .on('change.save', updateCount);
77219
77220           context
77221               .on('enter.save', function() {
77222                   button
77223                       .classed('disabled', isDisabled());
77224
77225                   if (isSaving()) {
77226                       button.call(tooltipBehavior.hide);
77227                   }
77228               });
77229       };
77230   }
77231
77232   function uiScale(context) {
77233       var projection = context.projection,
77234           isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
77235           maxLength = 180,
77236           tickHeight = 8;
77237
77238
77239       function scaleDefs(loc1, loc2) {
77240           var lat = (loc2[1] + loc1[1]) / 2,
77241               conversion = (isImperial ? 3.28084 : 1),
77242               dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
77243               scale = { dist: 0, px: 0, text: '' },
77244               buckets, i, val, dLon;
77245
77246           if (isImperial) {
77247               buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
77248           } else {
77249               buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
77250           }
77251
77252           // determine a user-friendly endpoint for the scale
77253           for (i = 0; i < buckets.length; i++) {
77254               val = buckets[i];
77255               if (dist >= val) {
77256                   scale.dist = Math.floor(dist / val) * val;
77257                   break;
77258               } else {
77259                   scale.dist = +dist.toFixed(2);
77260               }
77261           }
77262
77263           dLon = geoMetersToLon(scale.dist / conversion, lat);
77264           scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
77265
77266           scale.text = displayLength(scale.dist / conversion, isImperial);
77267
77268           return scale;
77269       }
77270
77271
77272       function update(selection) {
77273           // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
77274           var dims = context.map().dimensions(),
77275               loc1 = projection.invert([0, dims[1]]),
77276               loc2 = projection.invert([maxLength, dims[1]]),
77277               scale = scaleDefs(loc1, loc2);
77278
77279           selection.select('#scale-path')
77280               .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
77281
77282           selection.select('#scale-textgroup')
77283               .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
77284
77285           selection.select('#scale-text')
77286               .text(scale.text);
77287       }
77288
77289
77290       return function(selection) {
77291           function switchUnits() {
77292               isImperial = !isImperial;
77293               selection.call(update);
77294           }
77295
77296           var scalegroup = selection.append('svg')
77297               .attr('id', 'scale')
77298               .on('click', switchUnits)
77299               .append('g')
77300               .attr('transform', 'translate(10,11)');
77301
77302           scalegroup
77303               .append('path')
77304               .attr('id', 'scale-path');
77305
77306           scalegroup
77307               .append('g')
77308               .attr('id', 'scale-textgroup')
77309               .append('text')
77310               .attr('id', 'scale-text');
77311
77312           selection.call(update);
77313
77314           context.map().on('move.scale', function() {
77315               update(selection);
77316           });
77317       };
77318   }
77319
77320   function uiSidebar(context) {
77321       var inspector = uiInspector(context);
77322       var dataEditor = uiDataEditor(context);
77323       var noteEditor = uiNoteEditor(context);
77324       var improveOsmEditor = uiImproveOsmEditor(context);
77325       var keepRightEditor = uiKeepRightEditor(context);
77326       var _current;
77327       var _wasData = false;
77328       var _wasNote = false;
77329       var _wasQAError = false;
77330
77331
77332       function sidebar(selection) {
77333           var container = select('#id-container');
77334           var minWidth = 280;
77335           var sidebarWidth;
77336           var containerWidth;
77337           var dragOffset;
77338
77339           var resizer = selection
77340               .append('div')
77341               .attr('id', 'sidebar-resizer');
77342
77343           // Set the initial width constraints
77344           selection
77345               .style('min-width', minWidth + 'px')
77346               .style('max-width', '400px')
77347               .style('width', '33.3333%');
77348
77349           resizer.call(d3_drag()
77350               .container(container.node())
77351               .on('start', function() {
77352                   // offset from edge of sidebar-resizer
77353                   dragOffset = event.sourceEvent.offsetX - 1;
77354
77355                   sidebarWidth = selection.node().getBoundingClientRect().width;
77356                   containerWidth = container.node().getBoundingClientRect().width;
77357                   var widthPct = (sidebarWidth / containerWidth) * 100;
77358                   selection
77359                       .style('width', widthPct + '%')    // lock in current width
77360                       .style('max-width', '85%');        // but allow larger widths
77361
77362                   resizer.classed('dragging', true);
77363               })
77364               .on('drag', function() {
77365                   var isRTL = (textDirection === 'rtl');
77366                   var scaleX = isRTL ? 0 : 1;
77367                   var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
77368
77369                   var x = event.x - dragOffset;
77370                   sidebarWidth = isRTL ? containerWidth - x : x;
77371
77372                   var isCollapsed = selection.classed('collapsed');
77373                   var shouldCollapse = sidebarWidth < minWidth;
77374
77375                   selection.classed('collapsed', shouldCollapse);
77376
77377                   if (shouldCollapse) {
77378                       if (!isCollapsed) {
77379                           selection
77380                               .style(xMarginProperty, '-400px')
77381                               .style('width', '400px');
77382
77383                           context.ui().onResize([(sidebarWidth - event.dx) * scaleX, 0]);
77384                       }
77385
77386                   } else {
77387                       var widthPct = (sidebarWidth / containerWidth) * 100;
77388                       selection
77389                           .style(xMarginProperty, null)
77390                           .style('width', widthPct + '%');
77391
77392                       if (isCollapsed) {
77393                           context.ui().onResize([-sidebarWidth * scaleX, 0]);
77394                       } else {
77395                           context.ui().onResize([-event.dx * scaleX, 0]);
77396                       }
77397                   }
77398               })
77399               .on('end', function() {
77400                   resizer.classed('dragging', false);
77401               })
77402           );
77403
77404           var featureListWrap = selection
77405               .append('div')
77406               .attr('class', 'feature-list-pane')
77407               .call(uiFeatureList(context));
77408
77409           var inspectorWrap = selection
77410               .append('div')
77411               .attr('class', 'inspector-hidden inspector-wrap fr');
77412
77413
77414           function hover(datum) {
77415               if (datum && datum.__featurehash__) {   // hovering on data
77416                   _wasData = true;
77417                   sidebar
77418                       .show(dataEditor.datum(datum));
77419
77420                   selection.selectAll('.sidebar-component')
77421                       .classed('inspector-hover', true);
77422
77423               } else if (datum instanceof osmNote) {
77424                   if (context.mode().id === 'drag-note') return;
77425                   _wasNote = true;
77426
77427                   var osm = services.osm;
77428                   if (osm) {
77429                       datum = osm.getNote(datum.id);   // marker may contain stale data - get latest
77430                   }
77431
77432                   sidebar
77433                       .show(noteEditor.note(datum));
77434
77435                   selection.selectAll('.sidebar-component')
77436                       .classed('inspector-hover', true);
77437
77438               } else if (datum instanceof qaError) {
77439                   _wasQAError = true;
77440
77441                   var errService = services[datum.service];
77442                   if (errService) {
77443                       // marker may contain stale data - get latest
77444                       datum = errService.getError(datum.id);
77445                   }
77446
77447                   // Temporary solution while only two services
77448                   var errEditor = (datum.service === 'keepRight') ? keepRightEditor : improveOsmEditor;
77449
77450                   d3_selectAll('.qa_error.' + datum.service)
77451                       .classed('hover', function(d) { return d.id === datum.id; });
77452
77453                   sidebar
77454                       .show(errEditor.error(datum));
77455
77456                   selection.selectAll('.sidebar-component')
77457                       .classed('inspector-hover', true);
77458
77459               } else if (!_current && (datum instanceof osmEntity)) {
77460                   featureListWrap
77461                       .classed('inspector-hidden', true);
77462
77463                   inspectorWrap
77464                       .classed('inspector-hidden', false)
77465                       .classed('inspector-hover', true);
77466
77467                   if (inspector.entityID() !== datum.id || inspector.state() !== 'hover') {
77468                       inspector
77469                           .state('hover')
77470                           .entityID(datum.id);
77471
77472                       inspectorWrap
77473                           .call(inspector);
77474                   }
77475
77476               } else if (!_current) {
77477                   featureListWrap
77478                       .classed('inspector-hidden', false);
77479                   inspectorWrap
77480                       .classed('inspector-hidden', true);
77481                   inspector
77482                       .state('hide');
77483
77484               } else if (_wasData || _wasNote || _wasQAError) {
77485                   _wasNote = false;
77486                   _wasData = false;
77487                   _wasQAError = false;
77488                   d3_selectAll('.note').classed('hover', false);
77489                   d3_selectAll('.qa_error').classed('hover', false);
77490                   sidebar.hide();
77491               }
77492           }
77493
77494           sidebar.hover = throttle(hover, 200);
77495
77496
77497           sidebar.intersects = function(extent) {
77498               var rect = selection.node().getBoundingClientRect();
77499               return extent.intersects([
77500                   context.projection.invert([0, rect.height]),
77501                   context.projection.invert([rect.width, 0])
77502               ]);
77503           };
77504
77505
77506           sidebar.select = function(id, newFeature) {
77507               sidebar.hide();
77508
77509               if (id) {
77510                   var entity = context.entity(id);
77511                   // uncollapse the sidebar
77512                   if (selection.classed('collapsed')) {
77513                       var extent = entity.extent(context.graph());
77514                       sidebar.expand(sidebar.intersects(extent));
77515                   }
77516
77517                   featureListWrap
77518                       .classed('inspector-hidden', true);
77519
77520                   inspectorWrap
77521                       .classed('inspector-hidden', false)
77522                       .classed('inspector-hover', false);
77523
77524                   if (inspector.entityID() !== id || inspector.state() !== 'select') {
77525                       inspector
77526                           .state('select')
77527                           .entityID(id)
77528                           .newFeature(newFeature);
77529
77530                       inspectorWrap
77531                           .call(inspector, newFeature);
77532                   }
77533
77534                   sidebar.showPresetList = function() {
77535                       inspector.showList(context.presets().match(entity, context.graph()));
77536                   };
77537
77538               } else {
77539                   inspector
77540                       .state('hide');
77541               }
77542           };
77543
77544
77545           sidebar.show = function(component, element) {
77546               featureListWrap
77547                   .classed('inspector-hidden', true);
77548               inspectorWrap
77549                   .classed('inspector-hidden', true);
77550
77551               if (_current) _current.remove();
77552               _current = selection
77553                   .append('div')
77554                   .attr('class', 'sidebar-component')
77555                   .call(component, element);
77556           };
77557
77558
77559           sidebar.hide = function() {
77560               featureListWrap
77561                   .classed('inspector-hidden', false);
77562               inspectorWrap
77563                   .classed('inspector-hidden', true);
77564
77565               if (_current) _current.remove();
77566               _current = null;
77567           };
77568
77569
77570           sidebar.expand = function(moveMap) {
77571               if (selection.classed('collapsed')) {
77572                   sidebar.toggle(moveMap);
77573               }
77574           };
77575
77576
77577           sidebar.collapse = function(moveMap) {
77578               if (!selection.classed('collapsed')) {
77579                   sidebar.toggle(moveMap);
77580               }
77581           };
77582
77583
77584           sidebar.toggle = function(moveMap) {
77585               var e = event;
77586               if (e && e.sourceEvent) {
77587                   e.sourceEvent.preventDefault();
77588               } else if (e) {
77589                   e.preventDefault();
77590               }
77591
77592               // Don't allow sidebar to toggle when the user is in the walkthrough.
77593               if (context.inIntro()) return;
77594
77595               var isCollapsed = selection.classed('collapsed');
77596               var isCollapsing = !isCollapsed;
77597               var isRTL = (textDirection === 'rtl');
77598               var scaleX = isRTL ? 0 : 1;
77599               var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
77600
77601               sidebarWidth = selection.node().getBoundingClientRect().width;
77602
77603               // switch from % to px
77604               selection.style('width', sidebarWidth + 'px');
77605
77606               var startMargin, endMargin, lastMargin;
77607               if (isCollapsing) {
77608                   startMargin = lastMargin = 0;
77609                   endMargin = -sidebarWidth;
77610               } else {
77611                   startMargin = lastMargin = -sidebarWidth;
77612                   endMargin = 0;
77613               }
77614
77615               selection.transition()
77616                   .style(xMarginProperty, endMargin + 'px')
77617                   .tween('panner', function() {
77618                       var i = interpolateNumber(startMargin, endMargin);
77619                       return function(t) {
77620                           var dx = lastMargin - Math.round(i(t));
77621                           lastMargin = lastMargin - dx;
77622                           context.ui().onResize(moveMap ? undefined : [dx * scaleX, 0]);
77623                       };
77624                   })
77625                   .on('end', function() {
77626                       selection.classed('collapsed', isCollapsing);
77627
77628                       // switch back from px to %
77629                       if (!isCollapsing) {
77630                           var containerWidth = container.node().getBoundingClientRect().width;
77631                           var widthPct = (sidebarWidth / containerWidth) * 100;
77632                           selection
77633                               .style(xMarginProperty, null)
77634                               .style('width', widthPct + '%');
77635                       }
77636                   });
77637           };
77638
77639           // toggle the sidebar collapse when double-clicking the resizer
77640           resizer.on('dblclick', sidebar.toggle);
77641       }
77642
77643       sidebar.showPresetList = function() {};
77644       sidebar.hover = function() {};
77645       sidebar.hover.cancel = function() {};
77646       sidebar.intersects = function() {};
77647       sidebar.select = function() {};
77648       sidebar.show = function() {};
77649       sidebar.hide = function() {};
77650       sidebar.expand = function() {};
77651       sidebar.collapse = function() {};
77652       sidebar.toggle = function() {};
77653
77654       return sidebar;
77655   }
77656
77657   function uiSpinner(context) {
77658       var osm = context.connection();
77659
77660
77661       return function(selection) {
77662           var img = selection
77663               .append('img')
77664               .attr('src', context.imagePath('loader-black.gif'))
77665               .style('opacity', 0);
77666
77667           if (osm) {
77668               osm
77669                   .on('loading.spinner', function() {
77670                       img.transition()
77671                           .style('opacity', 1);
77672                   })
77673                   .on('loaded.spinner', function() {
77674                       img.transition()
77675                           .style('opacity', 0);
77676                   });
77677           }
77678       };
77679   }
77680
77681   function uiSplash(context) {
77682
77683       return function(selection) {
77684           if (context.storage('sawSplash'))
77685                return;
77686
77687           context.storage('sawSplash', true);
77688
77689           var modalSelection = uiModal(selection);
77690
77691           modalSelection.select('.modal')
77692               .attr('class', 'modal-splash modal col6');
77693
77694           var introModal = modalSelection.select('.content')
77695               .append('div')
77696               .attr('class', 'fillL');
77697
77698           introModal
77699               .append('div')
77700               .attr('class','modal-section cf')
77701               .append('h3').text(t('splash.welcome'));
77702
77703           introModal
77704               .append('div')
77705               .attr('class','modal-section')
77706               .append('p')
77707               .html(t('splash.text', {
77708                   version: context.version,
77709                   website: '<a href="http://ideditor.com/">ideditor.com</a>',
77710                   github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
77711               }));
77712
77713           var buttonWrap = introModal
77714               .append('div')
77715               .attr('class', 'modal-actions cf');
77716
77717           var walkthrough = buttonWrap
77718               .append('button')
77719               .attr('class', 'walkthrough col6')
77720               .on('click', function() {
77721                   context.container().call(uiIntro(context));
77722                   modalSelection.close();
77723               });
77724
77725           walkthrough
77726               .append('svg')
77727               .attr('class', 'logo logo-walkthrough')
77728               .append('use')
77729               .attr('xlink:href', '#iD-logo-walkthrough');
77730
77731           walkthrough
77732               .append('div')
77733               .text(t('splash.walkthrough'));
77734
77735           var startEditing = buttonWrap
77736               .append('button')
77737               .attr('class', 'start-editing col6')
77738               .on('click', modalSelection.close);
77739
77740           startEditing
77741               .append('svg')
77742               .attr('class', 'logo logo-features')
77743               .append('use')
77744               .attr('xlink:href', '#iD-logo-features');
77745
77746           startEditing
77747               .append('div')
77748               .text(t('splash.start'));
77749
77750
77751           modalSelection.select('button.close')
77752               .attr('class','hide');
77753
77754       };
77755   }
77756
77757   function uiStatus(context) {
77758       var osm = context.connection();
77759
77760
77761       return function(selection) {
77762           if (!osm) return;
77763
77764           function update() {
77765               osm.status(function(err, apiStatus) {
77766                   selection.html('');
77767
77768                   if (err) {
77769                       if (apiStatus === 'connectionSwitched') {
77770                           // if the connection was just switched, we can't rely on
77771                           // the status (we're getting the status of the previous api)
77772                           return;
77773
77774                       } else if (apiStatus === 'rateLimited') {
77775                           selection
77776                               .text(t('status.rateLimit'))
77777                               .append('a')
77778                               .attr('class', 'api-status-login')
77779                               .attr('target', '_blank')
77780                               .call(svgIcon('#iD-icon-out-link', 'inline'))
77781                               .append('span')
77782                               .text(t('login'))
77783                               .on('click.login', function() {
77784                                   event.preventDefault();
77785                                   osm.authenticate();
77786                               });
77787                       } else {
77788                           // eslint-disable-next-line no-warning-comments
77789                           // TODO: nice messages for different error types
77790                           selection.text(t('status.error'));
77791                       }
77792
77793                   } else if (apiStatus === 'readonly') {
77794                       selection.text(t('status.readonly'));
77795                   } else if (apiStatus === 'offline') {
77796                       selection.text(t('status.offline'));
77797                   }
77798
77799                   selection.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
77800               });
77801           }
77802
77803           osm.on('change', function() { update(selection); });
77804
77805           window.setInterval(update, 90000);
77806           update(selection);
77807       };
77808   }
77809
77810   function uiUndoRedo(context) {
77811       var commands = [{
77812           id: 'undo',
77813           cmd: uiCmd('⌘Z'),
77814           action: function() { if (editable()) context.undo(); },
77815           annotation: function() { return context.history().undoAnnotation(); }
77816       }, {
77817           id: 'redo',
77818           cmd: uiCmd('⌘⇧Z'),
77819           action: function() { if (editable()) context.redo(); },
77820           annotation: function() { return context.history().redoAnnotation(); }
77821       }];
77822
77823
77824       function editable() {
77825           var mode = context.mode();
77826           return context.editable() && mode && mode.id !== 'save';
77827       }
77828
77829
77830       return function(selection) {
77831           var tooltipBehavior = tooltip()
77832               .placement('bottom')
77833               .html(true)
77834               .title(function (d) {
77835                   return uiTooltipHtml(d.annotation() ?
77836                       t(d.id + '.tooltip', {action: d.annotation()}) :
77837                       t(d.id + '.nothing'), d.cmd);
77838               });
77839
77840           var buttons = selection.selectAll('button')
77841               .data(commands)
77842               .enter()
77843               .append('button')
77844               .attr('class', function(d) { return 'disabled ' + d.id + '-button'; })
77845               .on('click', function(d) { return d.action(); })
77846               .call(tooltipBehavior);
77847
77848           buttons.each(function(d) {
77849               var iconName = d.id;
77850               if (textDirection === 'rtl') {
77851                   if (iconName === 'undo') {
77852                       iconName = 'redo';
77853                   } else if (iconName === 'redo') {
77854                       iconName = 'undo';
77855                   }
77856               }
77857               select(this)
77858                   .call(svgIcon('#iD-icon-' + iconName));
77859           });
77860
77861           context.keybinding()
77862               .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
77863               .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
77864
77865
77866           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
77867
77868           context.map()
77869               .on('move.undo_redo', debouncedUpdate)
77870               .on('drawn.undo_redo', debouncedUpdate);
77871
77872           context.history()
77873               .on('change.undo_redo', update);
77874
77875           context
77876               .on('enter.undo_redo', update);
77877
77878
77879           function update() {
77880               buttons
77881                   .property('disabled', !editable())
77882                   .classed('disabled', function(d) { return !d.annotation(); })
77883                   .each(function() {
77884                       var selection = select(this);
77885                       if (selection.property('tooltipVisible')) {
77886                           selection.call(tooltipBehavior.show);
77887                       }
77888                   });
77889           }
77890       };
77891   }
77892
77893   // these are module variables so they are preserved through a ui.restart()
77894   var sawVersion = null;
77895   var isNewVersion = false;
77896   var isNewUser = false;
77897
77898
77899   function uiVersion(context) {
77900
77901       var currVersion = context.version;
77902       var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/);
77903
77904       if (sawVersion === null && matchedVersion !== null) {
77905           isNewVersion = (context.storage('sawVersion') !== currVersion);
77906           isNewUser = !context.storage('sawSplash');
77907           context.storage('sawVersion', currVersion);
77908           sawVersion = currVersion;
77909       }
77910
77911       return function(selection) {
77912           selection
77913               .append('a')
77914               .attr('target', '_blank')
77915               .attr('tabindex', -1)
77916               .attr('href', 'https://github.com/openstreetmap/iD')
77917               .text(currVersion);
77918
77919           // only show new version indicator to users that have used iD before
77920           if (isNewVersion && !isNewUser) {
77921               selection
77922                   .append('div')
77923                   .attr('class', 'badge')
77924                   .append('a')
77925                   .attr('target', '_blank')
77926                   .attr('tabindex', -1)
77927                   .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
77928                   .call(svgIcon('#maki-gift-11'))
77929                   .call(tooltip()
77930                       .title(t('version.whats_new', { version: currVersion }))
77931                       .placement('top')
77932                   );
77933           }
77934       };
77935   }
77936
77937   function uiZoom(context) {
77938       var zooms = [{
77939           id: 'zoom-in',
77940           icon: 'plus',
77941           title: t('zoom.in'),
77942           action: context.zoomIn,
77943           key: '+'
77944       }, {
77945           id: 'zoom-out',
77946           icon: 'minus',
77947           title: t('zoom.out'),
77948           action: context.zoomOut,
77949           key: '-'
77950       }];
77951
77952
77953       function zoomIn() {
77954           event.preventDefault();
77955           context.zoomIn();
77956       }
77957
77958
77959       function zoomOut() {
77960           event.preventDefault();
77961           context.zoomOut();
77962       }
77963
77964
77965       function zoomInFurther() {
77966           event.preventDefault();
77967           context.zoomInFurther();
77968       }
77969
77970
77971       function zoomOutFurther() {
77972           event.preventDefault();
77973           context.zoomOutFurther();
77974       }
77975
77976
77977       return function(selection) {
77978           var button = selection.selectAll('button')
77979               .data(zooms)
77980               .enter()
77981               .append('button')
77982               .attr('tabindex', -1)
77983               .attr('class', function(d) { return d.id; })
77984               .on('click.editor', function(d) { d.action(); })
77985               .call(tooltip()
77986                   .placement((textDirection === 'rtl') ? 'right' : 'left')
77987                   .html(true)
77988                   .title(function(d) {
77989                       return uiTooltipHtml(d.title, d.key);
77990                   })
77991               );
77992
77993           button.each(function(d) {
77994               select(this)
77995                   .call(svgIcon('#iD-icon-' + d.icon, 'light'));
77996           });
77997
77998           ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
77999               context.keybinding().on([key], zoomIn);
78000               context.keybinding().on([uiCmd('⌘' + key)], zoomInFurther);
78001           });
78002
78003           ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
78004               context.keybinding().on([key], zoomOut);
78005               context.keybinding().on([uiCmd('⌘' + key)], zoomOutFurther);
78006           });
78007       };
78008   }
78009
78010   function uiInit(context) {
78011       var _initCounter = 0;
78012       var _initCallback;
78013       var _needWidth = {};
78014
78015
78016       function render(container) {
78017           container
78018               .attr('dir', textDirection);
78019
78020           var map = context.map();
78021
78022           container
78023               .append('svg')
78024               .attr('id', 'defs')
78025               .call(svgDefs(context));
78026
78027           container
78028               .append('div')
78029               .attr('id', 'sidebar')
78030               .call(ui.sidebar);
78031
78032           var content = container
78033               .append('div')
78034               .attr('id', 'content')
78035               .attr('class', 'active');
78036
78037           // Top toolbar
78038           var bar = content
78039               .append('div')
78040               .attr('id', 'bar')
78041               .attr('class', 'fillD');
78042
78043           content
78044               .append('div')
78045               .attr('id', 'map')
78046               .attr('dir', 'ltr')
78047               .call(map);
78048
78049           // Leading area button group (Sidebar toggle)
78050           var leadingArea = bar
78051               .append('div')
78052               .attr('class', 'tool-group leading-area');
78053
78054           var sidebarButton = leadingArea
78055               .append('div')
78056               .append('button')
78057               .attr('class', 'sidebar-toggle')
78058               .attr('tabindex', -1)
78059               .on('click', ui.sidebar.toggle)
78060               .call(tooltip()
78061                   .placement('bottom')
78062                   .html(true)
78063                   .title(uiTooltipHtml(t('sidebar.tooltip'), t('sidebar.key')))
78064               );
78065
78066           var iconSuffix = textDirection === 'rtl' ? 'right' : 'left';
78067           sidebarButton
78068               .call(svgIcon('#iD-icon-sidebar-' + iconSuffix));
78069
78070           leadingArea
78071               .append('div')
78072               .attr('class', 'full-screen bar-group')
78073               .call(uiFullScreen(context));
78074
78075
78076           // Center area button group (Point/Line/Area/Note mode buttons)
78077           bar
78078               .append('div')
78079               .attr('class', 'tool-group center-area')
78080               .append('div')
78081               .attr('class', 'modes joined')
78082               .call(uiModes(context), bar);
78083
78084
78085           // Trailing area button group (Undo/Redo save buttons)
78086           var trailingArea = bar
78087               .append('div')
78088               .attr('class', 'tool-group trailing-area');
78089
78090           trailingArea
78091               .append('div')
78092               .attr('class', 'joined')
78093               .call(uiUndoRedo(context));
78094
78095           trailingArea
78096               .append('div')
78097               .attr('class', 'save-wrap')
78098               .call(uiSave(context));
78099
78100
78101           // For now, just put spinner at the end of the #bar
78102           bar
78103               .append('div')
78104               .attr('class', 'spinner')
78105               .call(uiSpinner(context));
78106
78107
78108           // Map controls (appended to #bar, but absolutely positioned)
78109           var controls = content
78110               .append('div')
78111               .attr('class', 'map-controls');
78112
78113           controls
78114               .append('div')
78115               .attr('class', 'map-control zoombuttons')
78116               .call(uiZoom(context));
78117
78118           controls
78119               .append('div')
78120               .attr('class', 'map-control geolocate-control')
78121               .call(uiGeolocate(context));
78122
78123           var background = uiBackground(context);
78124           controls
78125               .append('div')
78126               .attr('class', 'map-control background-control')
78127               .call(background.renderToggleButton);
78128           content.call(background.renderPane);
78129
78130           var mapData = uiMapData(context);
78131           controls
78132               .append('div')
78133               .attr('class', 'map-control map-data-control')
78134               .call(mapData.renderToggleButton);
78135           content.call(mapData.renderPane);
78136
78137           var issues = uiIssues(context);
78138           controls
78139               .append('div')
78140               .attr('class', 'map-control map-issues-control')
78141               .call(issues.renderToggleButton);
78142           content.call(issues.renderPane);
78143
78144           var help = uiHelp(context);
78145           controls
78146               .append('div')
78147               .attr('class', 'map-control help-control')
78148               .call(help.renderToggleButton);
78149           content.call(help.renderPane);
78150
78151
78152           // Add attribution and footer
78153           var about = content
78154               .append('div')
78155               .attr('id', 'about');
78156
78157           about
78158               .append('div')
78159               .attr('id', 'attrib')
78160               .attr('dir', 'ltr')
78161               .call(uiAttribution(context));
78162
78163           about
78164               .append('div')
78165               .attr('class', 'api-status')
78166               .call(uiStatus(context));
78167
78168
78169           var footer = about
78170               .append('div')
78171               .attr('id', 'footer')
78172               .attr('class', 'fillD');
78173
78174           footer
78175               .append('div')
78176               .attr('id', 'flash-wrap')
78177               .attr('class', 'footer-hide');
78178
78179           var footerWrap = footer
78180               .append('div')
78181               .attr('id', 'footer-wrap')
78182               .attr('class', 'footer-show');
78183
78184           footerWrap
78185               .append('div')
78186               .attr('id', 'scale-block')
78187               .call(uiScale(context));
78188
78189           var aboutList = footerWrap
78190               .append('div')
78191               .attr('id', 'info-block')
78192               .append('ul')
78193               .attr('id', 'about-list');
78194
78195           if (!context.embed()) {
78196               aboutList
78197                   .call(uiAccount(context));
78198           }
78199
78200           aboutList
78201               .append('li')
78202               .attr('class', 'version')
78203               .call(uiVersion(context));
78204
78205           var issueLinks = aboutList
78206               .append('li');
78207
78208           issueLinks
78209               .append('a')
78210               .attr('target', '_blank')
78211               .attr('tabindex', -1)
78212               .attr('href', 'https://github.com/openstreetmap/iD/issues')
78213               .call(svgIcon('#iD-icon-bug', 'light'))
78214               .call(tooltip().title(t('report_a_bug')).placement('top'));
78215
78216           issueLinks
78217               .append('a')
78218               .attr('target', '_blank')
78219               .attr('tabindex', -1)
78220               .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
78221               .call(svgIcon('#iD-icon-translate', 'light'))
78222               .call(tooltip().title(t('help_translate')).placement('top'));
78223
78224           aboutList
78225               .append('li')
78226               .attr('class', 'feature-warning')
78227               .attr('tabindex', -1)
78228               .call(uiFeatureInfo(context));
78229
78230           aboutList
78231               .append('li')
78232               .attr('class', 'user-list')
78233               .attr('tabindex', -1)
78234               .call(uiContributors(context));
78235
78236
78237           // Setup map dimensions and move map to initial center/zoom.
78238           // This should happen after #content and toolbars exist.
78239           ui.onResize();
78240
78241           var hash = behaviorHash(context);
78242           hash();
78243           if (!hash.hadHash) {
78244               map.centerZoom([0, 0], 2);
78245           }
78246
78247
78248           // Add absolutely-positioned elements that sit on top of the map
78249           // This should happen after the map is ready (center/zoom)
78250           content
78251               .call(uiMapInMap(context))
78252               .call(uiInfo(context))
78253               .call(uiNotice(context));
78254
78255           content
78256               .append('div')
78257               .attr('id', 'photoviewer')
78258               .classed('al', true)       // 'al'=left,  'ar'=right
78259               .classed('hide', true)
78260               .call(ui.photoviewer);
78261
78262
78263           // Bind events
78264           window.onbeforeunload = function() {
78265               return context.save();
78266           };
78267           window.onunload = function() {
78268               context.history().unlock();
78269           };
78270
78271           select(window)
78272               .on('gesturestart.editor', eventCancel)
78273               .on('gesturechange.editor', eventCancel)
78274               .on('gestureend.editor', eventCancel)
78275               .on('resize.editor', ui.onResize);
78276
78277
78278           var panPixels = 80;
78279           context.keybinding()
78280               .on('⌫', function() { event.preventDefault(); })
78281               .on([t('sidebar.key'), '`', '²'], ui.sidebar.toggle)   // #5663 - common QWERTY, AZERTY
78282               .on('←', pan([panPixels, 0]))
78283               .on('↑', pan([0, panPixels]))
78284               .on('→', pan([-panPixels, 0]))
78285               .on('↓', pan([0, -panPixels]))
78286               .on(['⇧←', uiCmd('⌘←')], pan([map.dimensions()[0], 0]))
78287               .on(['⇧↑', uiCmd('⌘↑')], pan([0, map.dimensions()[1]]))
78288               .on(['⇧→', uiCmd('⌘→')], pan([-map.dimensions()[0], 0]))
78289               .on(['⇧↓', uiCmd('⌘↓')], pan([0, -map.dimensions()[1]]));
78290
78291           context.enter(modeBrowse(context));
78292
78293           if (!_initCounter++) {
78294               if (!hash.startWalkthrough) {
78295                   context.container()
78296                       .call(uiSplash(context))
78297                       .call(uiRestore(context));
78298               }
78299
78300               context.container()
78301                   .call(uiShortcuts(context));
78302           }
78303
78304           var osm = context.connection();
78305           var auth = uiLoading(context).message(t('loading_auth')).blocking(true);
78306
78307           if (osm && auth) {
78308               osm
78309                   .on('authLoading.ui', function() {
78310                       context.container()
78311                           .call(auth);
78312                   })
78313                   .on('authDone.ui', function() {
78314                       auth.close();
78315                   });
78316           }
78317
78318           _initCounter++;
78319
78320           if (hash.startWalkthrough) {
78321               hash.startWalkthrough = false;
78322               context.container().call(uiIntro(context));
78323           }
78324
78325
78326           function pan(d) {
78327               return function() {
78328                   if (select('.combobox').size()) return;
78329                   event.preventDefault();
78330                   context.pan(d, 100);
78331               };
78332           }
78333
78334           function eventCancel() {
78335               event.preventDefault();
78336           }
78337       }
78338
78339
78340       function ui(node, callback) {
78341           _initCallback = callback;
78342           var container = select(node);
78343           context.container(container);
78344           context.loadLocale(function(err) {
78345               if (!err) {
78346                   render(container);
78347               }
78348               if (callback) {
78349                   callback(err);
78350               }
78351           });
78352       }
78353
78354
78355       ui.restart = function(arg) {
78356           context.keybinding().clear();
78357           context.locale(arg);
78358           context.loadLocale(function(err) {
78359               if (!err) {
78360                   context.container().selectAll('*').remove();
78361                   render(context.container());
78362                   if (_initCallback) _initCallback();
78363               }
78364           });
78365       };
78366
78367
78368       ui.sidebar = uiSidebar(context);
78369
78370       ui.photoviewer = uiPhotoviewer(context);
78371
78372       ui.onResize = function(withPan) {
78373           var map = context.map();
78374
78375           // Recalc dimensions of map and sidebar.. (`true` = force recalc)
78376           // This will call `getBoundingClientRect` and trigger reflow,
78377           //  but the values will be cached for later use.
78378           var mapDimensions = utilGetDimensions(select('#content'), true);
78379           utilGetDimensions(select('#sidebar'), true);
78380
78381           if (withPan !== undefined) {
78382               map.redrawEnable(false);
78383               map.pan(withPan);
78384               map.redrawEnable(true);
78385           }
78386           map.dimensions(mapDimensions);
78387
78388           ui.photoviewer.onMapResize();
78389
78390           // check if header or footer have overflowed
78391           ui.checkOverflow('#bar');
78392           ui.checkOverflow('#footer');
78393
78394           // Use outdated code so it works on Explorer
78395           var resizeWindowEvent = document.createEvent('Event');
78396
78397           resizeWindowEvent.initEvent('resizeWindow', true, true);
78398
78399           document.dispatchEvent(resizeWindowEvent);
78400       };
78401
78402
78403       // Call checkOverflow when resizing or whenever the contents change.
78404       ui.checkOverflow = function(selector, reset) {
78405           if (reset) {
78406               delete _needWidth[selector];
78407           }
78408
78409           var element = select(selector);
78410           var scrollWidth = element.property('scrollWidth');
78411           var clientWidth = element.property('clientWidth');
78412           var needed = _needWidth[selector] || scrollWidth;
78413
78414           if (scrollWidth > clientWidth) {    // overflow happening
78415               element.classed('narrow', true);
78416               if (!_needWidth[selector]) {
78417                   _needWidth[selector] = scrollWidth;
78418               }
78419
78420           } else if (scrollWidth >= needed) {
78421               element.classed('narrow', false);
78422           }
78423       };
78424
78425
78426       return ui;
78427   }
78428
78429   function uiChangesetEditor(context) {
78430       var dispatch$1 = dispatch('change');
78431       var formFields = uiFormFields(context);
78432       var commentCombo = uiCombobox(context, 'comment').caseSensitive(true);
78433       var _fieldsArr;
78434       var _tags;
78435       var _changesetID;
78436
78437
78438       function changesetEditor(selection) {
78439           render(selection);
78440       }
78441
78442
78443       function render(selection) {
78444           var initial = false;
78445
78446           if (!_fieldsArr) {
78447               initial = true;
78448               var presets = context.presets();
78449
78450               _fieldsArr = [
78451                   uiField(context, presets.field('comment'), null, { show: true, revert: false }),
78452                   uiField(context, presets.field('source'), null, { show: false, revert: false }),
78453                   uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
78454               ];
78455
78456               _fieldsArr.forEach(function(field) {
78457                   field
78458                       .on('change', function(t, onInput) {
78459                           dispatch$1.call('change', field, t, onInput);
78460                       });
78461               });
78462           }
78463
78464           _fieldsArr.forEach(function(field) {
78465               field
78466                   .tags(_tags);
78467           });
78468
78469
78470           selection
78471               .call(formFields.fieldsArr(_fieldsArr));
78472
78473
78474           if (initial) {
78475               var commentField = selection.select('#preset-input-comment');
78476               var commentNode = commentField.node();
78477
78478               if (commentNode) {
78479                   commentNode.focus();
78480                   commentNode.select();
78481               }
78482
78483               // trigger a 'blur' event so that comment field can be cleaned
78484               // and checked for hashtags, even if retrieved from localstorage
78485               utilTriggerEvent(commentField, 'blur');
78486
78487               var osm = context.connection();
78488               if (osm) {
78489                   osm.userChangesets(function (err, changesets) {
78490                       if (err) return;
78491
78492                       var comments = changesets.map(function(changeset) {
78493                           return {
78494                               title: changeset.tags.comment,
78495                               value: changeset.tags.comment
78496                           };
78497                       });
78498
78499                       commentField
78500                           .call(commentCombo
78501                               .data(uniqBy(comments, 'title'))
78502                           );
78503                   });
78504               }
78505           }
78506
78507           // Add warning if comment mentions Google
78508           var hasGoogle = _tags.comment.match(/google/i);
78509           var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
78510               .data(hasGoogle ? [0] : []);
78511
78512           commentWarning.exit()
78513               .transition()
78514               .duration(200)
78515               .style('opacity', 0)
78516               .remove();
78517
78518           var commentEnter = commentWarning.enter()
78519               .insert('div', '.tag-reference-body')
78520               .attr('class', 'field-warning comment-warning')
78521               .style('opacity', 0);
78522
78523           commentEnter
78524               .append('a')
78525               .attr('target', '_blank')
78526               .attr('tabindex', -1)
78527               .call(svgIcon('#iD-icon-alert', 'inline'))
78528               .attr('href', t('commit.google_warning_link'))
78529               .append('span')
78530               .text(t('commit.google_warning'));
78531
78532           commentEnter
78533               .transition()
78534               .duration(200)
78535               .style('opacity', 1);
78536       }
78537
78538
78539       changesetEditor.tags = function(_) {
78540           if (!arguments.length) return _tags;
78541           _tags = _;
78542           // Don't reset _fieldsArr here.
78543           return changesetEditor;
78544       };
78545
78546
78547       changesetEditor.changesetID = function(_) {
78548           if (!arguments.length) return _changesetID;
78549           if (_changesetID === _) return changesetEditor;
78550           _changesetID = _;
78551           _fieldsArr = null;
78552           return changesetEditor;
78553       };
78554
78555
78556       return utilRebind(changesetEditor, dispatch$1, 'on');
78557   }
78558
78559   // This code assumes that the combobox values will not have duplicate entries.
78560   // It is keyed on the `value` of the entry. Data should be an array of objects like:
78561   //   [{
78562   //       value:  'display text',  // required
78563   //       title:  'hover text'     // optional
78564   //   }, ...]
78565
78566   var _comboHideTimerID;
78567
78568   function uiCombobox(context, klass) {
78569       var dispatch$1 = dispatch('accept', 'cancel');
78570       var container = context.container();
78571
78572       var _suggestions = [];
78573       var _data = [];
78574       var _fetched = {};
78575       var _selected = null;
78576       var _canAutocomplete = true;
78577       var _caseSensitive = false;
78578       var _cancelFetch = false;
78579       var _minItems = 2;
78580       var _tDown = 0;
78581
78582       var _fetcher = function(val, cb) {
78583           cb(_data.filter(function(d) {
78584               return d.value
78585                   .toString()
78586                   .toLowerCase()
78587                   .indexOf(val.toLowerCase()) !== -1;
78588           }));
78589       };
78590
78591       var combobox = function(input, attachTo) {
78592           if (!input || input.empty()) return;
78593
78594           input
78595               .classed('combobox-input', true)
78596               .on('focus.combo-input', focus)
78597               .on('blur.combo-input', blur)
78598               .on('keydown.combo-input', keydown)
78599               .on('keyup.combo-input', keyup)
78600               .on('input.combo-input', change)
78601               .on('mousedown.combo-input', mousedown)
78602               .each(function() {
78603                   var parent = this.parentNode;
78604                   var sibling = this.nextSibling;
78605
78606                   select(parent).selectAll('.combobox-caret')
78607                       .filter(function(d) { return d === input.node(); })
78608                       .data([input.node()])
78609                       .enter()
78610                       .insert('div', function() { return sibling; })
78611                       .attr('class', 'combobox-caret')
78612                       .on('mousedown.combo-caret', function() {
78613                           event.preventDefault(); // don't steal focus from input
78614                           input.node().focus(); // focus the input as if it was clicked
78615                           mousedown();
78616                       })
78617                       .on('mouseup.combo-caret', function() {
78618                           event.preventDefault(); // don't steal focus from input
78619                           mouseup();
78620                       });
78621               });
78622
78623
78624           function mousedown() {
78625               if (event.button !== 0) return;    // left click only
78626               _tDown = +new Date();
78627
78628               // clear selection
78629               var start = input.property('selectionStart');
78630               var end = input.property('selectionEnd');
78631               if (start !== end) {
78632                   var val = utilGetSetValue(input);
78633                   input.node().setSelectionRange(val.length, val.length);
78634                   return;
78635               }
78636
78637               input.on('mouseup.combo-input', mouseup);
78638           }
78639
78640
78641           function mouseup() {
78642               input.on('mouseup.combo-input', null);
78643               if (event.button !== 0) return;    // left click only
78644               if (input.node() !== document.activeElement) return;   // exit if this input is not focused
78645
78646               var start = input.property('selectionStart');
78647               var end = input.property('selectionEnd');
78648               if (start !== end) return;  // exit if user is selecting
78649
78650               // not showing or showing for a different field - try to show it.
78651               var combo = container.selectAll('.combobox');
78652               if (combo.empty() || combo.datum() !== input.node()) {
78653                   var tOrig = _tDown;
78654                   window.setTimeout(function() {
78655                       if (tOrig !== _tDown) return;   // exit if user double clicked
78656                       fetch('', function() {
78657                           show();
78658                           render();
78659                       });
78660                   }, 250);
78661
78662               } else {
78663                   hide();
78664               }
78665           }
78666
78667
78668           function focus() {
78669               fetch('');   // prefetch values (may warm taginfo cache)
78670           }
78671
78672
78673           function blur() {
78674               _comboHideTimerID = window.setTimeout(hide, 75);
78675           }
78676
78677
78678           function show() {
78679               hide();   // remove any existing
78680
78681               container
78682                   .insert('div', ':first-child')
78683                   .datum(input.node())
78684                   .attr('class', 'combobox' + (klass ? ' combobox-' + klass : ''))
78685                   .style('position', 'absolute')
78686                   .style('display', 'block')
78687                   .style('left', '0px')
78688                   .on('mousedown.combo-container', function () {
78689                       // prevent moving focus out of the input field
78690                       event.preventDefault();
78691                   });
78692
78693               select('body')
78694                   .on('scroll.combo-scroll', render, true);
78695           }
78696
78697
78698           function hide() {
78699               if (_comboHideTimerID) {
78700                   window.clearTimeout(_comboHideTimerID);
78701                   _comboHideTimerID = undefined;
78702               }
78703
78704               container.selectAll('.combobox')
78705                   .remove();
78706
78707               select('body')
78708                   .on('scroll.combo-scroll', null);
78709           }
78710
78711
78712           function keydown() {
78713               var shown = !container.selectAll('.combobox').empty();
78714               var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
78715
78716               switch (event.keyCode) {
78717                   case 8:   // ⌫ Backspace
78718                   case 46:  // ⌦ Delete
78719                       event.stopPropagation();
78720                       _selected = null;
78721                       render();
78722                       input.on('input.combo-input', function() {
78723                           var start = input.property('selectionStart');
78724                           input.node().setSelectionRange(start, start);
78725                           input.on('input.combo-input', change);
78726                       });
78727                       break;
78728
78729                   case 9:   // ⇥ Tab
78730                       accept();
78731                       break;
78732
78733                   case 13:  // ↩ Return
78734                       event.preventDefault();
78735                       event.stopPropagation();
78736                       break;
78737
78738                   case 38:  // ↑ Up arrow
78739                       if (tagName === 'textarea' && !shown) return;
78740                       event.preventDefault();
78741                       if (tagName === 'input' && !shown) {
78742                           show();
78743                       }
78744                       nav(-1);
78745                       break;
78746
78747                   case 40:  // ↓ Down arrow
78748                       if (tagName === 'textarea' && !shown) return;
78749                       event.preventDefault();
78750                       if (tagName === 'input' && !shown) {
78751                           show();
78752                       }
78753                       nav(+1);
78754                       break;
78755               }
78756           }
78757
78758
78759           function keyup() {
78760               switch (event.keyCode) {
78761                   case 27:  // ⎋ Escape
78762                       cancel();
78763                       break;
78764
78765                   case 13:  // ↩ Return
78766                       accept();
78767                       break;
78768               }
78769           }
78770
78771
78772           // Called whenever the input value is changed (e.g. on typing)
78773           function change() {
78774               fetch(value(), function() {
78775                   _selected = null;
78776                   var val = input.property('value');
78777
78778                   if (_suggestions.length) {
78779                       if (input.property('selectionEnd') === val.length) {
78780                           _selected = tryAutocomplete();
78781                       }
78782
78783                       if (!_selected) {
78784                           _selected = val;
78785                       }
78786                   }
78787
78788                   if (val.length) {
78789                       var combo = container.selectAll('.combobox');
78790                       if (combo.empty()) {
78791                           show();
78792                       }
78793                   } else {
78794                       hide();
78795                   }
78796
78797                   render();
78798               });
78799           }
78800
78801
78802           // Called when the user presses up/down arrows to navigate the list
78803           function nav(dir) {
78804               if (_suggestions.length) {
78805                   // try to determine previously selected index..
78806                   var index = -1;
78807                   for (var i = 0; i < _suggestions.length; i++) {
78808                       if (_selected && _suggestions[i].value === _selected) {
78809                           index = i;
78810                           break;
78811                       }
78812                   }
78813
78814                   // pick new _selected
78815                   index = Math.max(Math.min(index + dir, _suggestions.length - 1), 0);
78816                   _selected = _suggestions[index].value;
78817                   input.property('value', _selected);
78818               }
78819
78820               render();
78821               ensureVisible();
78822           }
78823
78824
78825           function ensureVisible() {
78826               var combo = container.selectAll('.combobox');
78827               if (combo.empty()) return;
78828
78829               var containerRect = container.node().getBoundingClientRect();
78830               var comboRect = combo.node().getBoundingClientRect();
78831
78832               if (comboRect.bottom > containerRect.bottom) {
78833                   var node = attachTo ? attachTo.node() : input.node();
78834                   node.scrollIntoView({ behavior: 'instant', block: 'center' });
78835                   render();
78836               }
78837
78838               // https://stackoverflow.com/questions/11039885/scrollintoview-causing-the-whole-page-to-move
78839               var selected = combo.selectAll('.combobox-option.selected').node();
78840               if (selected) {
78841                   selected.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
78842               }
78843           }
78844
78845
78846           function value() {
78847               var value = input.property('value');
78848               var start = input.property('selectionStart');
78849               var end = input.property('selectionEnd');
78850
78851               if (start && end) {
78852                   value = value.substring(0, start);
78853               }
78854
78855               return value;
78856           }
78857
78858
78859           function fetch(v, cb) {
78860               _cancelFetch = false;
78861
78862               _fetcher.call(input, v, function(results) {
78863                   // already chose a value, don't overwrite or autocomplete it
78864                   if (_cancelFetch) return;
78865
78866                   _suggestions = results;
78867                   results.forEach(function(d) { _fetched[d.value] = d; });
78868
78869                   if (cb) {
78870                       cb();
78871                   }
78872               });
78873           }
78874
78875
78876           function tryAutocomplete() {
78877               if (!_canAutocomplete) return;
78878
78879               var val = _caseSensitive ? value() : value().toLowerCase();
78880               if (!val) return;
78881
78882               // Don't autocomplete if user is typing a number - #4935
78883               if (!isNaN(parseFloat(val)) && isFinite(val)) return;
78884
78885               var bestIndex = -1;
78886               for (var i = 0; i < _suggestions.length; i++) {
78887                   var suggestion = _suggestions[i].value;
78888                   var compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
78889
78890                   // if search string matches suggestion exactly, pick it..
78891                   if (compare === val) {
78892                       bestIndex = i;
78893                       break;
78894
78895                   // otherwise lock in the first result that starts with the search string..
78896                   } else if (bestIndex === -1 && compare.indexOf(val) === 0) {
78897                       bestIndex = i;
78898                   }
78899               }
78900
78901               if (bestIndex !== -1) {
78902                   var bestVal = _suggestions[bestIndex].value;
78903                   input.property('value', bestVal);
78904                   input.node().setSelectionRange(val.length, bestVal.length);
78905                   return bestVal;
78906               }
78907           }
78908
78909
78910           function render() {
78911               if (_suggestions.length < _minItems || document.activeElement !== input.node()) {
78912                   hide();
78913                   return;
78914               }
78915
78916               var shown = !container.selectAll('.combobox').empty();
78917               if (!shown) return;
78918
78919               var combo = container.selectAll('.combobox');
78920               var options = combo.selectAll('.combobox-option')
78921                   .data(_suggestions, function(d) { return d.value; });
78922
78923               options.exit()
78924                   .remove();
78925
78926               // enter/update
78927               options.enter()
78928                   .append('a')
78929                   .attr('class', 'combobox-option')
78930                   .attr('title', function(d) { return d.title; })
78931                   .text(function(d) { return d.display || d.value; })
78932                   .merge(options)
78933                   .classed('selected', function(d) { return d.value === _selected; })
78934                   .on('click.combo-option', accept)
78935                   .order();
78936
78937               var node = attachTo ? attachTo.node() : input.node();
78938               var rect = node.getBoundingClientRect();
78939
78940               combo
78941                   .style('left', (rect.left + 5) + 'px')
78942                   .style('width', (rect.width - 10) + 'px')
78943                   .style('top', rect.height + rect.top + 'px');
78944           }
78945
78946
78947           // Dispatches an 'accept' event
78948           // Then hides the combobox.
78949           function accept(d) {
78950               _cancelFetch = true;
78951               var thiz = input.node();
78952
78953               if (d) {   // user clicked on a suggestion
78954                   utilGetSetValue(input, d.value);    // replace field contents
78955                   utilTriggerEvent(input, 'change');
78956               }
78957
78958               // clear (and keep) selection
78959               var val = utilGetSetValue(input);
78960               thiz.setSelectionRange(val.length, val.length);
78961
78962               d = _fetched[val];
78963               dispatch$1.call('accept', thiz, d, val);
78964               hide();
78965           }
78966
78967
78968           // Dispatches an 'cancel' event
78969           // Then hides the combobox.
78970           function cancel() {
78971               _cancelFetch = true;
78972               var thiz = input.node();
78973
78974               // clear (and remove) selection, and replace field contents
78975               var val = utilGetSetValue(input);
78976               var start = input.property('selectionStart');
78977               var end = input.property('selectionEnd');
78978               val = val.slice(0, start) + val.slice(end);
78979               utilGetSetValue(input, val);
78980               thiz.setSelectionRange(val.length, val.length);
78981
78982               dispatch$1.call('cancel', thiz);
78983               hide();
78984           }
78985
78986       };
78987
78988
78989       combobox.canAutocomplete = function(val) {
78990           if (!arguments.length) return _canAutocomplete;
78991           _canAutocomplete = val;
78992           return combobox;
78993       };
78994
78995       combobox.caseSensitive = function(val) {
78996           if (!arguments.length) return _caseSensitive;
78997           _caseSensitive = val;
78998           return combobox;
78999       };
79000
79001       combobox.data = function(val) {
79002           if (!arguments.length) return _data;
79003           _data = val;
79004           return combobox;
79005       };
79006
79007       combobox.fetcher = function(val) {
79008           if (!arguments.length) return _fetcher;
79009           _fetcher = val;
79010           return combobox;
79011       };
79012
79013       combobox.minItems = function(val) {
79014           if (!arguments.length) return _minItems;
79015           _minItems = val;
79016           return combobox;
79017       };
79018
79019
79020       return utilRebind(combobox, dispatch$1, 'on');
79021   }
79022
79023
79024   uiCombobox.off = function(input) {
79025       input
79026           .on('focus.combo-input', null)
79027           .on('blur.combo-input', null)
79028           .on('keydown.combo-input', null)
79029           .on('keyup.combo-input', null)
79030           .on('input.combo-input', null)
79031           .on('mousedown.combo-input', null)
79032           .on('mouseup.combo-input', null);
79033
79034
79035       select('body')
79036           .on('scroll.combo-scroll', null);
79037   };
79038
79039   /**
79040    * This method is like `_.union` except that it accepts `iteratee` which is
79041    * invoked for each element of each `arrays` to generate the criterion by
79042    * which uniqueness is computed. Result values are chosen from the first
79043    * array in which the value occurs. The iteratee is invoked with one argument:
79044    * (value).
79045    *
79046    * @static
79047    * @memberOf _
79048    * @since 4.0.0
79049    * @category Array
79050    * @param {...Array} [arrays] The arrays to inspect.
79051    * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
79052    * @returns {Array} Returns the new array of combined values.
79053    * @example
79054    *
79055    * _.unionBy([2.1], [1.2, 2.3], Math.floor);
79056    * // => [2.1, 1.2]
79057    *
79058    * // The `_.property` iteratee shorthand.
79059    * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
79060    * // => [{ 'x': 1 }, { 'x': 2 }]
79061    */
79062   var unionBy = baseRest(function(arrays) {
79063     var iteratee = last(arrays);
79064     if (isArrayLikeObject(iteratee)) {
79065       iteratee = undefined;
79066     }
79067     return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
79068   });
79069
79070   function uiCommitChanges(context) {
79071       var detected = utilDetect();
79072       var _entityID;
79073
79074
79075       function commitChanges(selection) {
79076           var history = context.history();
79077           var summary = history.difference().summary();
79078
79079           var container = selection.selectAll('.modal-section.commit-section')
79080               .data([0]);
79081
79082           var containerEnter = container.enter()
79083               .append('div')
79084               .attr('class', 'commit-section modal-section fillL2');
79085
79086           containerEnter
79087               .append('h3')
79088               .text(t('commit.changes', { count: summary.length }));
79089
79090           containerEnter
79091               .append('ul')
79092               .attr('class', 'changeset-list');
79093
79094           container = containerEnter
79095               .merge(container);
79096
79097
79098           var items = container.select('ul').selectAll('li')
79099               .data(summary);
79100
79101           var itemsEnter = items.enter()
79102               .append('li')
79103               .attr('class', 'change-item');
79104
79105           itemsEnter
79106               .each(function(d) {
79107                   select(this)
79108                       .call(svgIcon('#iD-icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
79109               });
79110
79111           itemsEnter
79112               .append('span')
79113               .attr('class', 'change-type')
79114               .text(function(d) { return t('commit.' + d.changeType) + ' '; });
79115
79116           itemsEnter
79117               .append('strong')
79118               .attr('class', 'entity-type')
79119               .text(function(d) {
79120                   var matched = context.presets().match(d.entity, d.graph);
79121                   return (matched && matched.name()) || utilDisplayType(d.entity.id);
79122               });
79123
79124           itemsEnter
79125               .append('span')
79126               .attr('class', 'entity-name')
79127               .text(function(d) {
79128                   var name = utilDisplayName(d.entity) || '',
79129                       string = '';
79130                   if (name !== '') {
79131                       string += ':';
79132                   }
79133                   return string += ' ' + name;
79134               });
79135
79136           itemsEnter
79137               .style('opacity', 0)
79138               .transition()
79139               .style('opacity', 1);
79140
79141           items = itemsEnter
79142               .merge(items);
79143
79144           items
79145               .on('mouseover', mouseover)
79146               .on('mouseout', mouseout)
79147               .on('click', click);
79148
79149
79150           // Download changeset link
79151           var changeset = new osmChangeset().update({ id: undefined });
79152           var changes = history.changes(actionDiscardTags(history.difference()));
79153
79154           delete changeset.id;  // Export without chnageset_id
79155
79156           var data = JXON.stringify(changeset.osmChangeJXON(changes));
79157           var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
79158           var fileName = 'changes.osc';
79159
79160           var linkEnter = container.selectAll('.download-changes')
79161               .data([0])
79162               .enter()
79163               .append('a')
79164               .attr('class', 'download-changes');
79165
79166           if (detected.download) {      // All except IE11 and Edge
79167               linkEnter                 // download the data as a file
79168                   .attr('href', window.URL.createObjectURL(blob))
79169                   .attr('download', fileName);
79170
79171           } else {                      // IE11 and Edge
79172               linkEnter                 // open data uri in a new tab
79173                   .attr('target', '_blank')
79174                   .on('click.download', function() {
79175                       navigator.msSaveBlob(blob, fileName);
79176                   });
79177           }
79178
79179           linkEnter
79180               .call(svgIcon('#iD-icon-load', 'inline'))
79181               .append('span')
79182               .text(t('commit.download_changes'));
79183
79184
79185           function mouseover(d) {
79186               if (d.entity) {
79187                   context.surface().selectAll(
79188                       utilEntityOrMemberSelector([d.entity.id], context.graph())
79189                   ).classed('hover', true);
79190               }
79191           }
79192
79193
79194           function mouseout() {
79195               context.surface().selectAll('.hover')
79196                   .classed('hover', false);
79197           }
79198
79199
79200           function click(change) {
79201               if (change.changeType === 'deleted') {
79202                   _entityID = null;
79203               } else {
79204                   var entity = change.entity;
79205                   _entityID = change.entity.id;
79206                   context.map().zoomToEase(entity);
79207                   context.surface().selectAll(utilEntityOrMemberSelector([_entityID], context.graph()))
79208                       .classed('hover', true);
79209               }
79210           }
79211       }
79212
79213
79214       commitChanges.entityID = function(_) {
79215           if (!arguments.length) return _entityID;
79216           _entityID = _;
79217           return commitChanges;
79218       };
79219
79220
79221       return commitChanges;
79222   }
79223
79224   function uiCommitWarnings(context) {
79225
79226       function commitWarnings(selection) {
79227
79228           var issuesBySeverity = {
79229               warning: context.validator().getWarnings(),
79230               error: context.validator().getErrors()
79231           };
79232
79233           for (var severity in issuesBySeverity) {
79234               var issues = issuesBySeverity[severity];
79235               var section = severity + '-section';
79236               var issueItem = severity + '-item';
79237
79238               var container = selection.selectAll('.' + section)
79239                   .data(issues.length ? [0] : []);
79240
79241               container.exit()
79242                   .remove();
79243
79244               var containerEnter = container.enter()
79245                   .append('div')
79246                   .attr('class', 'modal-section ' + section + ' fillL2');
79247
79248               containerEnter
79249                   .append('h3')
79250                   .text(severity === 'warning' ? t('commit.warnings') : t('commit.errors'));
79251
79252               containerEnter
79253                   .append('ul')
79254                   .attr('class', 'changeset-list');
79255
79256               container = containerEnter
79257                   .merge(container);
79258
79259
79260               var items = container.select('ul').selectAll('li')
79261                   .data(issues, function(d) { return d.id(); });
79262
79263               items.exit()
79264                   .remove();
79265
79266               var itemsEnter = items.enter()
79267                   .append('li')
79268                   .attr('class', issueItem);
79269
79270               itemsEnter
79271                   .call(svgIcon('#iD-icon-alert', 'pre-text'));
79272
79273               itemsEnter
79274                   .append('strong')
79275                   .text(function(d) { return d.message; });
79276
79277               itemsEnter.filter(function(d) { return d.tooltip; })
79278                   .call(tooltip()
79279                       .title(function(d) { return d.tooltip; })
79280                       .placement('top')
79281                   );
79282
79283               items = itemsEnter
79284                   .merge(items);
79285
79286
79287               items
79288                   .on('mouseover', function(d) {
79289                       if (d.entities) {
79290                           context.surface().selectAll(
79291                               utilEntityOrMemberSelector(
79292                                   d.entities.map(function(e) { return e.id; }),
79293                                   context.graph()
79294                               )
79295                           ).classed('hover', true);
79296                       }
79297                   })
79298                   .on('mouseout', function() {
79299                       context.surface().selectAll('.hover')
79300                           .classed('hover', false);
79301                   })
79302                   .on('click', function(d) {
79303                       if (d.entities && d.entities.length > 0) {
79304                           context.map().zoomTo(d.entities[0]);
79305                           context.enter(modeSelect(
79306                               context,
79307                               d.entities.map(function(e) { return e.id; })
79308                           ));
79309                       }
79310                   });
79311           }
79312       }
79313
79314
79315       return commitWarnings;
79316   }
79317
79318   function uiRawTagEditor(context) {
79319       var taginfo = services.taginfo;
79320       var dispatch$1 = dispatch('change');
79321       var _readOnlyTags = [];
79322       var _orderedKeys = [];
79323       var _showBlank = false;
79324       var _updatePreference = true;
79325       var _expanded = false;
79326       var _pendingChange = null;
79327       var _state;
79328       var _preset;
79329       var _tags;
79330       var _entityID;
79331
79332
79333       function rawTagEditor(selection) {
79334           var count = Object.keys(_tags).filter(function(d) { return d; }).length;
79335
79336           var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
79337               .title(t('inspector.all_tags') + ' (' + count + ')')
79338               .on('toggled', toggled)
79339               .updatePreference(_updatePreference)
79340               .content(content);
79341
79342           // Sometimes we want to force the raw_tag_editor to be opened/closed..
79343           // When undefined, uiDisclosure will use the user's stored preference.
79344           if (_expanded !== undefined) {
79345               disclosure.expanded(_expanded);
79346           }
79347
79348           selection.call(disclosure);
79349
79350           function toggled(expanded) {
79351               _expanded = expanded;
79352               if (expanded) {
79353                   selection.node().parentNode.scrollTop += 200;
79354               }
79355           }
79356       }
79357
79358
79359       function content(wrap) {
79360           var rowData = [];
79361           var seen = {};
79362           var allKeys = Object.keys(_tags);
79363           var i, k;
79364
79365           // When switching to a different entity or changing the state (hover/select)
79366           // we reorder the keys.  Otherwise leave them as the user entered - #5857
79367           if (!_orderedKeys.length) {
79368               _orderedKeys = allKeys.sort();
79369           }
79370
79371           // push ordered keys first
79372           for (i = 0; i < _orderedKeys.length; i++) {
79373               k = _orderedKeys[i];
79374               if (_tags[k] === undefined) continue;   // e.g. tag was removed
79375               seen[k] = true;
79376               rowData.push({ key: k, value: _tags[k] });
79377           }
79378           // push unknown keys after - these are tags the user added
79379           for (i = 0; i < allKeys.length; i++) {
79380               k = allKeys[i];
79381               if (seen[k]) continue;
79382               rowData.push({ key: k, value: _tags[k] });
79383           }
79384           // push blank row last, if necessary
79385           if (!rowData.length || _showBlank) {
79386               _showBlank = false;
79387               rowData.push({ key: '', value: '' });
79388           }
79389
79390           // List of tags
79391           var list = wrap.selectAll('.tag-list')
79392               .data([0]);
79393
79394           list = list.enter()
79395               .append('ul')
79396               .attr('class', 'tag-list')
79397               .merge(list);
79398
79399
79400           // Container for the Add button
79401           var addRowEnter = wrap.selectAll('.add-row')
79402               .data([0])
79403               .enter()
79404               .append('div')
79405               .attr('class', 'add-row');
79406
79407           addRowEnter
79408               .append('button')
79409               .attr('class', 'add-tag')
79410               .call(svgIcon('#iD-icon-plus', 'light'))
79411               .on('click', addTag);
79412
79413           addRowEnter
79414               .append('div')
79415               .attr('class', 'space-value');   // preserve space
79416
79417           addRowEnter
79418               .append('div')
79419               .attr('class', 'space-buttons');  // preserve space
79420
79421
79422           // Tag list items
79423           var items = list.selectAll('.tag-row')
79424               .data(rowData, function(d) { return d.key; });
79425
79426           items.exit()
79427               .each(unbind)
79428               .remove();
79429
79430
79431           // Enter
79432           var itemsEnter = items.enter()
79433               .append('li')
79434               .attr('class', 'tag-row')
79435               .classed('readonly', isReadOnly);
79436
79437           var innerWrap = itemsEnter.append('div')
79438               .attr('class', 'inner-wrap');
79439
79440           innerWrap
79441               .append('div')
79442               .attr('class', 'key-wrap')
79443               .append('input')
79444               .property('type', 'text')
79445               .attr('class', 'key')
79446               .attr('maxlength', 255)
79447               .call(utilNoAuto)
79448               .on('blur', keyChange)
79449               .on('change', keyChange);
79450
79451           innerWrap
79452               .append('div')
79453               .attr('class', 'value-wrap')
79454               .append('input')
79455               .property('type', 'text')
79456               .attr('class', 'value')
79457               .attr('maxlength', 255)
79458               .call(utilNoAuto)
79459               .on('blur', valueChange)
79460               .on('change', valueChange)
79461               .on('keydown.push-more', pushMore);
79462
79463           innerWrap
79464               .append('button')
79465               .attr('tabindex', -1)
79466               .attr('class', 'form-field-button remove')
79467               .attr('title', t('icons.remove'))
79468               .call(svgIcon('#iD-operation-delete'));
79469
79470
79471           // Update
79472           items = items
79473               .merge(itemsEnter)
79474               .order();
79475
79476           items
79477               .each(function(d) {
79478                   var row = select(this);
79479                   var key = row.select('input.key');      // propagate bound data
79480                   var value = row.select('input.value');  // propagate bound data
79481
79482                   if (_entityID && taginfo && _state !== 'hover') {
79483                       bindTypeahead(key, value);
79484                   }
79485
79486                   var isRelation = (_entityID && context.entity(_entityID).type === 'relation');
79487                   var reference;
79488
79489                   if (isRelation && d.key === 'type') {
79490                       reference = uiTagReference({ rtype: d.value }, context);
79491                   } else {
79492                       reference = uiTagReference({ key: d.key, value: d.value }, context);
79493                   }
79494
79495                   if (_state === 'hover') {
79496                       reference.showing(false);
79497                   }
79498
79499                   row.select('.inner-wrap')      // propagate bound data
79500                       .call(reference.button);
79501
79502                   row.call(reference.body);
79503
79504                   row.select('button.remove');   // propagate bound data
79505               });
79506
79507           items.selectAll('input.key')
79508               .attr('title', function(d) { return d.key; })
79509               .call(utilGetSetValue, function(d) { return d.key; })
79510               .property('disabled', isReadOnly);
79511
79512           items.selectAll('input.value')
79513               .attr('title', function(d) { return d.value; })
79514               .call(utilGetSetValue, function(d) { return d.value; })
79515               .property('disabled', isReadOnly);
79516
79517           items.selectAll('button.remove')
79518               .on('mousedown', removeTag);  // 'click' fires too late - #5878
79519
79520
79521
79522           function isReadOnly(d) {
79523               for (var i = 0; i < _readOnlyTags.length; i++) {
79524                   if (d.key.match(_readOnlyTags[i]) !== null) {
79525                       return true;
79526                   }
79527               }
79528               return false;
79529           }
79530
79531
79532           function pushMore() {
79533               if (event.keyCode === 9 && !event.shiftKey &&
79534                   list.selectAll('li:last-child input.value').node() === this) {
79535                   addTag();
79536               }
79537           }
79538
79539
79540           function bindTypeahead(key, value) {
79541               if (isReadOnly(key.datum())) return;
79542
79543               var geometry = context.geometry(_entityID);
79544
79545               key.call(uiCombobox(context, 'tag-key')
79546                   .fetcher(function(value, callback) {
79547                       taginfo.keys({
79548                           debounce: true,
79549                           geometry: geometry,
79550                           query: value
79551                       }, function(err, data) {
79552                           if (!err) {
79553                               var filtered = data.filter(function(d) {
79554                                   return _tags[d.value] === undefined;
79555                               });
79556                               callback(sort(value, filtered));
79557                           }
79558                       });
79559                   }));
79560
79561               value.call(uiCombobox(context, 'tag-value')
79562                   .fetcher(function(value, callback) {
79563                       taginfo.values({
79564                           debounce: true,
79565                           key: utilGetSetValue(key),
79566                           geometry: geometry,
79567                           query: value
79568                       }, function(err, data) {
79569                           if (!err) callback(sort(value, data));
79570                       });
79571                   }));
79572
79573
79574               function sort(value, data) {
79575                   var sameletter = [];
79576                   var other = [];
79577                   for (var i = 0; i < data.length; i++) {
79578                       if (data[i].value.substring(0, value.length) === value) {
79579                           sameletter.push(data[i]);
79580                       } else {
79581                           other.push(data[i]);
79582                       }
79583                   }
79584                   return sameletter.concat(other);
79585               }
79586           }
79587
79588
79589           function unbind() {
79590               var row = select(this);
79591
79592               row.selectAll('input.key')
79593                   .call(uiCombobox.off);
79594
79595               row.selectAll('input.value')
79596                   .call(uiCombobox.off);
79597           }
79598
79599
79600           function keyChange(d) {
79601               var kOld = d.key;
79602               var kNew = this.value.trim();
79603               var row = this.parentNode.parentNode;
79604               var inputVal = select(row).selectAll('input.value');
79605               var vNew = utilGetSetValue(inputVal);
79606
79607               // if the key looks like "key=value", split them up - #5024
79608               if (kNew.indexOf('=') !== -1) {
79609                   var parts = kNew
79610                       .split('=')
79611                       .map(function(str) { return str.trim(); })
79612                       .filter(Boolean);
79613
79614                   if (parts.length === 2) {
79615                       kNew = parts[0];
79616                       vNew = parts[1];
79617                   }
79618               }
79619
79620               // allow no change if the key should be readonly
79621               if (isReadOnly({ key: kNew })) {
79622                   this.value = kOld;
79623                   return;
79624               }
79625
79626               // switch focus if key is already in use
79627               if (kNew && kNew !== kOld) {
79628                   if (_tags[kNew] !== undefined) {      // new key is already in use
79629                       this.value = kOld;                // reset the key
79630                       list.selectAll('input.value')
79631                           .each(function(d) {
79632                               if (d.key === kNew) {     // send focus to that other value combo instead
79633                                   var input = select(this).node();
79634                                   input.focus();
79635                                   input.select();
79636                               }
79637                           });
79638                       return;
79639                   }
79640               }
79641
79642               _pendingChange  = _pendingChange || {};
79643               if (kOld) {
79644                   _pendingChange[kOld] = undefined;
79645               }
79646               _pendingChange[kNew] = vNew;
79647
79648               d.key = kNew;    // update datum to avoid exit/enter on tag update
79649               d.value = vNew;
79650
79651               this.value = kNew;
79652               utilGetSetValue(inputVal, vNew);
79653
79654               scheduleChange();
79655           }
79656
79657
79658           function valueChange(d) {
79659               if (isReadOnly(d)) return;
79660
79661               _pendingChange  = _pendingChange || {};
79662               _pendingChange[d.key] = this.value;
79663               scheduleChange();
79664           }
79665
79666
79667           function removeTag(d) {
79668               if (isReadOnly(d)) return;
79669
79670               if (d.key === '') {    // removing the blank row
79671                   _showBlank = false;
79672                   content(wrap);
79673               } else {
79674                   _pendingChange  = _pendingChange || {};
79675                   _pendingChange[d.key] = undefined;
79676                   scheduleChange();
79677               }
79678           }
79679
79680
79681           function addTag() {
79682               // Delay render in case this click is blurring an edited combo.
79683               // Without the setTimeout, the `content` render would wipe out the pending tag change.
79684               window.setTimeout(function() {
79685                   _showBlank = true;
79686                   content(wrap);
79687                   list.selectAll('li:last-child input.key').node().focus();
79688               }, 20);
79689           }
79690
79691
79692           function scheduleChange() {
79693               // Delay change in case this change is blurring an edited combo. - #5878
79694               window.setTimeout(function() {
79695                   dispatch$1.call('change', this, _pendingChange);
79696                   _pendingChange = null;
79697               }, 10);
79698           }
79699
79700       }
79701
79702
79703       rawTagEditor.state = function(val) {
79704           if (!arguments.length) return _state;
79705           if (_state !== val) {
79706               _orderedKeys = [];
79707               _state = val;
79708           }
79709           return rawTagEditor;
79710       };
79711
79712
79713       rawTagEditor.preset = function(val) {
79714           if (!arguments.length) return _preset;
79715           _preset = val;
79716           if (_preset.isFallback()) {
79717               _expanded = true;
79718               _updatePreference = false;
79719           } else {
79720               _expanded = undefined;
79721               _updatePreference = true;
79722           }
79723           return rawTagEditor;
79724       };
79725
79726
79727       rawTagEditor.tags = function(val) {
79728           if (!arguments.length) return _tags;
79729           _tags = val;
79730           return rawTagEditor;
79731       };
79732
79733
79734       rawTagEditor.entityID = function(val) {
79735           if (!arguments.length) return _entityID;
79736           if (_entityID !== val) {
79737               _orderedKeys = [];
79738               _entityID = val;
79739           }
79740           return rawTagEditor;
79741       };
79742
79743
79744       rawTagEditor.expanded = function(val) {
79745           if (!arguments.length) return _expanded;
79746           _expanded = val;
79747           _updatePreference = false;
79748           return rawTagEditor;
79749       };
79750
79751
79752       rawTagEditor.readOnlyTags = function(val) {
79753           if (!arguments.length) return _readOnlyTags;
79754           _readOnlyTags = val;
79755           return rawTagEditor;
79756       };
79757
79758
79759       return utilRebind(rawTagEditor, dispatch$1, 'on');
79760   }
79761
79762   var _changeset$1;
79763   var readOnlyTags = [
79764       /^changesets_count$/,
79765       /^created_by$/,
79766       /^ideditor:/,
79767       /^imagery_used$/,
79768       /^host$/,
79769       /^locale$/
79770   ];
79771
79772   // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
79773   // from https://stackoverflow.com/a/25575009
79774   var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
79775
79776
79777   function uiCommit(context) {
79778       var dispatch$1 = dispatch('cancel', 'save');
79779       var _userDetails;
79780       var _selection;
79781
79782       var changesetEditor = uiChangesetEditor(context)
79783           .on('change', changeTags);
79784       var rawTagEditor = uiRawTagEditor(context)
79785           .on('change', changeTags);
79786       var commitChanges = uiCommitChanges(context);
79787       var commitWarnings = uiCommitWarnings(context);
79788
79789
79790       function commit(selection) {
79791           _selection = selection;
79792
79793           var osm = context.connection();
79794           if (!osm) return;
79795
79796           // expire stored comment, hashtags, source after cutoff datetime - #3947 #4899
79797           var commentDate = +context.storage('commentDate') || 0;
79798           var currDate = Date.now();
79799           var cutoff = 2 * 86400 * 1000;   // 2 days
79800           if (commentDate > currDate || currDate - commentDate > cutoff) {
79801               context.storage('comment', null);
79802               context.storage('hashtags', null);
79803               context.storage('source', null);
79804           }
79805
79806           var tags;
79807           // Initialize changeset if one does not exist yet.
79808           // Also pull values from local storage.
79809           if (!_changeset$1) {
79810               var detected = utilDetect();
79811               tags = {
79812                   comment: context.storage('comment') || '',
79813                   created_by: ('iD ' + context.version).substr(0, 255),
79814                   host: detected.host.substr(0, 255),
79815                   locale: detected.locale.substr(0, 255)
79816               };
79817
79818               // call findHashtags initially - this will remove stored
79819               // hashtags if any hashtags are found in the comment - #4304
79820               findHashtags(tags, true);
79821
79822               var hashtags = context.storage('hashtags');
79823               if (hashtags) {
79824                   tags.hashtags = hashtags;
79825               }
79826
79827               var source = context.storage('source');
79828               if (source) {
79829                   tags.source = source;
79830               }
79831
79832               _changeset$1 = new osmChangeset({ tags: tags });
79833           }
79834
79835           tags = clone(_changeset$1.tags);
79836
79837           // assign tags for imagery used
79838           var imageryUsed = context.history().imageryUsed().join(';').substr(0, 255);
79839           tags.imagery_used = imageryUsed || 'None';
79840
79841           // assign tags for closed issues and notes
79842           var osmClosed = osm.getClosedIDs();
79843           if (osmClosed.length) {
79844               tags['closed:note'] = osmClosed.join(';').substr(0, 255);
79845           }
79846           if (services.keepRight) {
79847               var krClosed = services.keepRight.getClosedIDs();
79848               if (krClosed.length) {
79849                   tags['closed:keepright'] = krClosed.join(';').substr(0, 255);
79850               }
79851           }
79852           if (services.improveOSM) {
79853               var iOsmClosed = services.improveOSM.getClosedIDs();
79854               if (iOsmClosed.length) {
79855                   tags['closed:improveosm'] = iOsmClosed.join(';').substr(0, 255);
79856               }
79857           }
79858
79859           _changeset$1 = _changeset$1.update({ tags: tags });
79860
79861           var header = selection.selectAll('.header')
79862               .data([0]);
79863
79864           var headerTitle = header.enter()
79865               .append('div')
79866               .attr('class', 'header fillL header-container');
79867
79868           headerTitle
79869               .append('div')
79870               .attr('class', 'header-block header-block-outer');
79871
79872           headerTitle
79873               .append('div')
79874               .attr('class', 'header-block')
79875               .append('h3')
79876               .text(t('commit.title'));
79877
79878           headerTitle
79879               .append('div')
79880               .attr('class', 'header-block header-block-outer header-block-close')
79881               .append('button')
79882               .attr('class', 'close')
79883               .on('click', function() { context.enter(modeBrowse(context)); })
79884               .call(svgIcon('#iD-icon-close'));
79885
79886           var body = selection.selectAll('.body')
79887               .data([0]);
79888
79889           body = body.enter()
79890               .append('div')
79891               .attr('class', 'body')
79892               .merge(body);
79893
79894
79895           // Changeset Section
79896           var changesetSection = body.selectAll('.changeset-editor')
79897               .data([0]);
79898
79899           changesetSection = changesetSection.enter()
79900               .append('div')
79901               .attr('class', 'modal-section changeset-editor')
79902               .merge(changesetSection);
79903
79904           changesetSection
79905               .call(changesetEditor
79906                   .changesetID(_changeset$1.id)
79907                   .tags(tags)
79908               );
79909
79910
79911           // Warnings
79912           body.call(commitWarnings);
79913
79914
79915           // Upload Explanation
79916           var saveSection = body.selectAll('.save-section')
79917               .data([0]);
79918
79919           saveSection = saveSection.enter()
79920               .append('div')
79921               .attr('class','modal-section save-section fillL cf')
79922               .merge(saveSection);
79923
79924           var prose = saveSection.selectAll('.commit-info')
79925               .data([0]);
79926
79927           prose = prose.enter()
79928               .append('p')
79929               .attr('class', 'commit-info')
79930               .text(t('commit.upload_explanation'))
79931               .merge(prose);
79932
79933           osm.userDetails(function(err, user) {
79934               if (err) return;
79935
79936               var userLink = select(document.createElement('div'));
79937
79938               _userDetails = user;
79939
79940               if (user.image_url) {
79941                   userLink
79942                       .append('img')
79943                       .attr('src', user.image_url)
79944                       .attr('class', 'icon pre-text user-icon');
79945               }
79946
79947               userLink
79948                   .append('a')
79949                   .attr('class', 'user-info')
79950                   .text(user.display_name)
79951                   .attr('href', osm.userURL(user.display_name))
79952                   .attr('tabindex', -1)
79953                   .attr('target', '_blank');
79954
79955               prose
79956                   .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
79957           });
79958
79959
79960           // Request Review
79961           var requestReview = saveSection.selectAll('.request-review')
79962               .data([0]);
79963
79964           // Enter
79965           var requestReviewEnter = requestReview.enter()
79966               .append('div')
79967               .attr('class', 'request-review');
79968
79969           var labelEnter = requestReviewEnter
79970               .append('label')
79971               .attr('for', 'commit-input-request-review');
79972
79973           labelEnter
79974               .append('input')
79975               .attr('type', 'checkbox')
79976               .attr('id', 'commit-input-request-review');
79977
79978           labelEnter
79979               .append('span')
79980               .text(t('commit.request_review'));
79981
79982           // Update
79983           requestReview = requestReview
79984               .merge(requestReviewEnter);
79985
79986           var requestReviewInput = requestReview.selectAll('input')
79987               .property('checked', isReviewRequested(_changeset$1.tags))
79988               .on('change', toggleRequestReview);
79989
79990
79991           // Buttons
79992           var buttonSection = saveSection.selectAll('.buttons')
79993               .data([0]);
79994
79995           // enter
79996           var buttonEnter = buttonSection.enter()
79997               .append('div')
79998               .attr('class', 'buttons fillL cf');
79999
80000           buttonEnter
80001               .append('button')
80002               .attr('class', 'secondary-action button cancel-button')
80003               .append('span')
80004               .attr('class', 'label')
80005               .text(t('commit.cancel'));
80006
80007           var uploadButton = buttonEnter
80008               .append('button')
80009               .attr('class', 'action button save-button');
80010
80011           uploadButton.append('span')
80012               .attr('class', 'label')
80013               .text(t('commit.save'));
80014
80015           var uploadBlockerTooltipText = getUploadBlockerMessage();
80016
80017           // update
80018           buttonSection = buttonSection
80019               .merge(buttonEnter);
80020
80021           buttonSection.selectAll('.cancel-button')
80022               .on('click.cancel', function() {
80023                   var selectedID = commitChanges.entityID();
80024                   dispatch$1.call('cancel', this, selectedID);
80025               });
80026
80027           buttonSection.selectAll('.save-button')
80028               .classed('disabled', uploadBlockerTooltipText !== null)
80029               .on('click.save', function() {
80030                   if (!select(this).classed('disabled')) {
80031                       this.blur();    // avoid keeping focus on the button - #4641
80032                       dispatch$1.call('save', this, _changeset$1);
80033                   }
80034               });
80035
80036           // remove any existing tooltip
80037           tooltip().destroyAny(buttonSection.selectAll('.save-button'));
80038
80039           if (uploadBlockerTooltipText) {
80040               buttonSection.selectAll('.save-button')
80041                   .call(tooltip().title(uploadBlockerTooltipText).placement('top'));
80042           }
80043
80044           // Raw Tag Editor
80045           var tagSection = body.selectAll('.tag-section.raw-tag-editor')
80046               .data([0]);
80047
80048           tagSection = tagSection.enter()
80049               .append('div')
80050               .attr('class', 'modal-section tag-section raw-tag-editor')
80051               .merge(tagSection);
80052
80053           var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
80054           tagSection
80055               .call(rawTagEditor
80056                   .expanded(expanded)
80057                   .readOnlyTags(readOnlyTags)
80058                   .tags(clone(_changeset$1.tags))
80059               );
80060
80061
80062           // Change summary
80063           body.call(commitChanges);
80064
80065
80066           function toggleRequestReview() {
80067               var rr = requestReviewInput.property('checked');
80068               updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
80069
80070               var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
80071               tagSection
80072                   .call(rawTagEditor
80073                       .expanded(expanded)
80074                       .readOnlyTags(readOnlyTags)
80075                       .tags(clone(_changeset$1.tags))
80076                   );
80077           }
80078       }
80079
80080
80081       function getUploadBlockerMessage() {
80082           var errorCount = context.validator().getErrors().length;
80083           if (errorCount > 0) {
80084               return t('commit.outstanding_errors_message', { count: errorCount });
80085
80086           } else {
80087               var n = select('#preset-input-comment').node();
80088               var hasChangesetComment = n && n.value.length > 0;
80089               if (!hasChangesetComment) {
80090                   return t('commit.comment_needed_message');
80091               }
80092           }
80093           return null;
80094       }
80095
80096
80097       function changeTags(changed, onInput) {
80098           if (changed.hasOwnProperty('comment')) {
80099               if (changed.comment === undefined) {
80100                   changed.comment = '';
80101               }
80102               if (!onInput) {
80103                   context.storage('comment', changed.comment);
80104                   context.storage('commentDate', Date.now());
80105               }
80106           }
80107           if (changed.hasOwnProperty('source')) {
80108               if (changed.source === undefined) {
80109                   context.storage('source', null);
80110               } else if (!onInput) {
80111                   context.storage('source', changed.source);
80112                   context.storage('commentDate', Date.now());
80113               }
80114           }
80115
80116           updateChangeset(changed, onInput);
80117
80118           if (_selection) {
80119               _selection.call(commit);
80120           }
80121       }
80122
80123
80124       function findHashtags(tags, commentOnly) {
80125           var inComment = commentTags();
80126           var inHashTags = hashTags();
80127
80128           if (inComment !== null) {                    // when hashtags are detected in comment...
80129               context.storage('hashtags', null);       // always remove stored hashtags - #4304
80130               if (commentOnly) { inHashTags = null; }  // optionally override hashtags field
80131           }
80132           return unionBy(inComment, inHashTags, function (s) {
80133               return s.toLowerCase();
80134           });
80135
80136           // Extract hashtags from `comment`
80137           function commentTags() {
80138               return tags.comment
80139                   .replace(/http\S*/g, '')  // drop anything that looks like a URL - #4289
80140                   .match(hashtagRegex);
80141           }
80142
80143           // Extract and clean hashtags from `hashtags`
80144           function hashTags() {
80145               var t = tags.hashtags || '';
80146               return t
80147                   .split(/[,;\s]+/)
80148                   .map(function (s) {
80149                       if (s[0] !== '#') { s = '#' + s; }    // prepend '#'
80150                       var matched = s.match(hashtagRegex);
80151                       return matched && matched[0];
80152                   }).filter(Boolean);                       // exclude falsey
80153           }
80154       }
80155
80156
80157       function isReviewRequested(tags) {
80158           var rr = tags.review_requested;
80159           if (rr === undefined) return false;
80160           rr = rr.trim().toLowerCase();
80161           return !(rr === '' || rr === 'no');
80162       }
80163
80164
80165       function updateChangeset(changed, onInput) {
80166           var tags = clone(_changeset$1.tags);
80167
80168           forEach(changed, function(v, k) {
80169               k = k.trim().substr(0, 255);
80170               if (readOnlyTags.indexOf(k) !== -1) return;
80171
80172               if (k !== '' && v !== undefined) {
80173                   if (onInput) {
80174                       tags[k] = v;
80175                   } else {
80176                       tags[k] = v.trim().substr(0, 255);
80177                   }
80178               } else {
80179                   delete tags[k];
80180               }
80181           });
80182
80183           if (!onInput) {
80184               // when changing the comment, override hashtags with any found in comment.
80185               var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
80186               var arr = findHashtags(tags, commentOnly);
80187               if (arr.length) {
80188                   tags.hashtags = arr.join(';').substr(0, 255);
80189                   context.storage('hashtags', tags.hashtags);
80190               } else {
80191                   delete tags.hashtags;
80192                   context.storage('hashtags', null);
80193               }
80194           }
80195
80196           // always update userdetails, just in case user reauthenticates as someone else
80197           if (_userDetails && _userDetails.changesets_count !== undefined) {
80198               var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1;  // #4283
80199               tags.changesets_count = String(changesetsCount);
80200
80201               // first 100 edits - new user
80202               if (changesetsCount <= 100) {
80203                   var s;
80204                   s = context.storage('walkthrough_completed');
80205                   if (s) {
80206                       tags['ideditor:walkthrough_completed'] = s;
80207                   }
80208
80209                   s = context.storage('walkthrough_progress');
80210                   if (s) {
80211                       tags['ideditor:walkthrough_progress'] = s;
80212                   }
80213
80214                   s = context.storage('walkthrough_started');
80215                   if (s) {
80216                       tags['ideditor:walkthrough_started'] = s;
80217                   }
80218               }
80219           } else {
80220               delete tags.changesets_count;
80221           }
80222
80223           if (!isEqual(_changeset$1.tags, tags)) {
80224               _changeset$1 = _changeset$1.update({ tags: tags });
80225           }
80226       }
80227
80228
80229       commit.reset = function() {
80230           _changeset$1 = null;
80231       };
80232
80233
80234       return utilRebind(commit, dispatch$1, 'on');
80235   }
80236
80237   function uiConflicts(context) {
80238       var dispatch$1 = dispatch('cancel', 'save');
80239       var keybinding = utilKeybinding('conflicts');
80240       var _origChanges;
80241       var _conflictList;
80242
80243
80244       function keybindingOn() {
80245           select(document)
80246               .call(keybinding.on('⎋', cancel, true));
80247       }
80248
80249       function keybindingOff() {
80250           select(document)
80251               .call(keybinding.unbind);
80252       }
80253
80254       function tryAgain() {
80255           keybindingOff();
80256           dispatch$1.call('save');
80257       }
80258
80259       function cancel() {
80260           keybindingOff();
80261           dispatch$1.call('cancel');
80262       }
80263
80264
80265       function conflicts(selection) {
80266           keybindingOn();
80267
80268           var headerEnter = selection.selectAll('.header')
80269               .data([0])
80270               .enter()
80271               .append('div')
80272               .attr('class', 'header fillL');
80273
80274           headerEnter
80275               .append('button')
80276               .attr('class', 'fr')
80277               .on('click', cancel)
80278               .call(svgIcon('#iD-icon-close'));
80279
80280           headerEnter
80281               .append('h3')
80282               .text(t('save.conflict.header'));
80283
80284           var bodyEnter = selection.selectAll('.body')
80285               .data([0])
80286               .enter()
80287               .append('div')
80288               .attr('class', 'body fillL');
80289
80290           var conflictsHelpEnter = bodyEnter
80291               .append('div')
80292               .attr('class', 'conflicts-help')
80293               .text(t('save.conflict.help'));
80294
80295
80296           // Download changes link
80297           var detected = utilDetect();
80298           var changeset = new osmChangeset();
80299
80300           delete changeset.id;  // Export without changeset_id
80301
80302           var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
80303           var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
80304           var fileName = 'changes.osc';
80305
80306           var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
80307               .append('a')
80308               .attr('class', 'download-changes');
80309
80310           if (detected.download) {      // All except IE11 and Edge
80311               linkEnter                 // download the data as a file
80312                   .attr('href', window.URL.createObjectURL(blob))
80313                   .attr('download', fileName);
80314
80315           } else {                      // IE11 and Edge
80316               linkEnter                 // open data uri in a new tab
80317                   .attr('target', '_blank')
80318                   .on('click.download', function() {
80319                       navigator.msSaveBlob(blob, fileName);
80320                   });
80321           }
80322
80323           linkEnter
80324               .call(svgIcon('#iD-icon-load', 'inline'))
80325               .append('span')
80326               .text(t('save.conflict.download_changes'));
80327
80328
80329           bodyEnter
80330               .append('div')
80331               .attr('class', 'conflict-container fillL3')
80332               .call(showConflict, 0);
80333
80334           bodyEnter
80335               .append('div')
80336               .attr('class', 'conflicts-done')
80337               .attr('opacity', 0)
80338               .style('display', 'none')
80339               .text(t('save.conflict.done'));
80340
80341           var buttonsEnter = bodyEnter
80342               .append('div')
80343               .attr('class','buttons col12 joined conflicts-buttons');
80344
80345           buttonsEnter
80346               .append('button')
80347               .attr('disabled', _conflictList.length > 1)
80348               .attr('class', 'action conflicts-button col6')
80349               .text(t('save.title'))
80350               .on('click.try_again', tryAgain);
80351
80352           buttonsEnter
80353               .append('button')
80354               .attr('class', 'secondary-action conflicts-button col6')
80355               .text(t('confirm.cancel'))
80356               .on('click.cancel', cancel);
80357       }
80358
80359
80360       function showConflict(selection, index) {
80361           index = utilWrap(index, _conflictList.length);
80362
80363           var parent = select(selection.node().parentNode);
80364
80365           // enable save button if this is the last conflict being reviewed..
80366           if (index === _conflictList.length - 1) {
80367               window.setTimeout(function() {
80368                   parent.select('.conflicts-button')
80369                       .attr('disabled', null);
80370
80371                   parent.select('.conflicts-done')
80372                       .transition()
80373                       .attr('opacity', 1)
80374                       .style('display', 'block');
80375               }, 250);
80376           }
80377
80378           var conflict = selection
80379               .selectAll('.conflict')
80380               .data([_conflictList[index]]);
80381
80382           conflict.exit()
80383               .remove();
80384
80385           var conflictEnter = conflict.enter()
80386               .append('div')
80387               .attr('class', 'conflict');
80388
80389           conflictEnter
80390               .append('h4')
80391               .attr('class', 'conflict-count')
80392               .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
80393
80394           conflictEnter
80395               .append('a')
80396               .attr('class', 'conflict-description')
80397               .attr('href', '#')
80398               .text(function(d) { return d.name; })
80399               .on('click', function(d) {
80400                   event.preventDefault();
80401                   zoomToEntity(d.id);
80402               });
80403
80404           var details = conflictEnter
80405               .append('div')
80406               .attr('class', 'conflict-detail-container');
80407
80408           details
80409               .append('ul')
80410               .attr('class', 'conflict-detail-list')
80411               .selectAll('li')
80412               .data(function(d) { return d.details || []; })
80413               .enter()
80414               .append('li')
80415               .attr('class', 'conflict-detail-item')
80416               .html(function(d) { return d; });
80417
80418           details
80419               .append('div')
80420               .attr('class', 'conflict-choices')
80421               .call(addChoices);
80422
80423           details
80424               .append('div')
80425               .attr('class', 'conflict-nav-buttons joined cf')
80426               .selectAll('button')
80427               .data(['previous', 'next'])
80428               .enter()
80429               .append('button')
80430               .text(function(d) { return t('save.conflict.' + d); })
80431               .attr('class', 'conflict-nav-button action col6')
80432               .attr('disabled', function(d, i) {
80433                   return (i === 0 && index === 0) ||
80434                       (i === 1 && index === _conflictList.length - 1) || null;
80435               })
80436               .on('click', function(d, i) {
80437                   event.preventDefault();
80438
80439                   var container = parent.selectAll('.conflict-container');
80440                   var sign = (i === 0 ? -1 : 1);
80441
80442                   container
80443                       .selectAll('.conflict')
80444                       .remove();
80445
80446                   container
80447                       .call(showConflict, index + sign);
80448               });
80449
80450       }
80451
80452
80453       function addChoices(selection) {
80454           var choices = selection
80455               .append('ul')
80456               .attr('class', 'layer-list')
80457               .selectAll('li')
80458               .data(function(d) { return d.choices || []; });
80459
80460           // enter
80461           var choicesEnter = choices.enter()
80462               .append('li')
80463               .attr('class', 'layer');
80464
80465           var labelEnter = choicesEnter
80466               .append('label');
80467
80468           labelEnter
80469               .append('input')
80470               .attr('type', 'radio')
80471               .attr('name', function(d) { return d.id; })
80472               .on('change', function(d, i) {
80473                   var ul = this.parentNode.parentNode.parentNode;
80474                   ul.__data__.chosen = i;
80475                   choose(ul, d);
80476               });
80477
80478           labelEnter
80479               .append('span')
80480               .text(function(d) { return d.text; });
80481
80482           // update
80483           choicesEnter
80484               .merge(choices)
80485               .each(function(d, i) {
80486                   var ul = this.parentNode;
80487                   if (ul.__data__.chosen === i) {
80488                       choose(ul, d);
80489                   }
80490               });
80491       }
80492
80493
80494       function choose(ul, datum) {
80495           if (event) event.preventDefault();
80496
80497           select(ul)
80498               .selectAll('li')
80499               .classed('active', function(d) { return d === datum; })
80500               .selectAll('input')
80501               .property('checked', function(d) { return d === datum; });
80502
80503           var extent = geoExtent();
80504           var entity;
80505
80506           entity = context.graph().hasEntity(datum.id);
80507           if (entity) extent._extend(entity.extent(context.graph()));
80508
80509           datum.action();
80510
80511           entity = context.graph().hasEntity(datum.id);
80512           if (entity) extent._extend(entity.extent(context.graph()));
80513
80514           zoomToEntity(datum.id, extent);
80515       }
80516
80517
80518       function zoomToEntity(id, extent) {
80519           context.surface().selectAll('.hover')
80520               .classed('hover', false);
80521
80522           var entity = context.graph().hasEntity(id);
80523           if (entity) {
80524               if (extent) {
80525                   context.map().trimmedExtent(extent);
80526               } else {
80527                   context.map().zoomToEase(entity);
80528               }
80529               context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
80530                   .classed('hover', true);
80531           }
80532       }
80533
80534
80535       // The conflict list should be an array of objects like:
80536       // {
80537       //     id: id,
80538       //     name: entityName(local),
80539       //     details: merge.conflicts(),
80540       //     chosen: 1,
80541       //     choices: [
80542       //         choice(id, keepMine, forceLocal),
80543       //         choice(id, keepTheirs, forceRemote)
80544       //     ]
80545       // }
80546       conflicts.conflictList = function(_) {
80547           if (!arguments.length) return _conflictList;
80548           _conflictList = _;
80549           return conflicts;
80550       };
80551
80552
80553       conflicts.origChanges = function(_) {
80554           if (!arguments.length) return _origChanges;
80555           _origChanges = _;
80556           return conflicts;
80557       };
80558
80559
80560       return utilRebind(conflicts, dispatch$1, 'on');
80561   }
80562
80563   function uiDataEditor(context) {
80564       var dataHeader = uiDataHeader();
80565       var quickLinks = uiQuickLinks();
80566       var rawTagEditor = uiRawTagEditor(context);
80567       var _datum;
80568
80569
80570       function dataEditor(selection) {
80571           // quick links
80572           var choices = [{
80573               id: 'zoom_to',
80574               label: 'inspector.zoom_to.title',
80575               tooltip: function() {
80576                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_data'), t('inspector.zoom_to.key'));
80577               },
80578               click: function zoomTo() {
80579                   context.mode().zoomToSelected();
80580               }
80581           }];
80582
80583
80584           var header = selection.selectAll('.header')
80585               .data([0]);
80586
80587           var headerEnter = header.enter()
80588               .append('div')
80589               .attr('class', 'header fillL');
80590
80591           headerEnter
80592               .append('button')
80593               .attr('class', 'fr data-editor-close')
80594               .on('click', function() {
80595                   context.enter(modeBrowse(context));
80596               })
80597               .call(svgIcon('#iD-icon-close'));
80598
80599           headerEnter
80600               .append('h3')
80601               .text(t('map_data.title'));
80602
80603
80604           var body = selection.selectAll('.body')
80605               .data([0]);
80606
80607           body = body.enter()
80608               .append('div')
80609               .attr('class', 'body')
80610               .merge(body);
80611
80612           var editor = body.selectAll('.data-editor')
80613               .data([0]);
80614
80615           editor.enter()
80616               .append('div')
80617               .attr('class', 'modal-section data-editor')
80618               .merge(editor)
80619               .call(dataHeader.datum(_datum))
80620               .call(quickLinks.choices(choices));
80621
80622           var rte = body.selectAll('.raw-tag-editor')
80623               .data([0]);
80624
80625           rte.enter()
80626               .append('div')
80627               .attr('class', 'raw-tag-editor inspector-inner data-editor')
80628               .merge(rte)
80629               .call(rawTagEditor
80630                   .expanded(true)
80631                   .readOnlyTags([/./])
80632                   .tags((_datum && _datum.properties) || {})
80633                   .state('hover')
80634               );
80635       }
80636
80637
80638       dataEditor.datum = function(val) {
80639           if (!arguments.length) return _datum;
80640           _datum = val;
80641           return this;
80642       };
80643
80644
80645       return dataEditor;
80646   }
80647
80648   function uiDataHeader() {
80649       var _datum;
80650
80651
80652       function dataHeader(selection) {
80653           var header = selection.selectAll('.data-header')
80654               .data(
80655                   (_datum ? [_datum] : []),
80656                   function(d) { return d.__featurehash__; }
80657               );
80658
80659           header.exit()
80660               .remove();
80661
80662           var headerEnter = header.enter()
80663               .append('div')
80664               .attr('class', 'data-header');
80665
80666           var iconEnter = headerEnter
80667               .append('div')
80668               .attr('class', 'data-header-icon');
80669
80670           iconEnter
80671               .append('div')
80672               .attr('class', 'preset-icon-28')
80673               .call(svgIcon('#iD-icon-data', 'note-fill'));
80674
80675           headerEnter
80676               .append('div')
80677               .attr('class', 'data-header-label')
80678               .text(t('map_data.layers.custom.title'));
80679       }
80680
80681
80682       dataHeader.datum = function(val) {
80683           if (!arguments.length) return _datum;
80684           _datum = val;
80685           return this;
80686       };
80687
80688
80689       return dataHeader;
80690   }
80691
80692   function uiEditMenu(context, operations) {
80693       var menu;
80694       var center = [0, 0];
80695       var offset = [0, 0];
80696       var tooltip;
80697
80698       var p = 8;               // top padding
80699       var m = 4;               // top margin
80700       var h = 15;              // height of icon
80701       var vpBottomMargin = 45; // viewport bottom margin
80702       var vpSideMargin = 35;   // viewport side margin
80703       var buttonWidth = 44;
80704       var buttonHeight = (2 * p + h);
80705       var menuWidth = buttonWidth;
80706       var menuHeight = (2 * m) + operations.length * buttonHeight;
80707       var menuSideMargin = 10;
80708       var tooltipWidth = 200;
80709       var tooltipHeight = 200;  // a reasonable guess, real height depends on tooltip contents
80710
80711
80712       var editMenu = function (selection) {
80713           if (!operations.length) return;
80714
80715           selection.node().parentNode.focus();
80716
80717           var isRTL = textDirection === 'rtl';
80718           var viewport = context.surfaceRect();
80719
80720           if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
80721               // menu is going left-to-right and near right viewport edge, go left instead
80722               isRTL = true;
80723           } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
80724               // menu is going right-to-left and near left viewport edge, go right instead
80725               isRTL = false;
80726           }
80727
80728           offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
80729
80730           if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
80731               // menu is near bottom viewport edge, shift upwards
80732               offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
80733           }
80734
80735           var origin = [ center[0] + offset[0], center[1] + offset[1] ];
80736
80737           menu = selection
80738               .append('g')
80739               .attr('class', 'edit-menu')
80740               .attr('transform', 'translate(' + origin + ')')
80741               .attr('opacity', 0);
80742
80743           menu
80744               .transition()
80745               .attr('opacity', 1);
80746
80747           menu
80748               .append('rect')
80749               .attr('class', 'edit-menu-background')
80750               .attr('x', 4)
80751               .attr('rx', 4)
80752               .attr('ry', 4)
80753               .attr('width', menuWidth)
80754               .attr('height', menuHeight)
80755               .attr('stroke-linecap', 'round');
80756
80757
80758           var button = menu.selectAll('.edit-menu-item')
80759               .data(operations)
80760               .enter()
80761               .append('g')
80762               .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
80763               .classed('disabled', function (d) { return d.disabled(); })
80764               .attr('transform', function (d, i) {
80765                   return 'translate(' + geoVecFloor([
80766                       0,
80767                       m + i * buttonHeight
80768                   ]).join(',') + ')';
80769               });
80770
80771           button
80772               .append('rect')
80773               .attr('x', 4)
80774               .attr('width', buttonWidth)
80775               .attr('height', buttonHeight)
80776               .on('click', click)
80777               .on('mousedown', mousedown)
80778               .on('mouseover', mouseover)
80779               .on('mouseout', mouseout);
80780
80781           button
80782               .append('use')
80783               .attr('width', '20')
80784               .attr('height', '20')
80785               .attr('transform', function () { return 'translate(' + [2 * p, 5] + ')'; })
80786               .attr('xlink:href', function (d) { return '#iD-operation-' + d.id; });
80787
80788           tooltip = select('#id-container')
80789               .append('div')
80790               .attr('class', 'tooltip-inner edit-menu-tooltip');
80791
80792
80793           function click(operation) {
80794               event.stopPropagation();
80795               if (operation.disabled()) return;
80796               operation();
80797               editMenu.close();
80798           }
80799
80800           function mousedown() {
80801               event.stopPropagation();  // https://github.com/openstreetmap/iD/issues/1869
80802           }
80803
80804           function mouseover(d, i) {
80805               var tipX, tipY;
80806
80807               if (!isRTL) {
80808                   tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
80809               } else {
80810                   tipX = viewport.left + origin[0] - 4 - tooltipWidth;
80811               }
80812
80813               if (tipX + tooltipWidth > viewport.right) {
80814                   // tip is going left-to-right and near right viewport edge, go left instead
80815                   tipX = viewport.left + origin[0] - 4 - tooltipWidth;
80816               } else if (tipX < viewport.left) {
80817                   // tip is going right-to-left and near left viewport edge, go right instead
80818                   tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
80819               }
80820
80821               tipY = viewport.top + origin[1] + (i * buttonHeight);
80822               if (tipY + tooltipHeight > viewport.bottom) {
80823                   // tip is near bottom viewport edge, shift upwards
80824                   tipY -= tipY + tooltipHeight - viewport.bottom;
80825               }
80826
80827               tooltip
80828                   .style('left', tipX + 'px')
80829                   .style('top', tipY + 'px')
80830                   .style('display', 'block')
80831                   .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
80832           }
80833
80834           function mouseout() {
80835               tooltip.style('display', 'none');
80836           }
80837       };
80838
80839
80840       editMenu.close = function () {
80841           if (menu) {
80842               menu
80843                   .style('pointer-events', 'none')
80844                   .transition()
80845                   .attr('opacity', 0)
80846                   .remove();
80847           }
80848
80849           if (tooltip) {
80850               tooltip.remove();
80851           }
80852       };
80853
80854
80855       editMenu.center = function (_) {
80856           if (!arguments.length) return center;
80857           center = _;
80858           return editMenu;
80859       };
80860
80861
80862       return editMenu;
80863   }
80864
80865   function uiPresetIcon() {
80866       var preset, geometry;
80867
80868
80869       function presetIcon(selection) {
80870           selection.each(render);
80871       }
80872
80873
80874       function getIcon(p, geom) {
80875           if (p.icon)
80876               return p.icon;
80877           else if (geom === 'line')
80878               return 'iD-other-line';
80879           else if (geom === 'vertex')
80880               return p.isFallback() ? '' : 'temaki-vertex';
80881           else
80882               return 'maki-marker-stroked';
80883       }
80884
80885
80886       function render() {
80887           var selection = select(this);
80888           var p = preset.apply(this, arguments);
80889           var geom = geometry.apply(this, arguments);
80890           var picon = getIcon(p, geom);
80891           var isMaki = /^maki-/.test(picon);
80892           var isTemaki = /^temaki-/.test(picon);
80893           var isFa = /^fa[srb]-/.test(picon);
80894           var isPOI = isMaki || isTemaki || isFa;
80895           var isCategory = !p.setTags;
80896           var drawLine = geom === 'line' && !isCategory;
80897           var isFramed = (geom === 'area' || drawLine || geom === 'vertex');
80898
80899           var tags = !isCategory ? p.setTags({}, geom) : {};
80900           for (var k in tags) {
80901               if (tags[k] === '*') {
80902                   tags[k] = 'yes';
80903               }
80904           }
80905           var tagClasses = svgTagClasses().getClassesString(tags, '');
80906
80907           var fill = selection.selectAll('.preset-icon-fill')
80908               .data([0]);
80909
80910           fill = fill.enter()
80911               .append('div')
80912               .merge(fill);
80913
80914           fill
80915               .attr('class', function() {
80916                   return 'preset-icon-fill preset-icon-fill-' + geom + ' ' + tagClasses;
80917               });
80918
80919           var line = selection.selectAll('.preset-icon-line')
80920               .data(drawLine ? [0] : []);
80921
80922           line.exit()
80923               .remove();
80924
80925           // draw the line parametrically
80926           var w = 60, h = 60, y = 43, l = 36, r = 2.5;
80927           var x1 = (w - l)/2, x2 = x1 + l;
80928
80929           var lineEnter = line.enter()
80930               .append('svg')
80931               .attr('class', 'preset-icon-line')
80932               .attr('width', w)
80933               .attr('height', h)
80934               .attr('viewBox', '0 0 ' + w + ' ' + h);
80935
80936           lineEnter.append('path')
80937               .attr('d', 'M' + x1 + ' ' + y + ' L' + x2 + ' ' + y)
80938               .attr('class', 'line casing');
80939           lineEnter.append('path')
80940               .attr('d', 'M' + x1 + ' ' + y + ' L' + x2 + ' ' + y)
80941               .attr('class', 'line stroke');
80942           lineEnter.append('circle')
80943               .attr('class', 'vertex')
80944               .attr('cx', x1 - 1)
80945               .attr('cy', y)
80946               .attr('r', r);
80947           lineEnter.append('circle')
80948               .attr('class', 'vertex')
80949               .attr('cx', x2 + 1)
80950               .attr('cy', y)
80951               .attr('r', r);
80952
80953           line = lineEnter.merge(line);
80954
80955           line.selectAll('path.stroke')
80956               .attr('class', 'line stroke ' + tagClasses);
80957           line.selectAll('path.casing')
80958               .attr('class', 'line casing ' + tagClasses);
80959
80960
80961           var areaFrame = selection.selectAll('.preset-icon-frame')
80962               .data((geom === 'area') ? [0] : []);
80963
80964           areaFrame.exit()
80965               .remove();
80966
80967           areaFrame = areaFrame.enter()
80968               .append('div')
80969               .attr('class', 'preset-icon-frame')
80970               .call(svgIcon('#iD-preset-icon-frame'));
80971
80972
80973           var icon = selection.selectAll('.preset-icon')
80974               .data([0]);
80975
80976           icon = icon.enter()
80977               .append('div')
80978               .attr('class', 'preset-icon')
80979               .call(svgIcon(''))
80980               .merge(icon);
80981
80982           icon
80983               .attr('class', 'preset-icon ' + geom + '-geom ' + 'preset-icon-' +
80984                   (isPOI ? (isFramed ? '24' : '28') : (isFramed ? '44' : '60'))
80985               );
80986
80987           icon.selectAll('svg')
80988               .attr('class', function() {
80989                   return 'icon ' + picon + ' ' + (isPOI && geom !== 'line'  ? '' : tagClasses);
80990               });
80991
80992           icon.selectAll('use')
80993               .attr('href', '#' + picon + (isMaki ? '-15' : ''));
80994       }
80995
80996
80997       presetIcon.preset = function(val) {
80998           if (!arguments.length) return preset;
80999           preset = utilFunctor(val);
81000           return presetIcon;
81001       };
81002
81003
81004       presetIcon.geometry = function(val) {
81005           if (!arguments.length) return geometry;
81006           geometry = utilFunctor(val);
81007           return presetIcon;
81008       };
81009
81010       return presetIcon;
81011   }
81012
81013   function uiQuickLinks() {
81014       var _choices = [];
81015
81016
81017       function quickLinks(selection) {
81018           var container = selection.selectAll('.quick-links')
81019               .data([0]);
81020
81021           container = container.enter()
81022               .append('div')
81023               .attr('class', 'quick-links')
81024               .merge(container);
81025
81026           var items = container.selectAll('.quick-link')
81027               .data(_choices, function(d) { return d.id; });
81028
81029           items.exit()
81030               .remove();
81031
81032           items.enter()
81033               .append('a')
81034               .attr('class', function(d) { return 'quick-link quick-link-' + d.id; })
81035               .attr('href', '#')
81036               .text(function(d) { return t(d.label); })
81037               .each(function(d) {
81038                   if (typeof d.tooltip !== 'function') return;
81039                   select(this)
81040                       .call(tooltip().html(true).title(d.tooltip).placement('bottom'));
81041               })
81042               .on('click', function(d) {
81043                   if (typeof d.click !== 'function') return;
81044                   event.preventDefault();
81045                   d.click(d);
81046               });
81047       }
81048
81049
81050       //  val should be an array of choices like:
81051       //    [{
81052       //       id: 'link-id',
81053       //       label: 'translation.key',
81054       //       tooltip: function(d),
81055       //       click: function(d)
81056       //    }, ..]
81057       quickLinks.choices = function(val) {
81058           if (!arguments.length) return _choices;
81059           _choices = val;
81060           return quickLinks;
81061       };
81062
81063
81064       return quickLinks;
81065   }
81066
81067   function uiRawMemberEditor(context) {
81068       var taginfo = services.taginfo;
81069       var _entityID;
81070
81071       function downloadMember(d) {
81072           event.preventDefault();
81073
81074           // display the loading indicator
81075           select(this.parentNode).classed('tag-reference-loading', true);
81076           context.loadEntity(d.id);
81077       }
81078
81079       function zoomToMember(d) {
81080           event.preventDefault();
81081
81082           var entity = context.entity(d.id);
81083           context.map().zoomTo(entity);
81084
81085           // highlight the feature in case it wasn't previously on-screen
81086           utilHighlightEntities([d.id], true, context);
81087       }
81088
81089
81090       function selectMember(d) {
81091           event.preventDefault();
81092
81093           // remove the hover-highlight styling
81094           utilHighlightEntities([d.id], false, context);
81095
81096           var entity = context.entity(d.id);
81097           var mapExtent = context.map().extent();
81098           if (!entity.intersects(mapExtent, context.graph())) {
81099               // zoom to the entity if its extent is not visible now
81100               context.map().zoomToEase(entity);
81101           }
81102
81103           context.enter(modeSelect(context, [d.id]));
81104       }
81105
81106
81107       function changeRole(d) {
81108           var oldRole = d.role;
81109           var newRole = select(this).property('value');
81110
81111           if (oldRole !== newRole) {
81112               var member = { id: d.id, type: d.type, role: newRole };
81113               context.perform(
81114                   actionChangeMember(d.relation.id, member, d.index),
81115                   t('operations.change_role.annotation')
81116               );
81117           }
81118       }
81119
81120
81121       function deleteMember(d) {
81122           context.perform(
81123               actionDeleteMember(d.relation.id, d.index),
81124               t('operations.delete_member.annotation')
81125           );
81126
81127           if (!context.hasEntity(d.relation.id)) {
81128               context.enter(modeBrowse(context));
81129           }
81130
81131           utilHighlightEntities([d.id], false, context);
81132       }
81133
81134
81135       function rawMemberEditor(selection) {
81136           var entity = context.entity(_entityID);
81137           var memberships = [];
81138
81139           entity.members.slice(0, 1000).forEach(function(member, index) {
81140               memberships.push({
81141                   index: index,
81142                   id: member.id,
81143                   type: member.type,
81144                   role: member.role,
81145                   relation: entity,
81146                   member: context.hasEntity(member.id)
81147               });
81148           });
81149
81150           var gt = entity.members.length > 1000 ? '>' : '';
81151           selection.call(uiDisclosure(context, 'raw_member_editor', true)
81152               .title(t('inspector.all_members') + ' (' + gt + memberships.length + ')')
81153               .expanded(true)
81154               .updatePreference(false)
81155               .on('toggled', function(expanded) {
81156                   if (expanded) {
81157                       selection.node().parentNode.scrollTop += 200;
81158                   }
81159               })
81160               .content(content)
81161           );
81162
81163
81164           function content(selection) {
81165               var list = selection.selectAll('.member-list')
81166                   .data([0]);
81167
81168               list = list.enter()
81169                   .append('ul')
81170                   .attr('class', 'member-list')
81171                   .merge(list);
81172
81173
81174               var items = list.selectAll('li')
81175                   .data(memberships, function(d) {
81176                       return osmEntity.key(d.relation) + ',' + d.index + ',' +
81177                           (d.member ? osmEntity.key(d.member) : 'incomplete');
81178                   });
81179
81180               items.exit()
81181                   .each(unbind)
81182                   .remove();
81183
81184               var itemsEnter = items.enter()
81185                   .append('li')
81186                   .attr('class', 'member-row form-field')
81187                   .classed('member-incomplete', function(d) { return !d.member; });
81188
81189               itemsEnter
81190                   .each(function(d) {
81191                       var item = select(this);
81192
81193                       var label = item
81194                           .append('label')
81195                           .attr('class', 'form-field-label');
81196
81197                       if (d.member) {
81198                           // highlight the member feature in the map while hovering on the list item
81199                           item
81200                               .on('mouseover', function() {
81201                                   utilHighlightEntities([d.id], true, context);
81202                               })
81203                               .on('mouseout', function() {
81204                                   utilHighlightEntities([d.id], false, context);
81205                               });
81206
81207                           var labelLink = label
81208                               .append('span')
81209                               .attr('class', 'label-text')
81210                               .append('a')
81211                               .attr('href', '#')
81212                               .on('click', selectMember);
81213
81214                           labelLink
81215                               .append('span')
81216                               .attr('class', 'member-entity-type')
81217                               .text(function(d) {
81218                                   var matched = context.presets().match(d.member, context.graph());
81219                                   return (matched && matched.name()) || utilDisplayType(d.member.id);
81220                               });
81221
81222                           labelLink
81223                               .append('span')
81224                               .attr('class', 'member-entity-name')
81225                               .text(function(d) { return utilDisplayName(d.member); });
81226
81227                           label
81228                               .append('button')
81229                               .attr('class', 'member-zoom')
81230                               .attr('title', t('icons.zoom_to'))
81231                               .attr('tabindex', -1)
81232                               .call(svgIcon('#iD-icon-geolocate'))
81233                               .on('click', zoomToMember);
81234
81235                       } else {
81236                           var labelText = label
81237                               .append('span')
81238                               .attr('class', 'label-text');
81239
81240                           labelText
81241                               .append('span')
81242                               .attr('class', 'member-entity-type')
81243                               .text(t('inspector.' + d.type, { id: d.id }));
81244
81245                           labelText
81246                               .append('span')
81247                               .attr('class', 'member-entity-name')
81248                               .text(t('inspector.incomplete', { id: d.id }));
81249
81250                           label
81251                               .append('button')
81252                               .attr('class', 'member-download')
81253                               .attr('title', t('icons.download'))
81254                               .attr('tabindex', -1)
81255                               .call(svgIcon('#iD-icon-load'))
81256                               .on('click', downloadMember);
81257                       }
81258                   });
81259
81260               var wrapEnter = itemsEnter
81261                   .append('div')
81262                   .attr('class', 'form-field-input-wrap form-field-input-member');
81263
81264               wrapEnter
81265                   .append('input')
81266                   .attr('class', 'member-role')
81267                   .property('type', 'text')
81268                   .attr('maxlength', 255)
81269                   .attr('placeholder', t('inspector.role'))
81270                   .call(utilNoAuto);
81271
81272               wrapEnter
81273                   .append('button')
81274                   .attr('tabindex', -1)
81275                   .attr('title', t('icons.remove'))
81276                   .attr('class', 'remove form-field-button member-delete')
81277                   .call(svgIcon('#iD-operation-delete'));
81278
81279               if (taginfo) {
81280                   wrapEnter.each(bindTypeahead);
81281               }
81282
81283
81284               // update
81285               items = items
81286                   .merge(itemsEnter);
81287
81288               items.select('input.member-role')
81289                   .property('value', function(d) { return d.role; })
81290                   .on('blur', changeRole)
81291                   .on('change', changeRole);
81292
81293               items.select('button.member-delete')
81294                   .on('click', deleteMember);
81295
81296
81297
81298               function bindTypeahead(d) {
81299                   var row = select(this);
81300                   var role = row.selectAll('input.member-role');
81301                   var origValue = role.property('value');
81302
81303                   function sort(value, data) {
81304                       var sameletter = [];
81305                       var other = [];
81306                       for (var i = 0; i < data.length; i++) {
81307                           if (data[i].value.substring(0, value.length) === value) {
81308                               sameletter.push(data[i]);
81309                           } else {
81310                               other.push(data[i]);
81311                           }
81312                       }
81313                       return sameletter.concat(other);
81314                   }
81315
81316                   role.call(uiCombobox(context, 'member-role')
81317                       .fetcher(function(role, callback) {
81318                           // The `geometry` param is used in the `taginfo.js` interface for
81319                           // filtering results, as a key into the `tag_members_fractions`
81320                           // object.  If we don't know the geometry because the member is
81321                           // not yet downloaded, it's ok to guess based on type.
81322                           var geometry;
81323                           if (d.member) {
81324                               geometry = context.geometry(d.member.id);
81325                           } else if (d.type === 'relation') {
81326                               geometry = 'relation';
81327                           } else if (d.type === 'way') {
81328                               geometry = 'line';
81329                           } else {
81330                               geometry = 'point';
81331                           }
81332
81333                           var rtype = entity.tags.type;
81334                           taginfo.roles({
81335                               debounce: true,
81336                               rtype: rtype || '',
81337                               geometry: geometry,
81338                               query: role
81339                           }, function(err, data) {
81340                               if (!err) callback(sort(role, data));
81341                           });
81342                       })
81343                       .on('cancel', function() {
81344                           role.property('value', origValue);
81345                       })
81346                   );
81347               }
81348
81349
81350               function unbind() {
81351                   var row = select(this);
81352
81353                   row.selectAll('input.member-role')
81354                       .call(uiCombobox.off);
81355               }
81356           }
81357       }
81358
81359
81360       rawMemberEditor.entityID = function(val) {
81361           if (!arguments.length) return _entityID;
81362           _entityID = val;
81363           return rawMemberEditor;
81364       };
81365
81366
81367       return rawMemberEditor;
81368   }
81369
81370   function uiRawMembershipEditor(context) {
81371       var taginfo = services.taginfo;
81372       var nearbyCombo = uiCombobox(context, 'parent-relation')
81373           .minItems(1)
81374           .fetcher(fetchNearbyRelations);
81375       var _inChange = false;
81376       var _entityID;
81377       var _showBlank;
81378
81379
81380       function selectRelation(d) {
81381           event.preventDefault();
81382
81383           // remove the hover-highlight styling
81384           utilHighlightEntities([d.relation.id], false, context);
81385
81386           context.enter(modeSelect(context, [d.relation.id]));
81387       }
81388
81389
81390       function changeRole(d) {
81391           if (d === 0) return;    // called on newrow (shoudn't happen)
81392           if (_inChange) return;  // avoid accidental recursive call #5731
81393
81394           var oldRole = d.member.role;
81395           var newRole = select(this).property('value');
81396
81397           if (oldRole !== newRole) {
81398               _inChange = true;
81399               context.perform(
81400                   actionChangeMember(d.relation.id, assignIn({}, d.member, { role: newRole }), d.index),
81401                   t('operations.change_role.annotation')
81402               );
81403           }
81404           _inChange = false;
81405       }
81406
81407
81408       function addMembership(d, role) {
81409           this.blur();           // avoid keeping focus on the button
81410           _showBlank = false;
81411
81412           var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
81413
81414           if (d.relation) {
81415               context.perform(
81416                   actionAddMember(d.relation.id, member),
81417                   t('operations.add_member.annotation')
81418               );
81419
81420           } else {
81421               var relation = osmRelation();
81422               context.perform(
81423                   actionAddEntity(relation),
81424                   actionAddMember(relation.id, member),
81425                   t('operations.add.annotation.relation')
81426               );
81427
81428               context.enter(modeSelect(context, [relation.id]).newFeature(true));
81429           }
81430       }
81431
81432
81433       function deleteMembership(d) {
81434           this.blur();           // avoid keeping focus on the button
81435           if (d === 0) return;   // called on newrow (shoudn't happen)
81436
81437           context.perform(
81438               actionDeleteMember(d.relation.id, d.index),
81439               t('operations.delete_member.annotation')
81440           );
81441       }
81442
81443
81444       function fetchNearbyRelations(q, callback) {
81445           var newRelation = { relation: null, value: t('inspector.new_relation') };
81446           var result = [];
81447           var graph = context.graph();
81448
81449           context.intersects(context.extent()).forEach(function(entity) {
81450               if (entity.type !== 'relation' || entity.id === _entityID) return;
81451
81452               var matched = context.presets().match(entity, graph);
81453               var presetName = (matched && matched.name()) || t('inspector.relation');
81454               var entityName = utilDisplayName(entity) || '';
81455
81456               var value = presetName + ' ' + entityName;
81457               if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1) return;
81458
81459               result.push({ relation: entity, value: value });
81460           });
81461
81462           result.sort(function(a, b) {
81463               return osmRelation.creationOrder(a.relation, b.relation);
81464           });
81465
81466           // Dedupe identical names by appending relation id - see #2891
81467           var dupeGroups = filter(
81468               groupBy(result, 'value'),
81469               function(v) { return v.length > 1; }
81470           );
81471
81472           dupeGroups.forEach(function(group) {
81473               group.forEach(function(obj) {
81474                   obj.value += ' ' + obj.relation.id;
81475               });
81476           });
81477
81478           result.forEach(function(obj) {
81479               obj.title = obj.value;
81480           });
81481
81482           result.unshift(newRelation);
81483           callback(result);
81484       }
81485
81486
81487       function rawMembershipEditor(selection) {
81488           var entity = context.entity(_entityID);
81489           var parents = context.graph().parentRelations(entity);
81490           var memberships = [];
81491
81492           parents.slice(0, 1000).forEach(function(relation) {
81493               relation.members.forEach(function(member, index) {
81494                   if (member.id === entity.id) {
81495                       memberships.push({ relation: relation, member: member, index: index });
81496                   }
81497               });
81498           });
81499
81500           var gt = parents.length > 1000 ? '>' : '';
81501           selection.call(uiDisclosure(context, 'raw_membership_editor', true)
81502               .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
81503               .expanded(true)
81504               .updatePreference(false)
81505               .on('toggled', function(expanded) {
81506                   if (expanded) { selection.node().parentNode.scrollTop += 200; }
81507               })
81508               .content(content)
81509           );
81510
81511
81512           function content(selection) {
81513               var list = selection.selectAll('.member-list')
81514                   .data([0]);
81515
81516               list = list.enter()
81517                   .append('ul')
81518                   .attr('class', 'member-list')
81519                   .merge(list);
81520
81521
81522               var items = list.selectAll('li.member-row-normal')
81523                   .data(memberships, function(d) {
81524                       return osmEntity.key(d.relation) + ',' + d.index;
81525                   });
81526
81527               items.exit()
81528                   .each(unbind)
81529                   .remove();
81530
81531               // Enter
81532               var itemsEnter = items.enter()
81533                   .append('li')
81534                   .attr('class', 'member-row member-row-normal form-field');
81535
81536               itemsEnter.each(function(d){
81537                   // highlight the relation in the map while hovering on the list item
81538                   select(this)
81539                       .on('mouseover', function() {
81540                           utilHighlightEntities([d.relation.id], true, context);
81541                       })
81542                       .on('mouseout', function() {
81543                           utilHighlightEntities([d.relation.id], false, context);
81544                       });
81545               });
81546
81547               var labelEnter = itemsEnter
81548                   .append('label')
81549                   .attr('class', 'form-field-label')
81550                   .append('span')
81551                   .attr('class', 'label-text')
81552                   .append('a')
81553                   .attr('href', '#')
81554                   .on('click', selectRelation);
81555
81556               labelEnter
81557                   .append('span')
81558                   .attr('class', 'member-entity-type')
81559                   .text(function(d) {
81560                       var matched = context.presets().match(d.relation, context.graph());
81561                       return (matched && matched.name()) || t('inspector.relation');
81562                   });
81563
81564               labelEnter
81565                   .append('span')
81566                   .attr('class', 'member-entity-name')
81567                   .text(function(d) { return utilDisplayName(d.relation); });
81568
81569               var wrapEnter = itemsEnter
81570                   .append('div')
81571                   .attr('class', 'form-field-input-wrap form-field-input-member');
81572
81573               wrapEnter
81574                   .append('input')
81575                   .attr('class', 'member-role')
81576                   .property('type', 'text')
81577                   .attr('maxlength', 255)
81578                   .attr('placeholder', t('inspector.role'))
81579                   .call(utilNoAuto)
81580                   .property('value', function(d) { return d.member.role; })
81581                   .on('blur', changeRole)
81582                   .on('change', changeRole);
81583
81584               wrapEnter
81585                   .append('button')
81586                   .attr('tabindex', -1)
81587                   .attr('class', 'remove form-field-button member-delete')
81588                   .call(svgIcon('#iD-operation-delete'))
81589                   .on('click', deleteMembership);
81590
81591               if (taginfo) {
81592                   wrapEnter.each(bindTypeahead);
81593               }
81594
81595
81596               var newMembership = list.selectAll('.member-row-new')
81597                   .data(_showBlank ? [0] : []);
81598
81599               // Exit
81600               newMembership.exit()
81601                   .remove();
81602
81603               // Enter
81604               var newMembershipEnter = newMembership.enter()
81605                   .append('li')
81606                   .attr('class', 'member-row member-row-new form-field');
81607
81608               newMembershipEnter
81609                   .append('label')
81610                   .attr('class', 'form-field-label')
81611                   .append('input')
81612                   .attr('placeholder', t('inspector.choose_relation'))
81613                   .attr('type', 'text')
81614                   .attr('class', 'member-entity-input')
81615                   .call(utilNoAuto);
81616
81617               var newWrapEnter = newMembershipEnter
81618                   .append('div')
81619                   .attr('class', 'form-field-input-wrap form-field-input-member');
81620
81621               newWrapEnter
81622                   .append('input')
81623                   .attr('class', 'member-role')
81624                   .property('type', 'text')
81625                   .attr('maxlength', 255)
81626                   .attr('placeholder', t('inspector.role'))
81627                   .call(utilNoAuto);
81628
81629               newWrapEnter
81630                   .append('button')
81631                   .attr('tabindex', -1)
81632                   .attr('class', 'remove form-field-button member-delete')
81633                   .call(svgIcon('#iD-operation-delete'))
81634                   .on('click', function() {
81635                       list.selectAll('.member-row-new')
81636                           .remove();
81637                   });
81638
81639               // Update
81640               newMembership = newMembership
81641                   .merge(newMembershipEnter);
81642
81643               newMembership.selectAll('.member-entity-input')
81644                   .on('blur', cancelEntity)   // if it wasn't accepted normally, cancel it
81645                   .call(nearbyCombo
81646                       .on('accept', acceptEntity)
81647                       .on('cancel', cancelEntity)
81648                   );
81649
81650
81651               // Container for the Add button
81652               var addRow = selection.selectAll('.add-row')
81653                   .data([0]);
81654
81655               // enter
81656               var addRowEnter = addRow.enter()
81657                   .append('div')
81658                   .attr('class', 'add-row');
81659
81660               addRowEnter
81661                   .append('button')
81662                   .attr('class', 'add-relation')
81663                   .call(svgIcon('#iD-icon-plus', 'light'));
81664
81665               addRowEnter
81666                   .append('div')
81667                   .attr('class', 'space-value');   // preserve space
81668
81669               addRowEnter
81670                   .append('div')
81671                   .attr('class', 'space-buttons');  // preserve space
81672
81673               // update
81674               addRow = addRow
81675                   .merge(addRowEnter);
81676
81677               addRow.select('.add-relation')
81678                   .on('click', function() {
81679                       _showBlank = true;
81680                       content(selection);
81681                       list.selectAll('.member-entity-input').node().focus();
81682                   });
81683
81684
81685               function acceptEntity(d) {
81686                   if (!d) {
81687                       cancelEntity();
81688                       return;
81689                   }
81690                   var role = list.selectAll('.member-row-new .member-role').property('value');
81691                   addMembership(d, role);
81692               }
81693
81694
81695               function cancelEntity() {
81696                   var input = newMembership.selectAll('.member-entity-input');
81697                   input.property('value', '');
81698               }
81699
81700
81701               function bindTypeahead(d) {
81702                   var row = select(this);
81703                   var role = row.selectAll('input.member-role');
81704                   var origValue = role.property('value');
81705
81706                   function sort(value, data) {
81707                       var sameletter = [];
81708                       var other = [];
81709                       for (var i = 0; i < data.length; i++) {
81710                           if (data[i].value.substring(0, value.length) === value) {
81711                               sameletter.push(data[i]);
81712                           } else {
81713                               other.push(data[i]);
81714                           }
81715                       }
81716                       return sameletter.concat(other);
81717                   }
81718
81719                   role.call(uiCombobox(context, 'member-role')
81720                       .fetcher(function(role, callback) {
81721                           var rtype = d.relation.tags.type;
81722                           taginfo.roles({
81723                               debounce: true,
81724                               rtype: rtype || '',
81725                               geometry: context.geometry(_entityID),
81726                               query: role
81727                           }, function(err, data) {
81728                               if (!err) callback(sort(role, data));
81729                           });
81730                       })
81731                       .on('cancel', function() {
81732                           role.property('value', origValue);
81733                       })
81734                   );
81735               }
81736
81737
81738               function unbind() {
81739                   var row = select(this);
81740
81741                   row.selectAll('input.member-role')
81742                       .call(uiCombobox.off);
81743               }
81744           }
81745       }
81746
81747
81748       rawMembershipEditor.entityID = function(val) {
81749           if (!arguments.length) return _entityID;
81750           _entityID = val;
81751           _showBlank = false;
81752           return rawMembershipEditor;
81753       };
81754
81755
81756       return rawMembershipEditor;
81757   }
81758
81759   // Pass `which` object of the form:
81760   // {
81761   //   key: 'string',     // required
81762   //   value: 'string'    // optional
81763   // }
81764   //   -or-
81765   // {
81766   //   rtype: 'string'    // relation type  (e.g. 'multipolygon')
81767   // }
81768   //   -or-
81769   // {
81770   //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
81771   // }
81772   //
81773   function uiTagReference(what) {
81774       var wikibase = what.qid ? services.wikidata : services.osmWikibase;
81775       var tagReference = {};
81776
81777       var _button = select(null);
81778       var _body = select(null);
81779       var _loaded;
81780       var _showing;
81781
81782
81783       function load() {
81784           if (!wikibase) return;
81785
81786           _button
81787               .classed('tag-reference-loading', true);
81788
81789           wikibase.getDocs(what, gotDocs);
81790       }
81791
81792
81793       function gotDocs(err, docs) {
81794           _body.html('');
81795
81796           if (!docs || !docs.title) {
81797               _body
81798                   .append('p')
81799                   .attr('class', 'tag-reference-description')
81800                   .text(t('inspector.no_documentation_key'));
81801               done();
81802               return;
81803           }
81804
81805           if (docs.imageURL) {
81806               _body
81807                   .append('img')
81808                   .attr('class', 'tag-reference-wiki-image')
81809                   .attr('src', docs.imageURL)
81810                   .on('load', function() { done(); })
81811                   .on('error', function() { select(this).remove(); done(); });
81812           } else {
81813               done();
81814           }
81815
81816           _body
81817               .append('p')
81818               .attr('class', 'tag-reference-description')
81819               .text(docs.description || t('inspector.no_documentation_key'))
81820               .append('a')
81821               .attr('class', 'tag-reference-edit')
81822               .attr('target', '_blank')
81823               .attr('tabindex', -1)
81824               .attr('title', t('inspector.edit_reference'))
81825               .attr('href', docs.editURL)
81826               .call(svgIcon('#iD-icon-edit', 'inline'));
81827
81828           if (docs.wiki) {
81829               _body
81830                 .append('a')
81831                 .attr('class', 'tag-reference-link')
81832                 .attr('target', '_blank')
81833                 .attr('tabindex', -1)
81834                 .attr('href', docs.wiki.url)
81835                 .call(svgIcon('#iD-icon-out-link', 'inline'))
81836                 .append('span')
81837                 .text(t(docs.wiki.text));
81838           }
81839
81840           // Add link to info about "good changeset comments" - #2923
81841           if (what.key === 'comment') {
81842               _body
81843                   .append('a')
81844                   .attr('class', 'tag-reference-comment-link')
81845                   .attr('target', '_blank')
81846                   .attr('tabindex', -1)
81847                   .call(svgIcon('#iD-icon-out-link', 'inline'))
81848                   .attr('href', t('commit.about_changeset_comments_link'))
81849                   .append('span')
81850                   .text(t('commit.about_changeset_comments'));
81851           }
81852       }
81853
81854
81855       function done() {
81856           _loaded = true;
81857
81858           _button
81859               .classed('tag-reference-loading', false);
81860
81861           _body
81862               .classed('expanded', true)
81863               .transition()
81864               .duration(200)
81865               .style('max-height', '200px')
81866               .style('opacity', '1');
81867
81868           _showing = true;
81869       }
81870
81871
81872       function hide() {
81873           _body
81874               .transition()
81875               .duration(200)
81876               .style('max-height', '0px')
81877               .style('opacity', '0')
81878               .on('end', function () {
81879                   _body.classed('expanded', false);
81880               });
81881
81882           _showing = false;
81883       }
81884
81885
81886       tagReference.button = function(selection) {
81887           _button = selection.selectAll('.tag-reference-button')
81888               .data([0]);
81889
81890           _button = _button.enter()
81891               .append('button')
81892               .attr('class', 'tag-reference-button')
81893               .attr('title', t('icons.information'))
81894               .attr('tabindex', -1)
81895               .call(svgIcon('#iD-icon-inspect'))
81896               .merge(_button);
81897
81898           _button
81899               .on('click', function () {
81900                   event.stopPropagation();
81901                   event.preventDefault();
81902                   this.blur();    // avoid keeping focus on the button - #4641
81903                   if (_showing) {
81904                       hide();
81905                   } else if (_loaded) {
81906                       done();
81907                   } else {
81908                       load();
81909                   }
81910               });
81911       };
81912
81913
81914       tagReference.body = function(selection) {
81915           var itemID = what.qid || what.rtype || (what.key + '-' + what.value);
81916           _body = selection.selectAll('.tag-reference-body')
81917               .data([itemID], function(d) { return d; });
81918
81919           _body.exit()
81920               .remove();
81921
81922           _body = _body.enter()
81923               .append('div')
81924               .attr('class', 'tag-reference-body')
81925               .style('max-height', '0')
81926               .style('opacity', '0')
81927               .merge(_body);
81928
81929           if (_showing === false) {
81930               hide();
81931           }
81932       };
81933
81934
81935       tagReference.showing = function(val) {
81936           if (!arguments.length) return _showing;
81937           _showing = val;
81938           return tagReference;
81939       };
81940
81941
81942       return tagReference;
81943   }
81944
81945   // This currently only works with the 'restrictions' field
81946   // It borrows some code from uiHelp
81947
81948   function uiFieldHelp(context, fieldName) {
81949       var fieldHelp = {};
81950       var _inspector = select(null);
81951       var _wrap = select(null);
81952       var _body = select(null);
81953
81954       var fieldHelpKeys = {
81955           restrictions: [
81956               ['about',[
81957                   'about',
81958                   'from_via_to',
81959                   'maxdist',
81960                   'maxvia'
81961               ]],
81962               ['inspecting',[
81963                   'about',
81964                   'from_shadow',
81965                   'allow_shadow',
81966                   'restrict_shadow',
81967                   'only_shadow',
81968                   'restricted',
81969                   'only'
81970               ]],
81971               ['modifying',[
81972                   'about',
81973                   'indicators',
81974                   'allow_turn',
81975                   'restrict_turn',
81976                   'only_turn'
81977               ]],
81978               ['tips',[
81979                   'simple',
81980                   'simple_example',
81981                   'indirect',
81982                   'indirect_example',
81983                   'indirect_noedit'
81984               ]]
81985           ]
81986       };
81987
81988       var fieldHelpHeadings = {};
81989
81990       var replacements = {
81991           distField: t('restriction.controls.distance'),
81992           viaField: t('restriction.controls.via'),
81993           fromShadow: icon('#iD-turn-shadow', 'pre-text shadow from'),
81994           allowShadow: icon('#iD-turn-shadow', 'pre-text shadow allow'),
81995           restrictShadow: icon('#iD-turn-shadow', 'pre-text shadow restrict'),
81996           onlyShadow: icon('#iD-turn-shadow', 'pre-text shadow only'),
81997           allowTurn: icon('#iD-turn-yes', 'pre-text turn'),
81998           restrictTurn: icon('#iD-turn-no', 'pre-text turn'),
81999           onlyTurn: icon('#iD-turn-only', 'pre-text turn')
82000       };
82001
82002
82003       // For each section, squash all the texts into a single markdown document
82004       var docs = fieldHelpKeys[fieldName].map(function(key) {
82005           var helpkey = 'help.field.' + fieldName + '.' + key[0];
82006           var text = key[1].reduce(function(all, part) {
82007               var subkey = helpkey + '.' + part;
82008               var depth = fieldHelpHeadings[subkey];                     // is this subkey a heading?
82009               var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
82010               return all + hhh + t(subkey, replacements) + '\n\n';
82011           }, '');
82012
82013           return {
82014               key: helpkey,
82015               title: t(helpkey + '.title'),
82016               html: marked(text.trim())
82017           };
82018       });
82019
82020
82021       function show() {
82022           updatePosition();
82023
82024           _body
82025               .classed('hide', false)
82026               .style('opacity', '0')
82027               .transition()
82028               .duration(200)
82029               .style('opacity', '1');
82030       }
82031
82032
82033       function hide() {
82034           _body
82035               .classed('hide', true)
82036               .transition()
82037               .duration(200)
82038               .style('opacity', '0')
82039               .on('end', function () {
82040                   _body.classed('hide', true);
82041               });
82042       }
82043
82044
82045       function clickHelp(index) {
82046           var d = docs[index];
82047           var tkeys = fieldHelpKeys[fieldName][index][1];
82048
82049           _body.selectAll('.field-help-nav-item')
82050               .classed('active', function(d, i) { return i === index; });
82051
82052           var content = _body.selectAll('.field-help-content')
82053               .html(d.html);
82054
82055           // class the paragraphs so we can find and style them
82056           content.selectAll('p')
82057               .attr('class', function(d, i) { return tkeys[i]; });
82058
82059           // insert special content for certain help sections
82060           if (d.key === 'help.field.restrictions.inspecting') {
82061               content
82062                   .insert('img', 'p.from_shadow')
82063                   .attr('class', 'field-help-image cf')
82064                   .attr('src', context.imagePath('tr_inspect.gif'));
82065
82066           } else if (d.key === 'help.field.restrictions.modifying') {
82067               content
82068                   .insert('img', 'p.allow_turn')
82069                   .attr('class', 'field-help-image cf')
82070                   .attr('src', context.imagePath('tr_modify.gif'));
82071           }
82072       }
82073
82074
82075       fieldHelp.button = function(selection) {
82076           if (_body.empty()) return;
82077
82078           var button = selection.selectAll('.field-help-button')
82079               .data([0]);
82080
82081           // enter/update
82082           button.enter()
82083               .append('button')
82084               .attr('class', 'field-help-button')
82085               .attr('tabindex', -1)
82086               .call(svgIcon('#iD-icon-help'))
82087               .merge(button)
82088               .on('click', function () {
82089                   event.stopPropagation();
82090                   event.preventDefault();
82091                   if (_body.classed('hide')) {
82092                       show();
82093                   } else {
82094                       hide();
82095                   }
82096               });
82097       };
82098
82099
82100       function updatePosition() {
82101           var wrap = _wrap.node();
82102           var inspector = _inspector.node();
82103           var wRect = wrap.getBoundingClientRect();
82104           var iRect = inspector.getBoundingClientRect();
82105
82106           _body
82107               .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
82108       }
82109
82110
82111       fieldHelp.body = function(selection) {
82112           // This control expects the field to have a form-field-input-wrap div
82113           _wrap = selection.selectAll('.form-field-input-wrap');
82114           if (_wrap.empty()) return;
82115
82116           // absolute position relative to the inspector, so it "floats" above the fields
82117           _inspector = select('#sidebar .entity-editor-pane .inspector-body');
82118           if (_inspector.empty()) return;
82119
82120           _body = _inspector.selectAll('.field-help-body')
82121               .data([0]);
82122
82123           var enter = _body.enter()
82124               .append('div')
82125               .attr('class', 'field-help-body hide');   // initially hidden
82126
82127           var titleEnter = enter
82128               .append('div')
82129               .attr('class', 'field-help-title cf');
82130
82131           titleEnter
82132               .append('h2')
82133               .attr('class', ((textDirection === 'rtl') ? 'fr' : 'fl'))
82134               .text(t('help.field.' + fieldName + '.title'));
82135
82136           titleEnter
82137               .append('button')
82138               .attr('class', 'fr close')
82139               .on('click', function() {
82140                   event.stopPropagation();
82141                   event.preventDefault();
82142                   hide();
82143               })
82144               .call(svgIcon('#iD-icon-close'));
82145
82146           var navEnter = enter
82147               .append('div')
82148               .attr('class', 'field-help-nav cf');
82149
82150           var titles = docs.map(function(d) { return d.title; });
82151           navEnter.selectAll('.field-help-nav-item')
82152               .data(titles)
82153               .enter()
82154               .append('div')
82155               .attr('class', 'field-help-nav-item')
82156               .text(function(d) { return d; })
82157               .on('click', function(d, i) {
82158                   event.stopPropagation();
82159                   event.preventDefault();
82160                   clickHelp(i);
82161               });
82162
82163           enter
82164               .append('div')
82165               .attr('class', 'field-help-content');
82166
82167           _body = _body
82168               .merge(enter);
82169
82170           clickHelp(0);
82171       };
82172
82173
82174       return fieldHelp;
82175   }
82176
82177   function uiFieldCheck(field, context) {
82178       var dispatch$1 = dispatch('change');
82179       var options = field.strings && field.strings.options;
82180       var values = [];
82181       var texts = [];
82182
82183       var input = select(null);
82184       var text = select(null);
82185       var label = select(null);
82186       var reverser = select(null);
82187
82188       var _impliedYes;
82189       var _entityID;
82190       var _value;
82191
82192
82193       if (options) {
82194           for (var k in options) {
82195               values.push(k === 'undefined' ? undefined : k);
82196               texts.push(field.t('options.' + k, { 'default': options[k] }));
82197           }
82198       } else {
82199           values = [undefined, 'yes'];
82200           texts = [t('inspector.unknown'), t('inspector.check.yes')];
82201           if (field.type !== 'defaultCheck') {
82202               values.push('no');
82203               texts.push(t('inspector.check.no'));
82204           }
82205       }
82206
82207
82208       // Checks tags to see whether an undefined value is "Assumed to be Yes"
82209       function checkImpliedYes() {
82210           _impliedYes = (field.id === 'oneway_yes');
82211
82212           // hack: pretend `oneway` field is a `oneway_yes` field
82213           // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
82214           if (field.id === 'oneway') {
82215               var entity = context.entity(_entityID);
82216               for (var key in entity.tags) {
82217                   if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
82218                       _impliedYes = true;
82219                       texts[0] = t('presets.fields.oneway_yes.options.undefined');
82220                       break;
82221                   }
82222               }
82223           }
82224       }
82225
82226
82227       function reverserHidden() {
82228           if (!select('div.inspector-hover').empty()) return true;
82229           return !(_value === 'yes' || (_impliedYes && !_value));
82230       }
82231
82232
82233       function reverserSetText(selection) {
82234           var entity = context.hasEntity(_entityID);
82235           if (reverserHidden() || !entity) return selection;
82236
82237           var first = entity.first();
82238           var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
82239           var pseudoDirection = first < last;
82240           var icon = pseudoDirection ? '#iD-icon-forward' : '#iD-icon-backward';
82241
82242           selection.selectAll('.reverser-span')
82243               .text(t('inspector.check.reverser'))
82244               .call(svgIcon(icon, 'inline'));
82245
82246           return selection;
82247       }
82248
82249
82250       var check = function(selection) {
82251           checkImpliedYes();
82252
82253           label = selection.selectAll('.form-field-input-wrap')
82254               .data([0]);
82255
82256           var enter = label.enter()
82257               .append('label')
82258               .attr('class', 'form-field-input-wrap form-field-input-check');
82259
82260           enter
82261               .append('input')
82262               .property('indeterminate', field.type !== 'defaultCheck')
82263               .attr('type', 'checkbox')
82264               .attr('id', 'preset-input-' + field.safeid);
82265
82266           enter
82267               .append('span')
82268               .text(texts[0])
82269               .attr('class', 'value');
82270
82271           if (field.type === 'onewayCheck') {
82272               enter
82273                   .append('a')
82274                   .attr('id', 'preset-input-' + field.safeid + '-reverser')
82275                   .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
82276                   .attr('href', '#')
82277                   .append('span')
82278                   .attr('class', 'reverser-span');
82279           }
82280
82281           label = label.merge(enter);
82282           input = label.selectAll('input');
82283           text = label.selectAll('span.value');
82284
82285           input
82286               .on('click', function() {
82287                   event.stopPropagation();
82288                   var t = {};
82289                   t[field.key] = values[(values.indexOf(_value) + 1) % values.length];
82290
82291                   // Don't cycle through `alternating` or `reversible` states - #4970
82292                   // (They are supported as translated strings, but should not toggle with clicks)
82293                   if (t[field.key] === 'reversible' || t[field.key] === 'alternating') {
82294                       t[field.key] = values[0];
82295                   }
82296
82297                   dispatch$1.call('change', this, t);
82298               });
82299
82300           if (field.type === 'onewayCheck') {
82301               reverser = label.selectAll('.reverser');
82302
82303               reverser
82304                   .call(reverserSetText)
82305                   .on('click', function() {
82306                       event.preventDefault();
82307                       event.stopPropagation();
82308                       context.perform(
82309                           actionReverse(_entityID),
82310                           t('operations.reverse.annotation')
82311                       );
82312                       select(this)
82313                           .call(reverserSetText);
82314                   });
82315           }
82316       };
82317
82318
82319       check.entity = function(_) {
82320           if (!arguments.length) return context.hasEntity(_entityID);
82321           _entityID = _.id;
82322           return check;
82323       };
82324
82325
82326       check.tags = function(tags) {
82327
82328           function isChecked(val) {
82329               return val !== 'no' && val !== '' && val !== undefined && val !== null;
82330           }
82331
82332           function textFor(val) {
82333               if (val === '') val = undefined;
82334               var index = values.indexOf(val);
82335               return (index !== -1 ? texts[index] : ('"' + val + '"'));
82336           }
82337
82338           checkImpliedYes();
82339           _value = tags[field.key] && tags[field.key].toLowerCase();
82340
82341           if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
82342               _value = 'yes';
82343           }
82344
82345           input
82346               .property('indeterminate', field.type !== 'defaultCheck' && !_value)
82347               .property('checked', isChecked(_value));
82348
82349           text
82350               .text(textFor(_value));
82351
82352           label
82353               .classed('set', !!_value);
82354
82355           if (field.type === 'onewayCheck') {
82356               reverser
82357                   .classed('hide', reverserHidden())
82358                   .call(reverserSetText);
82359           }
82360       };
82361
82362
82363       check.focus = function() {
82364           input.node().focus();
82365       };
82366
82367       return utilRebind(check, dispatch$1, 'on');
82368   }
82369
82370   /** Used for built-in method references. */
82371   var arrayProto$1 = Array.prototype;
82372
82373   /** Built-in value references. */
82374   var splice$1 = arrayProto$1.splice;
82375
82376   /**
82377    * The base implementation of `_.pullAt` without support for individual
82378    * indexes or capturing the removed elements.
82379    *
82380    * @private
82381    * @param {Array} array The array to modify.
82382    * @param {number[]} indexes The indexes of elements to remove.
82383    * @returns {Array} Returns `array`.
82384    */
82385   function basePullAt(array, indexes) {
82386     var length = array ? indexes.length : 0,
82387         lastIndex = length - 1;
82388
82389     while (length--) {
82390       var index = indexes[length];
82391       if (length == lastIndex || index !== previous) {
82392         var previous = index;
82393         if (isIndex(index)) {
82394           splice$1.call(array, index, 1);
82395         } else {
82396           baseUnset(array, index);
82397         }
82398       }
82399     }
82400     return array;
82401   }
82402
82403   /**
82404    * Removes all elements from `array` that `predicate` returns truthy for
82405    * and returns an array of the removed elements. The predicate is invoked
82406    * with three arguments: (value, index, array).
82407    *
82408    * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
82409    * to pull elements from an array by value.
82410    *
82411    * @static
82412    * @memberOf _
82413    * @since 2.0.0
82414    * @category Array
82415    * @param {Array} array The array to modify.
82416    * @param {Function} [predicate=_.identity] The function invoked per iteration.
82417    * @returns {Array} Returns the new array of removed elements.
82418    * @example
82419    *
82420    * var array = [1, 2, 3, 4];
82421    * var evens = _.remove(array, function(n) {
82422    *   return n % 2 == 0;
82423    * });
82424    *
82425    * console.log(array);
82426    * // => [1, 3]
82427    *
82428    * console.log(evens);
82429    * // => [2, 4]
82430    */
82431   function remove$8(array, predicate) {
82432     var result = [];
82433     if (!(array && array.length)) {
82434       return result;
82435     }
82436     var index = -1,
82437         indexes = [],
82438         length = array.length;
82439
82440     predicate = baseIteratee(predicate, 3);
82441     while (++index < length) {
82442       var value = array[index];
82443       if (predicate(value, index, array)) {
82444         result.push(value);
82445         indexes.push(index);
82446       }
82447     }
82448     basePullAt(array, indexes);
82449     return result;
82450   }
82451
82452   function uiFieldCombo(field, context) {
82453       var dispatch$1 = dispatch('change');
82454       var nominatim = services.geocoder;
82455       var taginfo = services.taginfo;
82456       var isMulti = (field.type === 'multiCombo');
82457       var isNetwork = (field.type === 'networkCombo');
82458       var isSemi = (field.type === 'semiCombo');
82459       var optstrings = field.strings && field.strings.options;
82460       var optarray = field.options;
82461       var snake_case = (field.snake_case || (field.snake_case === undefined));
82462       var caseSensitive = field.caseSensitive;
82463       var combobox = uiCombobox(context, 'combo-' + field.safeid)
82464           .caseSensitive(caseSensitive)
82465           .minItems(isMulti || isSemi ? 1 : 2);
82466       var container = select(null);
82467       var inputWrap = select(null);
82468       var input = select(null);
82469       var _comboData = [];
82470       var _multiData = [];
82471       var _entity;
82472       var _country;
82473
82474       // ensure multiCombo field.key ends with a ':'
82475       if (isMulti && /[^:]$/.test(field.key)) {
82476           field.key += ':';
82477       }
82478
82479
82480       function snake(s) {
82481           return s.replace(/\s+/g, '_');
82482       }
82483
82484       function unsnake(s) {
82485           return s.replace(/_+/g, ' ');
82486       }
82487
82488       function clean(s) {
82489           return s.split(';')
82490               .map(function(s) { return s.trim(); })
82491               .join(';');
82492       }
82493
82494
82495       // returns the tag value for a display value
82496       // (for multiCombo, dval should be the key suffix, not the entire key)
82497       function tagValue(dval) {
82498           dval = clean(dval || '');
82499
82500           if (optstrings) {
82501               var found = find$1(_comboData, function(o) {
82502                   return o.key && clean(o.value) === dval;
82503               });
82504               if (found) {
82505                   return found.key;
82506               }
82507           }
82508
82509           if (field.type === 'typeCombo' && !dval) {
82510               return 'yes';
82511           }
82512
82513           return (snake_case ? snake(dval) : dval) || undefined;
82514       }
82515
82516
82517       // returns the display value for a tag value
82518       // (for multiCombo, tval should be the key suffix, not the entire key)
82519       function displayValue(tval) {
82520           tval = tval || '';
82521
82522           if (optstrings) {
82523               var found = find$1(_comboData, function(o) { return o.key === tval && o.value; });
82524               if (found) {
82525                   return found.value;
82526               }
82527           }
82528
82529           if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
82530               return '';
82531           }
82532
82533           return snake_case ? unsnake(tval) : tval;
82534       }
82535
82536
82537       function objectDifference(a, b) {
82538           return reject(a, function(d1) {
82539               return some(b, function(d2) { return d1.value === d2.value; });
82540           });
82541       }
82542
82543
82544       function initCombo(selection, attachTo) {
82545           if (optstrings) {
82546               selection.attr('readonly', 'readonly');
82547               selection.call(combobox, attachTo);
82548               setStaticValues(setPlaceholder);
82549
82550           } else if (optarray) {
82551               selection.call(combobox, attachTo);
82552               setStaticValues(setPlaceholder);
82553
82554           } else if (taginfo) {
82555               selection.call(combobox.fetcher(setTaginfoValues), attachTo);
82556               setTaginfoValues('', setPlaceholder);
82557           }
82558       }
82559
82560
82561       function setStaticValues(callback) {
82562           if (!(optstrings || optarray)) return;
82563
82564           if (optstrings) {
82565               _comboData = Object.keys(optstrings).map(function(k) {
82566                   var v = field.t('options.' + k, { 'default': optstrings[k] });
82567                   return {
82568                       key: k,
82569                       value: v,
82570                       title: v
82571                   };
82572               });
82573
82574           } else if (optarray) {
82575               _comboData = optarray.map(function(k) {
82576                   var v = snake_case ? unsnake(k) : k;
82577                   return {
82578                       key: k,
82579                       value: v,
82580                       title: v
82581                   };
82582               });
82583           }
82584
82585           combobox.data(objectDifference(_comboData, _multiData));
82586           if (callback) callback(_comboData);
82587       }
82588
82589
82590       function setTaginfoValues(q, callback) {
82591           var fn = isMulti ? 'multikeys' : 'values';
82592           var query = (isMulti ? field.key : '') + q;
82593           var hasCountryPrefix = isNetwork && _country && _country.indexOf(q.toLowerCase()) === 0;
82594           if (hasCountryPrefix) {
82595               query = _country + ':';
82596           }
82597
82598           var params = {
82599               debounce: (q !== ''),
82600               key: field.key,
82601               query: query
82602           };
82603
82604           if (_entity) {
82605               params.geometry = context.geometry(_entity.id);
82606           }
82607
82608           taginfo[fn](params, function(err, data) {
82609               if (err) return;
82610               if (hasCountryPrefix) {
82611                   data = filter(data, function(d) {
82612                       return d.value.toLowerCase().indexOf(_country + ':') === 0;
82613                   });
82614               }
82615
82616               // hide the caret if there are no suggestions
82617               container.classed('empty-combobox', data.length === 0);
82618
82619               _comboData = map$3(data, function(d) {
82620                   var k = d.value;
82621                   if (isMulti) k = k.replace(field.key, '');
82622                   var v = snake_case ? unsnake(k) : k;
82623                   return {
82624                       key: k,
82625                       value: v,
82626                       title: isMulti ? v : d.title
82627                   };
82628               });
82629
82630               _comboData = objectDifference(_comboData, _multiData);
82631               if (callback) callback(_comboData);
82632           });
82633       }
82634
82635
82636       function setPlaceholder(d) {
82637           var ph;
82638
82639           if (isMulti || isSemi) {
82640               ph = field.placeholder() || t('inspector.add');
82641           } else {
82642               var vals = map$3(d, 'value').filter(function(s) { return s.length < 20; }),
82643                   placeholders = vals.length > 1 ? vals : map$3(d, 'key');
82644               ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
82645           }
82646
82647           if (!/(…|\.\.\.)$/.test(ph)) {
82648               ph += '…';
82649           }
82650
82651           container.selectAll('input')
82652               .attr('placeholder', ph);
82653       }
82654
82655
82656       function change() {
82657           var val = tagValue(utilGetSetValue(input));
82658           var t = {};
82659
82660           if (isMulti || isSemi) {
82661               if (!val) return;
82662               container.classed('active', false);
82663               utilGetSetValue(input, '');
82664
82665               if (isMulti) {
82666                   var key = field.key + val;
82667                   if (_entity) {
82668                       // don't set a multicombo value to 'yes' if it already has a non-'no' value
82669                       // e.g. `language:de=main`
82670                       var old = _entity.tags[key] || '';
82671                       if (old && old.toLowerCase() !== 'no') return;
82672                   }
82673                   field.keys.push(key);
82674                   t[key] = 'yes';
82675
82676               } else if (isSemi) {
82677                   var arr = _multiData.map(function(d) { return d.key; });
82678                   arr.push(val);
82679                   t[field.key] = compact(uniq(arr)).join(';');
82680               }
82681
82682               window.setTimeout(function() { input.node().focus(); }, 10);
82683
82684           } else {
82685               t[field.key] = val;
82686           }
82687
82688           dispatch$1.call('change', this, t);
82689       }
82690
82691
82692       function removeMultikey(d) {
82693           event.stopPropagation();
82694           var t = {};
82695           if (isMulti) {
82696               t[d.key] = undefined;
82697           } else if (isSemi) {
82698               remove$8(_multiData, function(md) { return md.key === d.key; });
82699               var arr = _multiData.map(function(md) { return md.key; });
82700               arr = compact(uniq(arr));
82701               t[field.key] = arr.length ? arr.join(';') : undefined;
82702           }
82703           dispatch$1.call('change', this, t);
82704       }
82705
82706
82707       function combo(selection) {
82708           container = selection.selectAll('.form-field-input-wrap')
82709               .data([0]);
82710
82711           var type = (isMulti || isSemi) ? 'multicombo': 'combo';
82712           container = container.enter()
82713               .append('div')
82714               .attr('class', 'form-field-input-wrap form-field-input-' + type)
82715               .merge(container);
82716
82717           if (isMulti || isSemi) {
82718               container = container.selectAll('.chiplist')
82719                   .data([0]);
82720
82721               var listClass = 'chiplist';
82722
82723               // Use a separate line for each value in the Destinations field
82724               // to mimic highway exit signs
82725               if (field.id === 'destination_oneway') {
82726                   listClass += ' full-line-chips';
82727               }
82728
82729               container = container.enter()
82730                   .append('ul')
82731                   .attr('class', listClass)
82732                   .on('click', function() {
82733                       window.setTimeout(function() { input.node().focus(); }, 10);
82734                   })
82735                   .merge(container);
82736
82737
82738               inputWrap = container.selectAll('.input-wrap')
82739                   .data([0]);
82740
82741               inputWrap = inputWrap.enter()
82742                   .append('li')
82743                   .attr('class', 'input-wrap')
82744                   .merge(inputWrap);
82745
82746               input = inputWrap.selectAll('input')
82747                   .data([0]);
82748           } else {
82749               input = container.selectAll('input')
82750                   .data([0]);
82751           }
82752
82753           input = input.enter()
82754               .append('input')
82755               .attr('type', 'text')
82756               .attr('id', 'preset-input-' + field.safeid)
82757               .call(utilNoAuto)
82758               .call(initCombo, selection)
82759               .merge(input);
82760
82761           if (isNetwork && nominatim && _entity) {
82762               var center = _entity.extent(context.graph()).center();
82763               nominatim.countryCode(center, function (err, code) {
82764                   _country = code;
82765               });
82766           }
82767
82768           input
82769               .on('change', change)
82770               .on('blur', change);
82771
82772           input
82773               .on('keydown.field', function() {
82774                   switch (event.keyCode) {
82775                       case 13: // ↩ Return
82776                           input.node().blur(); // blurring also enters the value
82777                           event.stopPropagation();
82778                           break;
82779                   }
82780               });
82781
82782           if (isMulti || isSemi) {
82783               combobox
82784                   .on('accept', function() {
82785                       input.node().blur();
82786                       input.node().focus();
82787                   });
82788
82789               input
82790                   .on('focus', function() { container.classed('active', true); });
82791           }
82792       }
82793
82794
82795       combo.tags = function(tags) {
82796           if (isMulti || isSemi) {
82797               _multiData = [];
82798
82799               if (isMulti) {
82800                   // Build _multiData array containing keys already set..
82801                   for (var k in tags) {
82802                       if (k.indexOf(field.key) !== 0) continue;
82803                       var v = (tags[k] || '').toLowerCase();
82804                       if (v === '' || v === 'no') continue;
82805
82806                       var suffix = k.substring(field.key.length);
82807                       _multiData.push({
82808                           key: k,
82809                           value: displayValue(suffix)
82810                       });
82811                   }
82812
82813                   // Set keys for form-field modified (needed for undo and reset buttons)..
82814                   field.keys = map$3(_multiData, 'key');
82815
82816               } else if (isSemi) {
82817                   var arr = compact(uniq((tags[field.key] || '').split(';')));
82818                   _multiData = arr.map(function(k) {
82819                       return {
82820                           key: k,
82821                           value: displayValue(k)
82822                       };
82823                   });
82824               }
82825
82826               // Exclude existing multikeys from combo options..
82827               var available = objectDifference(_comboData, _multiData);
82828               combobox.data(available);
82829
82830               // Hide 'Add' button if this field uses fixed set of
82831               // translateable optstrings and they're all currently used..
82832               container.selectAll('.combobox-input, .combobox-caret')
82833                   .classed('hide', optstrings && !available.length);
82834
82835
82836               // Render chips
82837               var chips = container.selectAll('.chips')
82838                   .data(_multiData);
82839
82840               chips.exit()
82841                   .remove();
82842
82843               var enter = chips.enter()
82844                   .insert('li', '.input-wrap')
82845                   .attr('class', 'chips');
82846
82847               enter.append('span');
82848               enter.append('a');
82849
82850               chips = chips.merge(enter);
82851
82852               chips.select('span')
82853                   .text(function(d) { return d.value; });
82854
82855               chips.select('a')
82856                   .on('click', removeMultikey)
82857                   .attr('class', 'remove')
82858                   .text('×');
82859
82860           } else {
82861               utilGetSetValue(input, displayValue(tags[field.key]));
82862           }
82863       };
82864
82865
82866       combo.focus = function() {
82867           input.node().focus();
82868       };
82869
82870
82871       combo.entity = function(val) {
82872           if (!arguments.length) return _entity;
82873           _entity = val;
82874           return combo;
82875       };
82876
82877
82878       return utilRebind(combo, dispatch$1, 'on');
82879   }
82880
82881   function uiFieldText(field, context) {
82882       var dispatch$1 = dispatch('change');
82883       var nominatim = services.geocoder;
82884       var input = select(null);
82885       var _entity;
82886       var _brandTip;
82887
82888       if (field.id === 'brand') {
82889           _brandTip = tooltip()
82890               .title(t('inspector.lock.suggestion', { label: field.label }))
82891               .placement('bottom');
82892       }
82893
82894
82895       function i(selection) {
82896           var preset = _entity && context.presets().match(_entity, context.graph());
82897           var isSuggestion = preset && preset.suggestion && field.id === 'brand';
82898
82899           var wrap = selection.selectAll('.form-field-input-wrap')
82900               .data([0]);
82901
82902           wrap = wrap.enter()
82903               .append('div')
82904               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
82905               .merge(wrap);
82906
82907           var fieldID = 'preset-input-' + field.safeid;
82908
82909           input = wrap.selectAll('input')
82910               .data([0]);
82911
82912           input = input.enter()
82913               .append('input')
82914               .attr('type', field.type)
82915               .attr('id', fieldID)
82916               .attr('placeholder', field.placeholder() || t('inspector.unknown'))
82917               .classed(field.type, true)
82918               .call(utilNoAuto)
82919               .merge(input);
82920
82921           input
82922               .classed('disabled', !!isSuggestion)
82923               .attr('readonly', isSuggestion || null)
82924               .on('input', change(true))
82925               .on('blur', change())
82926               .on('change', change());
82927
82928
82929           if (field.type === 'tel' && nominatim && _entity) {
82930               var center = _entity.extent(context.graph()).center();
82931               nominatim.countryCode(center, function (err, countryCode) {
82932                   if (err || !dataPhoneFormats[countryCode]) return;
82933                   wrap.selectAll('#' + fieldID)
82934                       .attr('placeholder', dataPhoneFormats[countryCode]);
82935               });
82936
82937           } else if (field.type === 'number') {
82938               var rtl = (textDirection === 'rtl');
82939
82940               input.attr('type', 'text');
82941
82942               var buttons = wrap.selectAll('.increment, .decrement')
82943                   .data(rtl ? [1, -1] : [-1, 1]);
82944
82945               buttons.enter()
82946                   .append('button')
82947                   .attr('tabindex', -1)
82948                   .attr('class', function(d) {
82949                       var which = (d === 1 ? 'increment' : 'decrement');
82950                       return 'form-field-button ' + which;
82951                   })
82952                   .merge(buttons)
82953                   .on('click', function(d) {
82954                       event.preventDefault();
82955                       var raw_vals = input.node().value || '0';
82956                       var vals = raw_vals.split(';');
82957                       vals = vals.map(function(v) {
82958                           var num = parseFloat(v.trim(), 10);
82959                           return isFinite(num) ? clamped(num + d) : v.trim();
82960                       });
82961                       input.node().value = vals.join(';');
82962                       change()();
82963                   });
82964
82965           } else if (preset && field.id === 'brand') {
82966               var pTag = preset.id.split('/', 2);
82967               var pKey = pTag[0];
82968               if (isSuggestion) {
82969                   // A "suggestion" preset (brand name)
82970                   // Put suggestion keys in `field.keys` so delete button can remove them all.
82971                   field.keys = Object.keys(preset.removeTags)
82972                       .filter(function(k) { return k !== pKey && k !== 'name'; });
82973               }
82974
82975               wrap.call(isSuggestion ? _brandTip : _brandTip.destroy);
82976           }
82977       }
82978
82979
82980       // clamp number to min/max
82981       function clamped(num) {
82982           if (field.minValue !== undefined) {
82983               num = Math.max(num, field.minValue);
82984           }
82985           if (field.maxValue !== undefined) {
82986               num = Math.min(num, field.maxValue);
82987           }
82988           return num;
82989       }
82990
82991
82992       function change(onInput) {
82993           return function() {
82994               var t = {};
82995               var val = utilGetSetValue(input).trim() || undefined;
82996
82997               if (!onInput) {
82998                   if (field.type === 'number' && val !== undefined) {
82999                       var vals = val.split(';');
83000                       vals = vals.map(function(v) {
83001                           var num = parseFloat(v.trim(), 10);
83002                           return isFinite(num) ? clamped(num) : v.trim();
83003                       });
83004                       val = vals.join(';');
83005                   }
83006                   utilGetSetValue(input, val || '');
83007               }
83008               t[field.key] = val;
83009               dispatch$1.call('change', this, t, onInput);
83010           };
83011       }
83012
83013
83014       i.entity = function(val) {
83015           if (!arguments.length) return _entity;
83016           _entity = val;
83017           return i;
83018       };
83019
83020
83021       i.tags = function(tags) {
83022           utilGetSetValue(input, tags[field.key] || '');
83023       };
83024
83025
83026       i.focus = function() {
83027           var node = input.node();
83028           if (node) node.focus();
83029       };
83030
83031       return utilRebind(i, dispatch$1, 'on');
83032   }
83033
83034   function uiFieldAccess(field, context) {
83035       var dispatch$1 = dispatch('change');
83036       var items = select(null);
83037
83038       function access(selection) {
83039           var wrap = selection.selectAll('.form-field-input-wrap')
83040               .data([0]);
83041
83042           wrap = wrap.enter()
83043               .append('div')
83044               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
83045               .merge(wrap);
83046
83047           var list = wrap.selectAll('ul')
83048               .data([0]);
83049
83050           list = list.enter()
83051               .append('ul')
83052               .attr('class', 'labeled-inputs')
83053               .merge(list);
83054
83055
83056           items = list.selectAll('li')
83057               .data(field.keys);
83058
83059           // Enter
83060           var enter = items.enter()
83061               .append('li')
83062               .attr('class', function(d) { return 'preset-access-' + d; });
83063
83064           enter
83065               .append('span')
83066               .attr('class', 'label preset-label-access')
83067               .attr('for', function(d) { return 'preset-input-access-' + d; })
83068               .text(function(d) { return field.t('types.' + d); });
83069
83070           enter
83071               .append('div')
83072               .attr('class', 'preset-input-access-wrap')
83073               .append('input')
83074               .attr('type', 'text')
83075               .attr('class', 'preset-input-access')
83076               .attr('id', function(d) { return 'preset-input-access-' + d; })
83077               .call(utilNoAuto)
83078               .each(function(d) {
83079                   select(this)
83080                       .call(uiCombobox(context, 'access-' + d)
83081                           .data(access.options(d))
83082                       );
83083               });
83084
83085
83086           // Update
83087           items = items.merge(enter);
83088
83089           wrap.selectAll('.preset-input-access')
83090               .on('change', change)
83091               .on('blur', change);
83092       }
83093
83094
83095       function change(d) {
83096           var tag = {};
83097           tag[d] = utilGetSetValue(select(this)) || undefined;
83098           dispatch$1.call('change', this, tag);
83099       }
83100
83101
83102       access.options = function(type) {
83103           var options = ['no', 'permissive', 'private', 'permit', 'destination'];
83104
83105           if (type !== 'access') {
83106               options.unshift('yes');
83107               options.push('designated');
83108
83109               if (type === 'bicycle') {
83110                   options.push('dismount');
83111               }
83112           }
83113
83114           return options.map(function(option) {
83115               return {
83116                   title: field.t('options.' + option + '.description'),
83117                   value: option
83118               };
83119           });
83120       };
83121
83122
83123       var placeholders = {
83124           footway: {
83125               foot: 'designated',
83126               motor_vehicle: 'no'
83127           },
83128           steps: {
83129               foot: 'yes',
83130               motor_vehicle: 'no',
83131               bicycle: 'no',
83132               horse: 'no'
83133           },
83134           pedestrian: {
83135               foot: 'yes',
83136               motor_vehicle: 'no'
83137           },
83138           cycleway: {
83139               motor_vehicle: 'no',
83140               bicycle: 'designated'
83141           },
83142           bridleway: {
83143               motor_vehicle: 'no',
83144               horse: 'designated'
83145           },
83146           path: {
83147               foot: 'yes',
83148               motor_vehicle: 'no',
83149               bicycle: 'yes',
83150               horse: 'yes'
83151           },
83152           motorway: {
83153               foot: 'no',
83154               motor_vehicle: 'yes',
83155               bicycle: 'no',
83156               horse: 'no'
83157           },
83158           trunk: {
83159               motor_vehicle: 'yes'
83160           },
83161           primary: {
83162               foot: 'yes',
83163               motor_vehicle: 'yes',
83164               bicycle: 'yes',
83165               horse: 'yes'
83166           },
83167           secondary: {
83168               foot: 'yes',
83169               motor_vehicle: 'yes',
83170               bicycle: 'yes',
83171               horse: 'yes'
83172           },
83173           tertiary: {
83174               foot: 'yes',
83175               motor_vehicle: 'yes',
83176               bicycle: 'yes',
83177               horse: 'yes'
83178           },
83179           residential: {
83180               foot: 'yes',
83181               motor_vehicle: 'yes',
83182               bicycle: 'yes',
83183               horse: 'yes'
83184           },
83185           unclassified: {
83186               foot: 'yes',
83187               motor_vehicle: 'yes',
83188               bicycle: 'yes',
83189               horse: 'yes'
83190           },
83191           service: {
83192               foot: 'yes',
83193               motor_vehicle: 'yes',
83194               bicycle: 'yes',
83195               horse: 'yes'
83196           },
83197           motorway_link: {
83198               foot: 'no',
83199               motor_vehicle: 'yes',
83200               bicycle: 'no',
83201               horse: 'no'
83202           },
83203           trunk_link: {
83204               motor_vehicle: 'yes'
83205           },
83206           primary_link: {
83207               foot: 'yes',
83208               motor_vehicle: 'yes',
83209               bicycle: 'yes',
83210               horse: 'yes'
83211           },
83212           secondary_link: {
83213               foot: 'yes',
83214               motor_vehicle: 'yes',
83215               bicycle: 'yes',
83216               horse: 'yes'
83217           },
83218           tertiary_link: {
83219               foot: 'yes',
83220               motor_vehicle: 'yes',
83221               bicycle: 'yes',
83222               horse: 'yes'
83223           }
83224       };
83225
83226
83227       access.tags = function(tags) {
83228           utilGetSetValue(items.selectAll('.preset-input-access'),
83229               function(d) { return tags[d] || ''; })
83230               .attr('placeholder', function() {
83231                   return tags.access ? tags.access : field.placeholder();
83232               });
83233
83234           items.selectAll('#preset-input-access-access')
83235               .attr('placeholder', 'yes');
83236
83237           var which = tags.highway;
83238           if (!placeholders[which]) return;
83239
83240           var keys = Object.keys(placeholders[which]);
83241           keys.forEach(function(k) {
83242               var v = placeholders[which][k];
83243               items.selectAll('#preset-input-access-' + k)
83244                   .attr('placeholder', tags.access || v);
83245           });
83246       };
83247
83248
83249       access.focus = function() {
83250           items.selectAll('.preset-input-access')
83251               .node().focus();
83252       };
83253
83254
83255       return utilRebind(access, dispatch$1, 'on');
83256   }
83257
83258   function uiFieldAddress(field, context) {
83259       var dispatch$1 = dispatch('init', 'change');
83260       var nominatim = services.geocoder;
83261       var wrap = select(null);
83262       var _isInitialized = false;
83263       var _entity;
83264
83265       function getNearStreets() {
83266           var extent = _entity.extent(context.graph());
83267           var l = extent.center();
83268           var box = geoExtent(l).padByMeters(200);
83269
83270           var streets = context.intersects(box)
83271               .filter(isAddressable)
83272               .map(function(d) {
83273                   var loc = context.projection([
83274                       (extent[0][0] + extent[1][0]) / 2,
83275                       (extent[0][1] + extent[1][1]) / 2
83276                   ]);
83277                   var choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
83278
83279                   return {
83280                       title: d.tags.name,
83281                       value: d.tags.name,
83282                       dist: choice.distance
83283                   };
83284               })
83285               .sort(function(a, b) {
83286                   return a.dist - b.dist;
83287               });
83288
83289           return uniqBy(streets, 'value');
83290
83291           function isAddressable(d) {
83292               return d.tags.highway && d.tags.name && d.type === 'way';
83293           }
83294       }
83295
83296
83297       function getNearCities() {
83298           var extent = _entity.extent(context.graph());
83299           var l = extent.center();
83300           var box = geoExtent(l).padByMeters(200);
83301
83302           var cities = context.intersects(box)
83303               .filter(isAddressable)
83304               .map(function(d) {
83305                   return {
83306                       title: d.tags['addr:city'] || d.tags.name,
83307                       value: d.tags['addr:city'] || d.tags.name,
83308                       dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
83309                   };
83310               })
83311               .sort(function(a, b) {
83312                   return a.dist - b.dist;
83313               });
83314
83315           return uniqBy(cities, 'value');
83316
83317
83318           function isAddressable(d) {
83319               if (d.tags.name) {
83320                   if (d.tags.admin_level === '8' && d.tags.boundary === 'administrative')
83321                       return true;
83322                   if (d.tags.border_type === 'city')
83323                       return true;
83324                   if (d.tags.place === 'city' || d.tags.place === 'town' || d.tags.place === 'village')
83325                       return true;
83326               }
83327
83328               if (d.tags['addr:city'])
83329                   return true;
83330
83331               return false;
83332           }
83333       }
83334
83335       function getNearValues(key) {
83336           var extent = _entity.extent(context.graph());
83337           var l = extent.center();
83338           var box = geoExtent(l).padByMeters(200);
83339
83340           var results = context.intersects(box)
83341               .filter(function hasTag(d) { return d.id !== _entity.id && d.tags[key]; })
83342               .map(function(d) {
83343                   return {
83344                       title: d.tags[key],
83345                       value: d.tags[key],
83346                       dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
83347                   };
83348               })
83349               .sort(function(a, b) {
83350                   return a.dist - b.dist;
83351               });
83352
83353           return uniqBy(results, 'value');
83354       }
83355
83356
83357       function countryCallback(err, countryCode) {
83358           if (err) return;
83359
83360           var addressFormat = find$1(dataAddressFormats, function (a) {
83361               return a && a.countryCodes && includes(a.countryCodes, countryCode.toLowerCase());
83362           }) || dataAddressFormats[0];
83363
83364           var dropdowns = addressFormat.dropdowns || [
83365               'city', 'county', 'country', 'district', 'hamlet',
83366               'neighbourhood', 'place', 'postcode', 'province',
83367               'quarter', 'state', 'street', 'subdistrict', 'suburb'
83368           ];
83369
83370           var widths = addressFormat.widths || {
83371               housenumber: 1/3, street: 2/3,
83372               city: 2/3, state: 1/4, postcode: 1/3
83373           };
83374
83375           function row(r) {
83376               // Normalize widths.
83377               var total = reduce(r, function(sum, key) {
83378                   return sum + (widths[key] || 0.5);
83379               }, 0);
83380
83381               return r.map(function(key) {
83382                   return {
83383                       id: key,
83384                       width: (widths[key] || 0.5) / total
83385                   };
83386               });
83387           }
83388
83389           wrap.selectAll('.addr-row')
83390               .data(addressFormat.format)
83391               .enter()
83392               .append('div')
83393               .attr('class', 'addr-row')
83394               .selectAll('input')
83395               .data(row)
83396               .enter()
83397               .append('input')
83398               .property('type', 'text')
83399               .attr('placeholder', function (d) {
83400                   var localkey = d.id + '!' + countryCode.toLowerCase();
83401                   var tkey = field.strings.placeholders[localkey] ? localkey : d.id;
83402                   return field.t('placeholders.' + tkey);
83403               })
83404               .attr('class', function (d) { return 'addr-' + d.id; })
83405               .call(utilNoAuto)
83406               .each(addDropdown)
83407               .style('width', function (d) { return d.width * 100 + '%'; });
83408
83409
83410           function addDropdown(d) {
83411               if (dropdowns.indexOf(d.id) === -1) return;  // not a dropdown
83412
83413               var nearValues = (d.id === 'street') ? getNearStreets
83414                   : (d.id === 'city') ? getNearCities
83415                   : getNearValues;
83416
83417               select(this)
83418                   .call(uiCombobox(context, 'address-' + d.id)
83419                       .minItems(1)
83420                       .caseSensitive(true)
83421                       .fetcher(function(value, callback) {
83422                           callback(nearValues('addr:' + d.id));
83423                       })
83424                   );
83425           }
83426
83427           wrap.selectAll('input')
83428               .on('blur', change())
83429               .on('change', change());
83430
83431           wrap.selectAll('input:not(.combobox-input)')
83432               .on('input', change(true));
83433
83434           dispatch$1.call('init');
83435           _isInitialized = true;
83436       }
83437
83438
83439       function address(selection) {
83440           _isInitialized = false;
83441
83442           wrap = selection.selectAll('.form-field-input-wrap')
83443               .data([0]);
83444
83445           wrap = wrap.enter()
83446               .append('div')
83447               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
83448               .merge(wrap);
83449
83450           if (nominatim && _entity) {
83451               var center = _entity.extent(context.graph()).center();
83452               nominatim.countryCode(center, countryCallback);
83453           }
83454       }
83455
83456
83457       function change(onInput) {
83458           return function() {
83459               var tags = {};
83460
83461               wrap.selectAll('input')
83462                   .each(function (field) {
83463                       tags['addr:' + field.id] = this.value || undefined;
83464                   });
83465
83466               dispatch$1.call('change', this, tags, onInput);
83467           };
83468       }
83469
83470
83471       function updateTags(tags) {
83472           utilGetSetValue(wrap.selectAll('input'), function (field) {
83473               return tags['addr:' + field.id] || '';
83474           });
83475       }
83476
83477
83478       address.entity = function(val) {
83479           if (!arguments.length) return _entity;
83480           _entity = val;
83481           return address;
83482       };
83483
83484
83485       address.tags = function(tags) {
83486           if (_isInitialized) {
83487               updateTags(tags);
83488           } else {
83489               dispatch$1.on('init', function () {
83490                   dispatch$1.on('init', null);
83491                   updateTags(tags);
83492               });
83493           }
83494       };
83495
83496
83497       address.focus = function() {
83498           var node = wrap.selectAll('input').node();
83499           if (node) node.focus();
83500       };
83501
83502
83503       return utilRebind(address, dispatch$1, 'on');
83504   }
83505
83506   function uiFieldCycleway(field, context) {
83507       var dispatch$1 = dispatch('change');
83508       var items = select(null);
83509       var wrap = select(null);
83510
83511       function cycleway(selection) {
83512
83513           function stripcolon(s) {
83514               return s.replace(':', '');
83515           }
83516
83517
83518           wrap = selection.selectAll('.form-field-input-wrap')
83519               .data([0]);
83520
83521           wrap = wrap.enter()
83522               .append('div')
83523               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
83524               .merge(wrap);
83525
83526
83527           var div = wrap.selectAll('ul')
83528               .data([0]);
83529
83530           div = div.enter()
83531               .append('ul')
83532               .attr('class', 'labeled-inputs')
83533               .merge(div);
83534
83535           var keys = ['cycleway:left', 'cycleway:right'];
83536
83537           items = div.selectAll('li')
83538               .data(keys);
83539
83540           var enter = items.enter()
83541               .append('li')
83542               .attr('class', function(d) { return 'preset-cycleway-' + stripcolon(d); });
83543
83544           enter
83545               .append('span')
83546               .attr('class', 'label preset-label-cycleway')
83547               .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
83548               .text(function(d) { return field.t('types.' + d); });
83549
83550           enter
83551               .append('div')
83552               .attr('class', 'preset-input-cycleway-wrap')
83553               .append('input')
83554               .attr('type', 'text')
83555               .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
83556               .call(utilNoAuto)
83557               .each(function(d) {
83558                   select(this)
83559                       .call(uiCombobox(context, 'cycleway-' + stripcolon(d))
83560                           .data(cycleway.options(d))
83561                       );
83562               });
83563
83564
83565           // Update
83566           wrap.selectAll('.preset-input-cycleway')
83567               .on('change', change)
83568               .on('blur', change);
83569       }
83570
83571
83572       function change() {
83573           var left = utilGetSetValue(select('.preset-input-cyclewayleft'));
83574           var right = utilGetSetValue(select('.preset-input-cyclewayright'));
83575           var tag = {};
83576
83577           if (left === 'none' || left === '') { left = undefined; }
83578           if (right === 'none' || right === '') { right = undefined; }
83579
83580           // Always set both left and right as changing one can affect the other
83581           tag = {
83582               cycleway: undefined,
83583               'cycleway:left': left,
83584               'cycleway:right': right
83585           };
83586
83587           // If the left and right tags match, use the cycleway tag to tag both
83588           // sides the same way
83589           if (left === right) {
83590               tag = {
83591                   cycleway: left,
83592                   'cycleway:left': undefined,
83593                   'cycleway:right': undefined
83594               };
83595           }
83596
83597           dispatch$1.call('change', this, tag);
83598       }
83599
83600
83601       cycleway.options = function() {
83602           return Object.keys(field.strings.options).map(function(option) {
83603               return {
83604                   title: field.t('options.' + option + '.description'),
83605                   value: option
83606               };
83607           });
83608       };
83609
83610
83611       cycleway.tags = function(tags) {
83612           utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
83613                   // If cycleway is set, always return that
83614                   if (tags.cycleway) {
83615                       return tags.cycleway;
83616                   }
83617                   return tags[d] || '';
83618               })
83619               .attr('placeholder', field.placeholder());
83620       };
83621
83622
83623       cycleway.focus = function() {
83624           var node = wrap.selectAll('input').node();
83625           if (node) node.focus();
83626       };
83627
83628
83629       return utilRebind(cycleway, dispatch$1, 'on');
83630   }
83631
83632   function uiFieldLanes(field, context) {
83633       var dispatch$1 = dispatch('change');
83634       var LANE_WIDTH = 40;
83635       var LANE_HEIGHT = 200;
83636       var _entityID;
83637
83638       function lanes(selection) {
83639           var lanesData = context.entity(_entityID).lanes();
83640
83641           if (!select('.inspector-wrap.inspector-hidden').empty() || !selection.node().parentNode) {
83642               selection.call(lanes.off);
83643               return;
83644           }
83645
83646           var wrap = selection.selectAll('.form-field-input-wrap')
83647               .data([0]);
83648
83649           wrap = wrap.enter()
83650               .append('div')
83651               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
83652               .merge(wrap);
83653
83654           var surface =  wrap.selectAll('.surface')
83655               .data([0]);
83656
83657           var d = utilGetDimensions(wrap);
83658           var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
83659
83660           surface = surface.enter()
83661               .append('svg')
83662               .attr('width', d[0])
83663               .attr('height', 300)
83664               .attr('class', 'surface')
83665               .merge(surface);
83666
83667
83668           var lanesSelection = surface.selectAll('.lanes')
83669               .data([0]);
83670
83671           lanesSelection = lanesSelection.enter()
83672               .append('g')
83673               .attr('class', 'lanes')
83674               .merge(lanesSelection);
83675
83676           lanesSelection
83677               .attr('transform', function () {
83678                   return 'translate(' + (freeSpace / 2) + ', 0)';
83679               });
83680
83681
83682           var lane = lanesSelection.selectAll('.lane')
83683              .data(lanesData.lanes);
83684
83685           lane.exit()
83686               .remove();
83687
83688           var enter = lane.enter()
83689               .append('g')
83690               .attr('class', 'lane');
83691
83692           enter
83693               .append('g')
83694               .append('rect')
83695               .attr('y', 50)
83696               .attr('width', LANE_WIDTH)
83697               .attr('height', LANE_HEIGHT);
83698
83699           enter
83700               .append('g')
83701               .attr('class', 'forward')
83702               .append('text')
83703               .attr('y', 40)
83704               .attr('x', 14)
83705               .text('▲');
83706
83707           enter
83708               .append('g')
83709               .attr('class', 'bothways')
83710               .append('text')
83711               .attr('y', 40)
83712               .attr('x', 14)
83713               .text('▲▼');
83714
83715           enter
83716               .append('g')
83717               .attr('class', 'backward')
83718               .append('text')
83719               .attr('y', 40)
83720               .attr('x', 14)
83721               .text('▼');
83722
83723
83724           lane = lane
83725               .merge(enter);
83726
83727           lane
83728               .attr('transform', function(d) {
83729                   return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
83730               });
83731
83732           lane.select('.forward')
83733               .style('visibility', function(d) {
83734                   return d.direction === 'forward' ? 'visible' : 'hidden';
83735               });
83736
83737           lane.select('.bothways')
83738               .style('visibility', function(d) {
83739                   return d.direction === 'bothways' ? 'visible' : 'hidden';
83740               });
83741
83742           lane.select('.backward')
83743               .style('visibility', function(d) {
83744                   return d.direction === 'backward' ? 'visible' : 'hidden';
83745               });
83746       }
83747
83748
83749       lanes.entity = function(val) {
83750           if (!_entityID || _entityID !== val.id) {
83751               _entityID = val.id;
83752           }
83753       };
83754
83755       lanes.tags = function() {};
83756       lanes.focus = function() {};
83757       lanes.off = function() {};
83758
83759       return utilRebind(lanes, dispatch$1, 'on');
83760   }
83761
83762   function uiFieldLocalized(field, context) {
83763       var dispatch$1 = dispatch('change', 'input');
83764       var wikipedia = services.wikipedia;
83765       var input = select(null);
83766       var localizedInputs = select(null);
83767
83768       var allSuggestions = context.presets().collection.filter(function(p) {
83769           return p.suggestion === true;
83770       });
83771
83772       // reuse these combos
83773       var langCombo = uiCombobox(context, 'localized-lang')
83774           .fetcher(fetchLanguages)
83775           .minItems(0);
83776
83777       var brandCombo = uiCombobox(context, 'localized-brand')
83778           .canAutocomplete(false)
83779           .minItems(1);
83780
83781       var _selection = select(null);
83782       var _multilingual = [];
83783       var _isLocked = false;
83784       var _brandTip = tooltip()
83785           .title(t('inspector.lock.suggestion', { label: field.label }))
83786           .placement('bottom');
83787       var _buttonTip = tooltip()
83788           .title(t('translate.translate'))
83789           .placement('left');
83790       var _wikiTitles;
83791       var _entity;
83792
83793
83794       function calcLocked() {
83795           if (!_entity) {    // the original entity
83796               _isLocked = false;
83797               return;
83798           }
83799
83800           var latest = context.hasEntity(_entity.id);
83801           if (!latest) {    // get current entity, possibly edited
83802               _isLocked = false;
83803               return;
83804           }
83805
83806           var hasOriginalName = (latest.tags.name && latest.tags.name === _entity.tags.name);
83807           var hasWikidata = latest.tags.wikidata;
83808           var preset = context.presets().match(latest, context.graph());
83809           var isSuggestion = preset && preset.suggestion;
83810           var showsBrand = preset && preset.fields
83811               .filter(function(d) { return d.id === 'brand'; }).length;
83812
83813           _isLocked = !!(field.id === 'name' && hasOriginalName &&
83814               (hasWikidata || (isSuggestion && !showsBrand)));
83815       }
83816
83817
83818       function calcMultilingual(tags) {
83819           _multilingual = [];
83820           for (var k in tags) {
83821               var m = k.match(/^(.*):([a-zA-Z_-]+)$/);
83822               if (m && m[1] === field.key && m[2]) {
83823                   _multilingual.push({ lang: m[2], value: tags[k] });
83824               }
83825           }
83826           _multilingual.reverse();
83827       }
83828
83829
83830       function localized(selection) {
83831           _selection = selection;
83832           calcLocked();
83833           var entity = _entity && context.hasEntity(_entity.id);  // get latest
83834           var preset = entity && context.presets().match(entity, context.graph());
83835
83836           var wrap = selection.selectAll('.form-field-input-wrap')
83837               .data([0]);
83838
83839           // enter/update
83840           wrap = wrap.enter()
83841               .append('div')
83842               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
83843               .merge(wrap)
83844               .call(_isLocked ? _brandTip : _brandTip.destroy);
83845
83846
83847           input = wrap.selectAll('.localized-main')
83848               .data([0]);
83849
83850           // enter/update
83851           input = input.enter()
83852               .append('input')
83853               .attr('type', 'text')
83854               .attr('id', 'preset-input-' + field.safeid)
83855               .attr('class', 'localized-main')
83856               .attr('placeholder', field.placeholder())
83857               .call(utilNoAuto)
83858               .merge(input);
83859
83860           if (preset && field.id === 'name') {
83861               var pTag = preset.id.split('/', 2);
83862               var pKey = pTag[0];
83863               var pValue = pTag[1];
83864
83865               if (preset.suggestion) {
83866                   // A "suggestion" preset (brand name)
83867                   // Put suggestion keys in `field.keys` so delete button can remove them all.
83868                   field.keys = Object.keys(preset.removeTags)
83869                       .filter(function(k) { return k !== pKey; });
83870
83871               } else {
83872                   // Not a suggestion preset - Add a suggestions dropdown if it makes sense to.
83873                   // This code attempts to determine if the matched preset is the
83874                   // kind of preset that even can benefit from name suggestions..
83875                   // - true = shops, cafes, hotels, etc. (also generic and fallback presets)
83876                   // - false = churches, parks, hospitals, etc. (things not in the index)
83877                   var isFallback = preset.isFallback();
83878                   var goodSuggestions = allSuggestions.filter(function(s) {
83879                       if (isFallback) return true;
83880                       var sTag = s.id.split('/', 2);
83881                       var sKey = sTag[0];
83882                       var sValue = sTag[1];
83883                       return pKey === sKey && (!pValue || pValue === sValue);
83884                   });
83885
83886                   // Show the suggestions.. If the user picks one, change the tags..
83887                   if (allSuggestions.length && goodSuggestions.length) {
83888                       input
83889                           .on('blur.localized', checkBrandOnBlur)
83890                           .call(brandCombo
83891                               .fetcher(fetchBrandNames(preset, allSuggestions))
83892                               .on('accept', acceptBrand)
83893                               .on('cancel', cancelBrand)
83894                           );
83895                   }
83896               }
83897           }
83898
83899           input
83900               .classed('disabled', !!_isLocked)
83901               .attr('readonly', _isLocked || null)
83902               .on('input', change(true))
83903               .on('blur', change())
83904               .on('change', change());
83905
83906
83907           var translateButton = wrap.selectAll('.localized-add')
83908               .data([0]);
83909
83910           translateButton = translateButton.enter()
83911               .append('button')
83912               .attr('class', 'localized-add form-field-button')
83913               .attr('tabindex', -1)
83914               .call(svgIcon('#iD-icon-plus'))
83915               .merge(translateButton);
83916
83917           translateButton
83918               .classed('disabled', !!_isLocked)
83919               .call(_isLocked ? _buttonTip.destroy : _buttonTip)
83920               .on('click', addNew);
83921
83922
83923           if (entity && !_multilingual.length) {
83924               calcMultilingual(entity.tags);
83925           }
83926
83927           localizedInputs = selection.selectAll('.localized-multilingual')
83928               .data([0]);
83929
83930           localizedInputs = localizedInputs.enter()
83931               .append('div')
83932               .attr('class', 'localized-multilingual')
83933               .merge(localizedInputs);
83934
83935           localizedInputs
83936               .call(renderMultilingual);
83937
83938           localizedInputs.selectAll('button, input')
83939               .classed('disabled', !!_isLocked)
83940               .attr('readonly', _isLocked || null);
83941
83942
83943           // We are not guaranteed to get an `accept` or `cancel` when blurring the field.
83944           // (This can happen if the user actives the combo, arrows down, and then clicks off to blur)
83945           // So compare the current field value against the suggestions one last time.
83946           function checkBrandOnBlur() {
83947               var latest = context.hasEntity(_entity.id);
83948               if (!latest) return;   // deleting the entity blurred the field?
83949
83950               var preset = context.presets().match(latest, context.graph());
83951               if (preset && preset.suggestion) return;   // already accepted
83952
83953               // note: here we are testing against "decorated" names, i.e. 'Starbucks – Cafe'
83954               var name = utilGetSetValue(input).trim();
83955               var matched = allSuggestions.filter(function(s) { return name === s.name(); });
83956
83957               if (matched.length === 1) {
83958                   acceptBrand({ suggestion: matched[0] });
83959               } else {
83960                   cancelBrand();
83961               }
83962           }
83963
83964
83965           function acceptBrand(d) {
83966               if (!d) {
83967                   cancelBrand();
83968                   return;
83969               }
83970
83971               var entity = context.entity(_entity.id);  // get latest
83972               var tags = entity.tags;
83973               var geometry = entity.geometry(context.graph());
83974               var removed = preset.unsetTags(tags, geometry);
83975               for (var k in tags) {
83976                   tags[k] = removed[k];  // set removed tags to `undefined`
83977               }
83978               tags = d.suggestion.setTags(tags, geometry);
83979               utilGetSetValue(input, tags.name);
83980               dispatch$1.call('change', this, tags);
83981           }
83982
83983
83984           // user hit escape, clean whatever preset name appears after the last ' – '
83985           function cancelBrand() {
83986               var name = utilGetSetValue(input);
83987               var clean = cleanName(name);
83988               if (clean !== name) {
83989                   utilGetSetValue(input, clean);
83990                   dispatch$1.call('change', this, { name: clean });
83991               }
83992           }
83993
83994           // Remove whatever is after the last ' – '
83995           // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
83996           function cleanName(name) {
83997               var parts = name.split(' – ');
83998               if (parts.length > 1) {
83999                   parts.pop();
84000                   name = parts.join(' – ');
84001               }
84002               return name;
84003           }
84004
84005
84006           function fetchBrandNames(preset, suggestions) {
84007               var pTag = preset.id.split('/', 2);
84008               var pKey = pTag[0];
84009               var pValue = pTag[1];
84010
84011               return function(value, callback) {
84012                   var results = [];
84013                   if (value && value.length > 2) {
84014                       for (var i = 0; i < suggestions.length; i++) {
84015                           var s = suggestions[i];
84016                           var sTag = s.id.split('/', 2);
84017                           var sKey = sTag[0];
84018                           var sValue = sTag[1];
84019                           var name = s.name();
84020                           var dist = utilEditDistance(value, name.substring(0, value.length));
84021                           var matchesPreset = (pKey === sKey && (!pValue || pValue === sValue));
84022
84023                           if (dist < 1 || (matchesPreset && dist < 3)) {
84024                               var obj = {
84025                                   title: name,
84026                                   value: name,
84027                                   suggestion: s,
84028                                   dist: dist + (matchesPreset ? 0 : 1)  // penalize if not matched preset
84029                               };
84030                               results.push(obj);
84031                           }
84032                       }
84033                       results.sort(function(a, b) { return a.dist - b.dist; });
84034                   }
84035                   results = results.slice(0, 10);
84036                   callback(results);
84037               };
84038           }
84039
84040
84041           function addNew() {
84042               event.preventDefault();
84043               if (_isLocked) return;
84044
84045               var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
84046               var langExists = find$1(_multilingual, function(datum) { return datum.lang === defaultLang;});
84047               var isLangEn = defaultLang.indexOf('en') > -1;
84048               if (isLangEn || langExists) {
84049                   defaultLang = '';
84050               }
84051               _multilingual.push({ lang: defaultLang, value: '' });
84052
84053               localizedInputs
84054                   .call(renderMultilingual);
84055           }
84056
84057
84058           function change(onInput) {
84059               return function() {
84060                   if (_isLocked) {
84061                       event.preventDefault();
84062                       return;
84063                   }
84064                   var t = {};
84065                   t[field.key] = utilGetSetValue(select(this)) || undefined;
84066                   dispatch$1.call('change', this, t, onInput);
84067               };
84068           }
84069       }
84070
84071
84072       function key(lang) {
84073           return field.key + ':' + lang;
84074       }
84075
84076
84077       function changeLang(d) {
84078           var lang = utilGetSetValue(select(this));
84079           var t = {};
84080           var language = find$1(wikipedia$2, function(d) {
84081               return d[0].toLowerCase() === lang.toLowerCase() ||
84082                   d[1].toLowerCase() === lang.toLowerCase();
84083           });
84084
84085           if (language) lang = language[2];
84086
84087           if (d.lang && d.lang !== lang) {
84088               t[key(d.lang)] = undefined;
84089           }
84090
84091           var value = utilGetSetValue(select(this.parentNode)
84092               .selectAll('.localized-value'));
84093
84094           if (lang && value) {
84095               t[key(lang)] = value;
84096           } else if (lang && _wikiTitles && _wikiTitles[d.lang]) {
84097               t[key(lang)] = _wikiTitles[d.lang];
84098           }
84099
84100           d.lang = lang;
84101           dispatch$1.call('change', this, t);
84102       }
84103
84104
84105       function changeValue(d) {
84106           if (!d.lang) return;
84107           var t = {};
84108           t[key(d.lang)] = utilGetSetValue(select(this)) || undefined;
84109           dispatch$1.call('change', this, t);
84110       }
84111
84112
84113       function fetchLanguages(value, cb) {
84114           var v = value.toLowerCase();
84115
84116           cb(wikipedia$2.filter(function(d) {
84117               return d[0].toLowerCase().indexOf(v) >= 0 ||
84118               d[1].toLowerCase().indexOf(v) >= 0 ||
84119               d[2].toLowerCase().indexOf(v) >= 0;
84120           }).map(function(d) {
84121               return { value: d[1] };
84122           }));
84123       }
84124
84125
84126       function renderMultilingual(selection) {
84127           var wraps = selection.selectAll('div.entry')
84128               .data(_multilingual, function(d) { return d.lang; });
84129
84130           wraps.exit()
84131               .transition()
84132               .duration(200)
84133               .style('max-height', '0px')
84134               .style('opacity', '0')
84135               .style('top', '-10px')
84136               .remove();
84137
84138           var innerWrap = wraps.enter()
84139               .insert('div', ':first-child');
84140
84141           innerWrap
84142               .attr('class', 'entry')
84143               .each(function() {
84144                   var wrap = select(this);
84145
84146                   var label = wrap
84147                       .append('label')
84148                       .attr('class', 'form-field-label');
84149
84150                   label
84151                       .append('span')
84152                       .attr('class', 'label-text')
84153                       .text(t('translate.localized_translation_label'));
84154
84155                   label
84156                       .append('button')
84157                       .attr('class', 'remove-icon-multilingual')
84158                       .on('click', function(d){
84159                           if (_isLocked) return;
84160                           event.preventDefault();
84161                           var t = {};
84162                           t[key(d.lang)] = undefined;
84163                           dispatch$1.call('change', this, t);
84164                           select(this.parentNode.parentNode.parentNode)
84165                               .style('top', '0')
84166                               .style('max-height', '240px')
84167                               .transition()
84168                               .style('opacity', '0')
84169                               .style('max-height', '0px')
84170                               .remove();
84171                       })
84172                       .call(svgIcon('#iD-operation-delete'));
84173
84174                   wrap
84175                       .append('input')
84176                       .attr('class', 'localized-lang')
84177                       .attr('type', 'text')
84178                       .attr('placeholder', t('translate.localized_translation_language'))
84179                       .on('blur', changeLang)
84180                       .on('change', changeLang)
84181                       .call(langCombo);
84182
84183                   wrap
84184                       .append('input')
84185                       .attr('type', 'text')
84186                       .attr('placeholder', t('translate.localized_translation_name'))
84187                       .attr('class', 'localized-value')
84188                       .on('blur', changeValue)
84189                       .on('change', changeValue);
84190               });
84191
84192           innerWrap
84193               .style('margin-top', '0px')
84194               .style('max-height', '0px')
84195               .style('opacity', '0')
84196               .transition()
84197               .duration(200)
84198               .style('margin-top', '10px')
84199               .style('max-height', '240px')
84200               .style('opacity', '1')
84201               .on('end', function() {
84202                   select(this)
84203                       .style('max-height', '')
84204                       .style('overflow', 'visible');
84205               });
84206
84207
84208           var entry = selection.selectAll('.entry');
84209
84210           utilGetSetValue(entry.select('.localized-lang'), function(d) {
84211               var lang = find$1(wikipedia$2, function(lang) { return lang[2] === d.lang; });
84212               return lang ? lang[1] : d.lang;
84213           });
84214
84215           utilGetSetValue(entry.select('.localized-value'),
84216               function(d) { return d.value; });
84217       }
84218
84219
84220       localized.tags = function(tags) {
84221           // Fetch translations from wikipedia
84222           if (tags.wikipedia && !_wikiTitles) {
84223               _wikiTitles = {};
84224               var wm = tags.wikipedia.match(/([^:]+):(.+)/);
84225               if (wm && wm[0] && wm[1]) {
84226                   wikipedia.translations(wm[1], wm[2], function(d) { _wikiTitles = d; });
84227               }
84228           }
84229
84230           utilGetSetValue(input, tags[field.key] || '');
84231
84232           calcMultilingual(tags);
84233
84234           _selection
84235               .call(localized);
84236       };
84237
84238
84239       localized.focus = function() {
84240           input.node().focus();
84241       };
84242
84243
84244       localized.entity = function(val) {
84245           if (!arguments.length) return _entity;
84246           _entity = val;
84247           _multilingual = [];
84248           return localized;
84249       };
84250
84251       return utilRebind(localized, dispatch$1, 'on');
84252   }
84253
84254   function uiFieldMaxspeed(field, context) {
84255       var dispatch$1 = dispatch('change');
84256       var unitInput = select(null);
84257       var input = select(null);
84258       var _entity;
84259       var _isImperial;
84260
84261       var speedCombo = uiCombobox(context, 'maxspeed');
84262       var unitCombo = uiCombobox(context, 'maxspeed-unit')
84263               .data(['km/h', 'mph'].map(comboValues));
84264
84265       var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
84266       var imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
84267
84268
84269       function maxspeed(selection) {
84270
84271           var wrap = selection.selectAll('.form-field-input-wrap')
84272               .data([0]);
84273
84274           wrap = wrap.enter()
84275               .append('div')
84276               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
84277               .merge(wrap);
84278
84279
84280           input = wrap.selectAll('#preset-input-' + field.safeid)
84281               .data([0]);
84282
84283           input = input.enter()
84284               .append('input')
84285               .attr('type', 'text')
84286               .attr('id', 'preset-input-' + field.safeid)
84287               .attr('placeholder', field.placeholder())
84288               .call(utilNoAuto)
84289               .call(speedCombo)
84290               .merge(input);
84291
84292           input
84293               .on('change', change)
84294               .on('blur', change);
84295
84296           var loc;
84297           if (_entity.type === 'node') {
84298               loc = _entity.loc;
84299           } else {
84300               var childNodes = context.graph().childNodes(context.entity(_entity.id));
84301               loc = childNodes[~~(childNodes.length/2)].loc;
84302           }
84303
84304           _isImperial = some(dataImperial.features, function(f) {
84305               return some(f.geometry.coordinates, function(d) {
84306                   return geoPointInPolygon(loc, d);
84307               });
84308           });
84309
84310           unitInput = wrap.selectAll('input.maxspeed-unit')
84311               .data([0]);
84312
84313           unitInput = unitInput.enter()
84314               .append('input')
84315               .attr('type', 'text')
84316               .attr('class', 'maxspeed-unit')
84317               .call(unitCombo)
84318               .merge(unitInput);
84319
84320           unitInput
84321               .on('blur', changeUnits)
84322               .on('change', changeUnits);
84323
84324
84325           function changeUnits() {
84326               _isImperial = utilGetSetValue(unitInput) === 'mph';
84327               utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
84328               setSuggestions();
84329               change();
84330           }
84331       }
84332
84333
84334       function setSuggestions() {
84335           speedCombo.data((_isImperial ? imperialValues : metricValues).map(comboValues));
84336           utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
84337       }
84338
84339
84340       function comboValues(d) {
84341           return {
84342               value: d.toString(),
84343               title: d.toString()
84344           };
84345       }
84346
84347
84348       function change() {
84349           var tag = {};
84350           var value = utilGetSetValue(input);
84351
84352           if (!value) {
84353               tag[field.key] = undefined;
84354           } else if (isNaN(value) || !_isImperial) {
84355               tag[field.key] = value;
84356           } else {
84357               tag[field.key] = value + ' mph';
84358           }
84359
84360           dispatch$1.call('change', this, tag);
84361       }
84362
84363
84364       maxspeed.tags = function(tags) {
84365           var value = tags[field.key];
84366
84367           if (value && value.indexOf('mph') >= 0) {
84368               value = parseInt(value, 10);
84369               _isImperial = true;
84370           } else if (value) {
84371               _isImperial = false;
84372           }
84373
84374           setSuggestions();
84375           utilGetSetValue(input, value || '');
84376       };
84377
84378
84379       maxspeed.focus = function() {
84380           input.node().focus();
84381       };
84382
84383
84384       maxspeed.entity = function(val) {
84385           _entity = val;
84386       };
84387
84388
84389       return utilRebind(maxspeed, dispatch$1, 'on');
84390   }
84391
84392   /**
84393    * This function is like `baseIndexOf` except that it accepts a comparator.
84394    *
84395    * @private
84396    * @param {Array} array The array to inspect.
84397    * @param {*} value The value to search for.
84398    * @param {number} fromIndex The index to search from.
84399    * @param {Function} comparator The comparator invoked per element.
84400    * @returns {number} Returns the index of the matched value, else `-1`.
84401    */
84402   function baseIndexOfWith(array, value, fromIndex, comparator) {
84403     var index = fromIndex - 1,
84404         length = array.length;
84405
84406     while (++index < length) {
84407       if (comparator(array[index], value)) {
84408         return index;
84409       }
84410     }
84411     return -1;
84412   }
84413
84414   /** Used for built-in method references. */
84415   var arrayProto$2 = Array.prototype;
84416
84417   /** Built-in value references. */
84418   var splice$2 = arrayProto$2.splice;
84419
84420   /**
84421    * The base implementation of `_.pullAllBy` without support for iteratee
84422    * shorthands.
84423    *
84424    * @private
84425    * @param {Array} array The array to modify.
84426    * @param {Array} values The values to remove.
84427    * @param {Function} [iteratee] The iteratee invoked per element.
84428    * @param {Function} [comparator] The comparator invoked per element.
84429    * @returns {Array} Returns `array`.
84430    */
84431   function basePullAll(array, values, iteratee, comparator) {
84432     var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
84433         index = -1,
84434         length = values.length,
84435         seen = array;
84436
84437     if (array === values) {
84438       values = copyArray(values);
84439     }
84440     if (iteratee) {
84441       seen = arrayMap(array, baseUnary(iteratee));
84442     }
84443     while (++index < length) {
84444       var fromIndex = 0,
84445           value = values[index],
84446           computed = iteratee ? iteratee(value) : value;
84447
84448       while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
84449         if (seen !== array) {
84450           splice$2.call(seen, fromIndex, 1);
84451         }
84452         splice$2.call(array, fromIndex, 1);
84453       }
84454     }
84455     return array;
84456   }
84457
84458   /**
84459    * This method is like `_.pull` except that it accepts an array of values to remove.
84460    *
84461    * **Note:** Unlike `_.difference`, this method mutates `array`.
84462    *
84463    * @static
84464    * @memberOf _
84465    * @since 4.0.0
84466    * @category Array
84467    * @param {Array} array The array to modify.
84468    * @param {Array} values The values to remove.
84469    * @returns {Array} Returns `array`.
84470    * @example
84471    *
84472    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
84473    *
84474    * _.pullAll(array, ['a', 'c']);
84475    * console.log(array);
84476    * // => ['b', 'b']
84477    */
84478   function pullAll(array, values) {
84479     return (array && array.length && values && values.length)
84480       ? basePullAll(array, values)
84481       : array;
84482   }
84483
84484   /**
84485    * Removes all given values from `array` using
84486    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
84487    * for equality comparisons.
84488    *
84489    * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
84490    * to remove elements from an array by predicate.
84491    *
84492    * @static
84493    * @memberOf _
84494    * @since 2.0.0
84495    * @category Array
84496    * @param {Array} array The array to modify.
84497    * @param {...*} [values] The values to remove.
84498    * @returns {Array} Returns `array`.
84499    * @example
84500    *
84501    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
84502    *
84503    * _.pull(array, 'a', 'c');
84504    * console.log(array);
84505    * // => ['b', 'b']
84506    */
84507   var pull = baseRest(pullAll);
84508
84509   function uiFieldRadio(field, context) {
84510       var dispatch$1 = dispatch('change');
84511       var placeholder = select(null);
84512       var wrap = select(null);
84513       var labels = select(null);
84514       var radios = select(null);
84515       var radioData = clone(field.options || field.keys);
84516       var typeField;
84517       var layerField;
84518       var _oldType = {};
84519       var _entity;
84520
84521
84522       function selectedKey() {
84523           var node = wrap.selectAll('.form-field-input-radio label.active input');
84524           return !node.empty() && node.datum();
84525       }
84526
84527
84528       function radio(selection) {
84529           selection.classed('preset-radio', true);
84530
84531           wrap = selection.selectAll('.form-field-input-wrap')
84532               .data([0]);
84533
84534           var enter = wrap.enter()
84535               .append('div')
84536               .attr('class', 'form-field-input-wrap form-field-input-radio');
84537
84538           enter
84539               .append('span')
84540               .attr('class', 'placeholder');
84541
84542           wrap = wrap
84543               .merge(enter);
84544
84545
84546           placeholder = wrap.selectAll('.placeholder');
84547
84548           labels = wrap.selectAll('label')
84549               .data(radioData);
84550
84551           enter = labels.enter()
84552               .append('label');
84553
84554           enter
84555               .append('input')
84556               .attr('type', 'radio')
84557               .attr('name', field.id)
84558               .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
84559               .attr('checked', false);
84560
84561           enter
84562               .append('span')
84563               .text(function(d) { return field.t('options.' + d, { 'default': d }); });
84564
84565           labels = labels
84566               .merge(enter);
84567
84568           radios = labels.selectAll('input')
84569               .on('change', changeRadio);
84570
84571       }
84572
84573
84574       function structureExtras(selection, tags) {
84575           var selected = selectedKey();
84576           var type = context.presets().field(selected);
84577           var layer = context.presets().field('layer');
84578           var showLayer = (selected === 'bridge' || selected === 'tunnel');
84579
84580
84581           var extrasWrap = selection.selectAll('.structure-extras-wrap')
84582               .data(selected ? [0] : []);
84583
84584           extrasWrap.exit()
84585               .remove();
84586
84587           extrasWrap = extrasWrap.enter()
84588               .append('div')
84589               .attr('class', 'structure-extras-wrap')
84590               .merge(extrasWrap);
84591
84592           var list = extrasWrap.selectAll('ul')
84593               .data([0]);
84594
84595           list = list.enter()
84596               .append('ul')
84597               .attr('class', 'labeled-inputs')
84598               .merge(list);
84599
84600
84601           // Type
84602           if (type) {
84603               if (!typeField || typeField.id !== selected) {
84604                   typeField = uiField(context, type, _entity, { wrap: false })
84605                       .on('change', changeType);
84606               }
84607               typeField.tags(tags);
84608           } else {
84609               typeField = null;
84610           }
84611
84612           var typeItem = list.selectAll('.structure-type-item')
84613               .data(typeField ? [typeField] : [], function(d) { return d.id; });
84614
84615           // Exit
84616           typeItem.exit()
84617               .remove();
84618
84619           // Enter
84620           var typeEnter = typeItem.enter()
84621               .insert('li', ':first-child')
84622               .attr('class', 'structure-type-item');
84623
84624           typeEnter
84625               .append('span')
84626               .attr('class', 'label structure-label-type')
84627               .attr('for', 'preset-input-' + selected)
84628               .text(t('inspector.radio.structure.type'));
84629
84630           typeEnter
84631               .append('div')
84632               .attr('class', 'structure-input-type-wrap');
84633
84634           // Update
84635           typeItem = typeItem
84636               .merge(typeEnter);
84637
84638           if (typeField) {
84639               typeItem.selectAll('.structure-input-type-wrap')
84640                   .call(typeField.render);
84641           }
84642
84643
84644           // Layer
84645           if (layer && showLayer) {
84646               if (!layerField) {
84647                   layerField = uiField(context, layer, _entity, { wrap: false })
84648                       .on('change', changeLayer);
84649               }
84650               layerField.tags(tags);
84651               field.keys = union(field.keys, ['layer']);
84652           } else {
84653               layerField = null;
84654               pull(field.keys, 'layer');
84655           }
84656
84657           var layerItem = list.selectAll('.structure-layer-item')
84658               .data(layerField ? [layerField] : []);
84659
84660           // Exit
84661           layerItem.exit()
84662               .remove();
84663
84664           // Enter
84665           var layerEnter = layerItem.enter()
84666               .append('li')
84667               .attr('class', 'structure-layer-item');
84668
84669           layerEnter
84670               .append('span')
84671               .attr('class', 'label structure-label-layer')
84672               .attr('for', 'preset-input-layer')
84673               .text(t('inspector.radio.structure.layer'));
84674
84675           layerEnter
84676               .append('div')
84677               .attr('class', 'structure-input-layer-wrap');
84678
84679           // Update
84680           layerItem = layerItem
84681               .merge(layerEnter);
84682
84683           if (layerField) {
84684               layerItem.selectAll('.structure-input-layer-wrap')
84685                   .call(layerField.render);
84686           }
84687       }
84688
84689
84690       function changeType(t, onInput) {
84691           var key = selectedKey();
84692           if (!key) return;
84693
84694           var val = t[key];
84695           if (val !== 'no') {
84696               _oldType[key] = val;
84697           }
84698
84699           if (field.type === 'structureRadio') {
84700               // remove layer if it should not be set
84701               if (val === 'no' ||
84702                   (key !== 'bridge' && key !== 'tunnel') ||
84703                   (key === 'tunnel' && val === 'building_passage')) {
84704                   t.layer = undefined;
84705               }
84706               // add layer if it should be set
84707               if (t.layer === undefined) {
84708                   if (key === 'bridge' && val !== 'no') {
84709                       t.layer = '1';
84710                   }
84711                   if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
84712                       t.layer = '-1';
84713                   }
84714               }
84715            }
84716
84717           dispatch$1.call('change', this, t, onInput);
84718       }
84719
84720
84721       function changeLayer(t, onInput) {
84722           if (t.layer === '0') {
84723               t.layer = undefined;
84724           }
84725           dispatch$1.call('change', this, t, onInput);
84726       }
84727
84728
84729       function changeRadio() {
84730           var t = {};
84731           var activeKey;
84732
84733           if (field.key) {
84734               t[field.key] = undefined;
84735           }
84736
84737           radios.each(function(d) {
84738               var active = select(this).property('checked');
84739               if (active) activeKey = d;
84740
84741               if (field.key) {
84742                   if (active) t[field.key] = d;
84743               } else {
84744                   var val = _oldType[activeKey] || 'yes';
84745                   t[d] = active ? val : undefined;
84746               }
84747           });
84748
84749           if (field.type === 'structureRadio') {
84750               if (activeKey === 'bridge') {
84751                   t.layer = '1';
84752               } else if (activeKey === 'tunnel' && t.tunnel !== 'building_passage') {
84753                   t.layer = '-1';
84754               } else {
84755                   t.layer = undefined;
84756               }
84757           }
84758
84759           dispatch$1.call('change', this, t);
84760       }
84761
84762
84763       radio.tags = function(tags) {
84764           function checked(d) {
84765               if (field.key) {
84766                   return tags[field.key] === d;
84767               } else {
84768                   return !!(tags[d] && tags[d].toLowerCase() !== 'no');
84769               }
84770           }
84771
84772           labels.classed('active', checked);
84773           radios.property('checked', checked);
84774
84775           var selection = radios.filter(function() { return this.checked; });
84776
84777           if (selection.empty()) {
84778               placeholder.text(t('inspector.none'));
84779           } else {
84780               placeholder.text(selection.attr('value'));
84781               _oldType[selection.datum()] = tags[selection.datum()];
84782           }
84783
84784           if (field.type === 'structureRadio') {
84785               // For waterways without a tunnel tag, set 'culvert' as
84786               // the _oldType to default to if the user picks 'tunnel'
84787               if (!!tags.waterway && !_oldType.tunnel) {
84788                   _oldType.tunnel = 'culvert';
84789               }
84790
84791               wrap.call(structureExtras, tags);
84792           }
84793       };
84794
84795
84796       radio.focus = function() {
84797           radios.node().focus();
84798       };
84799
84800
84801       radio.entity = function(val) {
84802           if (!arguments.length) return _entity;
84803           _entity = val;
84804           _oldType = {};
84805           return radio;
84806       };
84807
84808
84809       return utilRebind(radio, dispatch$1, 'on');
84810   }
84811
84812   function uiFieldRestrictions(field, context) {
84813       var dispatch$1 = dispatch('change');
84814       var breathe = behaviorBreathe(context);
84815       var storedViaWay = context.storage('turn-restriction-via-way');
84816       var storedDistance = context.storage('turn-restriction-distance');
84817
84818       var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
84819       var _maxDistance = storedDistance ? (+storedDistance) : 30;
84820       var _initialized = false;
84821       var _parent = select(null);       // the entire field
84822       var _container = select(null);    // just the map
84823       var _oldTurns;
84824       var _graph;
84825       var _vertexID;
84826       var _intersection;
84827       var _fromWayID;
84828
84829       var _lastXPos;
84830
84831
84832       function restrictions(selection) {
84833           _parent = selection;
84834
84835           // try to reuse the intersection, but always rebuild it if the graph has changed
84836           if (_vertexID && (context.graph() !== _graph || !_intersection)) {
84837               _graph = context.graph();
84838               _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
84839           }
84840
84841           // It's possible for there to be no actual intersection here.
84842           // for example, a vertex of two `highway=path`
84843           // In this case, hide the field.
84844           var isOK = (
84845               _intersection &&
84846               _intersection.vertices.length &&           // has vertices
84847               _intersection.vertices                     // has the vertex that the user selected
84848                   .filter(function(vertex) { return vertex.id === _vertexID; }).length &&
84849               _intersection.ways.length > 2 &&           // has more than 2 ways
84850               _intersection.ways                         // has more than 1 TO way
84851                   .filter(function(way) { return way.__to; }).length > 1
84852           );
84853
84854           // Also hide in the case where
84855           select(selection.node().parentNode).classed('hide', !isOK);
84856
84857           // if form field is hidden or has detached from dom, clean up.
84858           if (!isOK ||
84859               !select('.inspector-wrap.inspector-hidden').empty() ||
84860               !selection.node().parentNode ||
84861               !selection.node().parentNode.parentNode) {
84862               selection.call(restrictions.off);
84863               return;
84864           }
84865
84866
84867           var wrap = selection.selectAll('.form-field-input-wrap')
84868               .data([0]);
84869
84870           wrap = wrap.enter()
84871               .append('div')
84872               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
84873               .merge(wrap);
84874
84875           var container = wrap.selectAll('.restriction-container')
84876               .data([0]);
84877
84878           // enter
84879           var containerEnter = container.enter()
84880               .append('div')
84881               .attr('class', 'restriction-container');
84882
84883           containerEnter
84884               .append('div')
84885               .attr('class', 'restriction-help');
84886
84887           // update
84888           _container = containerEnter
84889               .merge(container)
84890               .call(renderViewer);
84891
84892           var controls = wrap.selectAll('.restriction-controls')
84893               .data([0]);
84894
84895           // enter/update
84896           controls.enter()
84897               .append('div')
84898               .attr('class', 'restriction-controls-container')
84899               .append('div')
84900               .attr('class', 'restriction-controls')
84901               .merge(controls)
84902               .call(renderControls);
84903       }
84904
84905
84906       function renderControls(selection) {
84907           var distControl = selection.selectAll('.restriction-distance')
84908               .data([0]);
84909
84910           distControl.exit()
84911               .remove();
84912
84913           var distControlEnter = distControl.enter()
84914               .append('div')
84915               .attr('class', 'restriction-control restriction-distance');
84916
84917           distControlEnter
84918               .append('span')
84919               .attr('class', 'restriction-control-label restriction-distance-label')
84920               .text(t('restriction.controls.distance') + ':');
84921
84922           distControlEnter
84923               .append('input')
84924               .attr('class', 'restriction-distance-input')
84925               .attr('type', 'range')
84926               .attr('min', '20')
84927               .attr('max', '50')
84928               .attr('step', '5');
84929
84930           distControlEnter
84931               .append('span')
84932               .attr('class', 'restriction-distance-text');
84933
84934           // update
84935           selection.selectAll('.restriction-distance-input')
84936               .property('value', _maxDistance)
84937               .on('input', function() {
84938                   var val = select(this).property('value');
84939                   _maxDistance = +val;
84940                   _intersection = null;
84941                   _container.selectAll('.layer-osm .layer-turns *').remove();
84942                   context.storage('turn-restriction-distance', _maxDistance);
84943                   _parent.call(restrictions);
84944               });
84945
84946           selection.selectAll('.restriction-distance-text')
84947               .text(displayMaxDistance(_maxDistance));
84948
84949
84950           var viaControl = selection.selectAll('.restriction-via-way')
84951               .data([0]);
84952
84953           viaControl.exit()
84954               .remove();
84955
84956           var viaControlEnter = viaControl.enter()
84957               .append('div')
84958               .attr('class', 'restriction-control restriction-via-way');
84959
84960           viaControlEnter
84961               .append('span')
84962               .attr('class', 'restriction-control-label restriction-via-way-label')
84963               .text(t('restriction.controls.via') + ':');
84964
84965           viaControlEnter
84966               .append('input')
84967               .attr('class', 'restriction-via-way-input')
84968               .attr('type', 'range')
84969               .attr('min', '0')
84970               .attr('max', '2')
84971               .attr('step', '1');
84972
84973           viaControlEnter
84974               .append('span')
84975               .attr('class', 'restriction-via-way-text');
84976
84977           // update
84978           selection.selectAll('.restriction-via-way-input')
84979               .property('value', _maxViaWay)
84980               .on('input', function() {
84981                   var val = select(this).property('value');
84982                   _maxViaWay = +val;
84983                   _container.selectAll('.layer-osm .layer-turns *').remove();
84984                   context.storage('turn-restriction-via-way', _maxViaWay);
84985                   _parent.call(restrictions);
84986               });
84987
84988           selection.selectAll('.restriction-via-way-text')
84989               .text(displayMaxVia(_maxViaWay));
84990       }
84991
84992
84993       function renderViewer(selection) {
84994           if (!_intersection) return;
84995
84996           var vgraph = _intersection.graph;
84997           var filter = utilFunctor(true);
84998           var projection = geoRawMercator();
84999
85000           // Reflow warning: `utilGetDimensions` calls `getBoundingClientRect`
85001           // Instead of asking the restriction-container for its dimensions,
85002           //  we can ask the #sidebar, which can have its dimensions cached.
85003           // width: calc as sidebar - padding
85004           // height: hardcoded (from `80_app.css`)
85005           // var d = utilGetDimensions(selection);
85006           var sdims = utilGetDimensions(select('#sidebar'));
85007           var d = [ sdims[0] - 50, 370 ];
85008           var c = geoVecScale(d, 0.5);
85009           var z = 22;
85010
85011           projection.scale(geoZoomToScale(z));
85012
85013           // Calculate extent of all key vertices
85014           var extent = geoExtent();
85015           for (var i = 0; i < _intersection.vertices.length; i++) {
85016               extent._extend(_intersection.vertices[i].extent());
85017           }
85018
85019           // If this is a large intersection, adjust zoom to fit extent
85020           if (_intersection.vertices.length > 1) {
85021               var padding = 180;   // in z22 pixels
85022               var tl = projection([extent[0][0], extent[1][1]]);
85023               var br = projection([extent[1][0], extent[0][1]]);
85024               var hFactor = (br[0] - tl[0]) / (d[0] - padding);
85025               var vFactor = (br[1] - tl[1]) / (d[1] - padding);
85026               var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
85027               var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
85028               z = z - Math.max(hZoomDiff, vZoomDiff);
85029               projection.scale(geoZoomToScale(z));
85030           }
85031
85032           var padTop = 35;   // reserve top space for hint text
85033           var extentCenter = projection(extent.center());
85034           extentCenter[1] = extentCenter[1] - padTop;
85035
85036           projection
85037               .translate(geoVecSubtract(c, extentCenter))
85038               .clipExtent([[0, 0], d]);
85039
85040           var drawLayers = svgLayers(projection, context).only(['osm','touch']).dimensions(d);
85041           var drawVertices = svgVertices(projection, context);
85042           var drawLines = svgLines(projection, context);
85043           var drawTurns = svgTurns(projection, context);
85044
85045           var firstTime = selection.selectAll('.surface').empty();
85046
85047           selection
85048               .call(drawLayers);
85049
85050           var surface = selection.selectAll('.surface')
85051               .classed('tr', true);
85052
85053           if (firstTime) {
85054               _initialized = true;
85055
85056               surface
85057                   .call(breathe);
85058           }
85059
85060           // This can happen if we've lowered the detail while a FROM way
85061           // is selected, and that way is no longer part of the intersection.
85062           if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
85063               _fromWayID = null;
85064               _oldTurns = null;
85065           }
85066
85067           surface
85068               .call(utilSetDimensions, d)
85069               .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
85070               .call(drawLines, vgraph, _intersection.ways, filter)
85071               .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
85072
85073           surface
85074               .on('click.restrictions', click)
85075               .on('mouseover.restrictions', mouseover);
85076
85077           surface
85078               .selectAll('.selected')
85079               .classed('selected', false);
85080
85081           surface
85082               .selectAll('.related')
85083               .classed('related', false);
85084
85085           if (_fromWayID) {
85086               var way = vgraph.entity(_fromWayID);
85087               surface
85088                   .selectAll('.' + _fromWayID)
85089                   .classed('selected', true)
85090                   .classed('related', true);
85091           }
85092
85093           document.addEventListener('resizeWindow', function () {
85094               utilSetDimensions(_container, null);
85095               redraw(1);
85096           }, false);
85097
85098           updateHints(null);
85099
85100
85101           function click() {
85102               surface
85103                   .call(breathe.off)
85104                   .call(breathe);
85105
85106               var datum = event.target.__data__;
85107               var entity = datum && datum.properties && datum.properties.entity;
85108               if (entity) {
85109                   datum = entity;
85110               }
85111
85112               if (datum instanceof osmWay && (datum.__from || datum.__via)) {
85113                   _fromWayID = datum.id;
85114                   _oldTurns = null;
85115                   redraw();
85116
85117               } else if (datum instanceof osmTurn) {
85118                   var actions, extraActions, turns, i;
85119                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
85120
85121                   if (datum.restrictionID && !datum.direct) {
85122                       return;
85123
85124                   } else if (datum.restrictionID && !datum.only) {    // NO -> ONLY
85125                       var seen = {};
85126                       var datumOnly = cloneDeep(datum);
85127                       datumOnly.only = true;
85128                       restrictionType = restrictionType.replace(/^no/, 'only');
85129
85130                       // Adding an ONLY restriction should destroy all other direct restrictions from the FROM towards the VIA.
85131                       // We will remember them in _oldTurns, and restore them if the user clicks again.
85132                       turns = _intersection.turns(_fromWayID, 2);
85133                       extraActions = [];
85134                       _oldTurns = [];
85135                       for (i = 0; i < turns.length; i++) {
85136                           var turn = turns[i];
85137                           if (seen[turn.restrictionID]) continue;  // avoid deleting the turn twice (#4968, #4928)
85138
85139                           if (turn.direct && turn.path[1] === datum.path[1]) {
85140                               seen[turns[i].restrictionID] = true;
85141                               turn.restrictionType = osmInferRestriction(vgraph, turn, projection);
85142                               _oldTurns.push(turn);
85143                               extraActions.push(actionUnrestrictTurn(turn));
85144                           }
85145                       }
85146
85147                       actions = _intersection.actions.concat(extraActions, [
85148                           actionRestrictTurn(datumOnly, restrictionType),
85149                           t('operations.restriction.annotation.create')
85150                       ]);
85151
85152                   } else if (datum.restrictionID) {   // ONLY -> Allowed
85153                       // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
85154                       // This relies on the assumption that the intersection was already split up when we
85155                       // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
85156                       turns = _oldTurns || [];
85157                       extraActions = [];
85158                       for (i = 0; i < turns.length; i++) {
85159                           if (turns[i].key !== datum.key) {
85160                               extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
85161                           }
85162                       }
85163                       _oldTurns = null;
85164
85165                       actions = _intersection.actions.concat(extraActions, [
85166                           actionUnrestrictTurn(datum),
85167                           t('operations.restriction.annotation.delete')
85168                       ]);
85169
85170                   } else {    // Allowed -> NO
85171                       actions = _intersection.actions.concat([
85172                           actionRestrictTurn(datum, restrictionType),
85173                           t('operations.restriction.annotation.create')
85174                       ]);
85175                   }
85176
85177                   context.perform.apply(context, actions);
85178
85179                   // At this point the datum will be changed, but will have same key..
85180                   // Refresh it and update the help..
85181                   var s = surface.selectAll('.' + datum.key);
85182                   datum = s.empty() ? null : s.datum();
85183                   updateHints(datum);
85184
85185               } else {
85186                   _fromWayID = null;
85187                   _oldTurns = null;
85188                   redraw();
85189               }
85190           }
85191
85192
85193           function mouseover() {
85194               var datum = event.target.__data__;
85195               updateHints(datum);
85196           }
85197
85198           _lastXPos = _lastXPos || sdims[0];
85199
85200           function redraw(minChange) {
85201               var xPos = -1;
85202
85203               if (minChange) {
85204                   xPos = utilGetDimensions(select('#sidebar'))[0];
85205               }
85206
85207               if (!minChange || (minChange && Math.abs(xPos - _lastXPos) >= minChange)) {
85208                   if (context.hasEntity(_vertexID)) {
85209                       _lastXPos = xPos;
85210                       _container.call(renderViewer);
85211                   }
85212               }
85213           }
85214
85215
85216           function highlightPathsFrom(wayID) {
85217               surface.selectAll('.related')
85218                   .classed('related', false)
85219                   .classed('allow', false)
85220                   .classed('restrict', false)
85221                   .classed('only', false);
85222
85223               surface.selectAll('.' + wayID)
85224                   .classed('related', true);
85225
85226               if (wayID) {
85227                   var turns = _intersection.turns(wayID, _maxViaWay);
85228                   for (var i = 0; i < turns.length; i++) {
85229                       var turn = turns[i];
85230                       var ids = [turn.to.way];
85231                       var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
85232
85233                       if (turn.only || turns.length === 1) {
85234                           if (turn.via.ways) {
85235                               ids = ids.concat(turn.via.ways);
85236                           }
85237                       } else if (turn.to.way === wayID) {
85238                           continue;
85239                       }
85240
85241                       surface.selectAll(utilEntitySelector(ids))
85242                           .classed('related', true)
85243                           .classed('allow', (klass === 'allow'))
85244                           .classed('restrict', (klass === 'restrict'))
85245                           .classed('only', (klass === 'only'));
85246                   }
85247               }
85248           }
85249
85250
85251           function updateHints(datum) {
85252               var help = _container.selectAll('.restriction-help').html('');
85253
85254               var placeholders = {};
85255               ['from', 'via', 'to'].forEach(function(k) {
85256                   placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
85257               });
85258
85259               var entity = datum && datum.properties && datum.properties.entity;
85260               if (entity) {
85261                   datum = entity;
85262               }
85263
85264               if (_fromWayID) {
85265                   way = vgraph.entity(_fromWayID);
85266                   surface
85267                       .selectAll('.' + _fromWayID)
85268                       .classed('selected', true)
85269                       .classed('related', true);
85270               }
85271
85272               // Hovering a way
85273               if (datum instanceof osmWay && datum.__from) {
85274                   way = datum;
85275
85276                   highlightPathsFrom(_fromWayID ? null : way.id);
85277                   surface.selectAll('.' + way.id)
85278                       .classed('related', true);
85279
85280                   var clickSelect = (!_fromWayID || _fromWayID !== way.id);
85281                   help
85282                       .append('div')      // "Click to select FROM {fromName}." / "FROM {fromName}"
85283                       .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
85284                           from: placeholders.from,
85285                           fromName: displayName(way.id, vgraph)
85286                       }));
85287
85288
85289               // Hovering a turn arrow
85290               } else if (datum instanceof osmTurn) {
85291                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
85292                   var turnType = restrictionType.replace(/^(only|no)\_/, '');
85293                   var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
85294                   var klass, turnText, nextText;
85295
85296                   if (datum.no) {
85297                       klass = 'restrict';
85298                       turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
85299                       nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
85300                   } else if (datum.only) {
85301                       klass = 'only';
85302                       turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
85303                       nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
85304                   } else {
85305                       klass = 'allow';
85306                       turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
85307                       nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
85308                   }
85309
85310                   help
85311                       .append('div')      // "NO Right Turn (indirect)"
85312                       .attr('class', 'qualifier ' + klass)
85313                       .text(turnText);
85314
85315                   help
85316                       .append('div')      // "FROM {fromName} TO {toName}"
85317                       .html(t('restriction.help.from_name_to_name', {
85318                           from: placeholders.from,
85319                           fromName: displayName(datum.from.way, vgraph),
85320                           to: placeholders.to,
85321                           toName: displayName(datum.to.way, vgraph)
85322                       }));
85323
85324                   if (datum.via.ways && datum.via.ways.length) {
85325                       var names = [];
85326                       for (var i = 0; i < datum.via.ways.length; i++) {
85327                           var prev = names[names.length - 1];
85328                           var curr = displayName(datum.via.ways[i], vgraph);
85329                           if (!prev || curr !== prev)   // collapse identical names
85330                               names.push(curr);
85331                       }
85332
85333                       help
85334                           .append('div')      // "VIA {viaNames}"
85335                           .html(t('restriction.help.via_names', {
85336                               via: placeholders.via,
85337                               viaNames: names.join(', ')
85338                           }));
85339                   }
85340
85341                   if (!indirect) {
85342                       help
85343                           .append('div')      // Click for "No Right Turn"
85344                           .text(t('restriction.help.toggle', { turn: nextText.trim() }));
85345                   }
85346
85347                   highlightPathsFrom(null);
85348                   var alongIDs = datum.path.slice();
85349                   surface.selectAll(utilEntitySelector(alongIDs))
85350                       .classed('related', true)
85351                       .classed('allow', (klass === 'allow'))
85352                       .classed('restrict', (klass === 'restrict'))
85353                       .classed('only', (klass === 'only'));
85354
85355
85356               // Hovering empty surface
85357               } else {
85358                   highlightPathsFrom(null);
85359                   if (_fromWayID) {
85360                       help
85361                           .append('div')      // "FROM {fromName}"
85362                           .html(t('restriction.help.from_name', {
85363                               from: placeholders.from,
85364                               fromName: displayName(_fromWayID, vgraph)
85365                           }));
85366
85367                   } else {
85368                       help
85369                           .append('div')      // "Click to select a FROM segment."
85370                           .html(t('restriction.help.select_from', {
85371                               from: placeholders.from
85372                           }));
85373                   }
85374               }
85375           }
85376       }
85377
85378
85379       function displayMaxDistance(maxDist) {
85380           var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
85381           var opts;
85382
85383           if (isImperial) {
85384               var distToFeet = {   // imprecise conversion for prettier display
85385                   20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
85386               }[maxDist];
85387               opts = { distance: t('units.feet', { quantity: distToFeet }) };
85388           } else {
85389               opts = { distance: t('units.meters', { quantity: maxDist }) };
85390           }
85391
85392           return t('restriction.controls.distance_up_to', opts);
85393       }
85394
85395
85396       function displayMaxVia(maxVia) {
85397           return maxVia === 0 ? t('restriction.controls.via_node_only')
85398               : maxVia === 1 ? t('restriction.controls.via_up_to_one')
85399               : t('restriction.controls.via_up_to_two');
85400       }
85401
85402
85403       function displayName(entityID, graph) {
85404           var entity = graph.entity(entityID);
85405           var name = utilDisplayName(entity) || '';
85406           var matched = context.presets().match(entity, graph);
85407           var type = (matched && matched.name()) || utilDisplayType(entity.id);
85408           return name || type;
85409       }
85410
85411
85412       restrictions.entity = function(_) {
85413           _intersection = null;
85414           _fromWayID = null;
85415           _oldTurns = null;
85416           _vertexID = _.id;
85417       };
85418
85419
85420       restrictions.tags = function() {};
85421       restrictions.focus = function() {};
85422
85423
85424       restrictions.off = function(selection) {
85425           if (!_initialized) return;
85426
85427           selection.selectAll('.surface')
85428               .call(breathe.off)
85429               .on('click.restrictions', null)
85430               .on('mouseover.restrictions', null);
85431
85432           select(window)
85433               .on('resize.restrictions', null);
85434       };
85435
85436
85437       return utilRebind(restrictions, dispatch$1, 'on');
85438   }
85439
85440   function uiFieldTextarea(field) {
85441       var dispatch$1 = dispatch('change');
85442       var input = select(null);
85443
85444
85445       function textarea(selection) {
85446           var wrap = selection.selectAll('.form-field-input-wrap')
85447               .data([0]);
85448
85449           wrap = wrap.enter()
85450               .append('div')
85451               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
85452               .merge(wrap);
85453
85454           input = wrap.selectAll('textarea')
85455               .data([0]);
85456
85457           input = input.enter()
85458               .append('textarea')
85459               .attr('id', 'preset-input-' + field.safeid)
85460               .attr('placeholder', field.placeholder() || t('inspector.unknown'))
85461               .attr('maxlength', 255)
85462               .call(utilNoAuto)
85463               .on('input', change(true))
85464               .on('blur', change())
85465               .on('change', change())
85466               .merge(input);
85467       }
85468
85469
85470       function change(onInput) {
85471           return function() {
85472               var t = {};
85473               t[field.key] = utilGetSetValue(input) || undefined;
85474               dispatch$1.call('change', this, t, onInput);
85475           };
85476       }
85477
85478
85479       textarea.tags = function(tags) {
85480           utilGetSetValue(input, tags[field.key] || '');
85481       };
85482
85483
85484       textarea.focus = function() {
85485           input.node().focus();
85486       };
85487
85488
85489       return utilRebind(textarea, dispatch$1, 'on');
85490   }
85491
85492   function uiFieldWikidata(field) {
85493       var wikidata = services.wikidata;
85494       var dispatch$1 = dispatch('change');
85495       var link = select(null);
85496       var title = select(null);
85497       var _wikiURL = '';
85498
85499
85500       function wiki(selection) {
85501
85502           var wrap = selection.selectAll('.form-field-input-wrap')
85503               .data([0]);
85504
85505           wrap = wrap.enter()
85506               .append('div')
85507               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
85508               .merge(wrap);
85509
85510
85511           var list = wrap.selectAll('ul')
85512               .data([0]);
85513
85514           list = list.enter()
85515               .append('ul')
85516               .attr('class', 'labeled-inputs')
85517               .merge(list);
85518
85519           var wikidataProperties = ['identifier', 'label', 'description'];
85520
85521           var items = list.selectAll('li')
85522               .data(wikidataProperties);
85523
85524           // Enter
85525           var enter = items.enter()
85526               .append('li')
85527               .attr('class', function(d) { return 'preset-wikidata-' + d; });
85528
85529           enter
85530               .append('span')
85531               .attr('class', 'label')
85532               .attr('for', function(d) { return 'preset-input-wikidata-' + d; })
85533               .text(function(d) { return t('wikidata.' + d); });
85534
85535           var inputWrap = enter
85536               .append('div')
85537               .attr('class', 'input-wrap');
85538
85539           inputWrap
85540               .append('input')
85541               .attr('type', 'text')
85542               .attr('class', 'preset-input-wikidata')
85543               .attr('id', function(d) { return 'preset-input-wikidata-' + d; });
85544
85545
85546           title = wrap.select('.preset-wikidata-identifier input')
85547               .call(utilNoAuto)
85548               .merge(title);
85549
85550           title
85551               .on('blur', blur)
85552               .on('change', change);
85553
85554           var idItem = wrap.select('.preset-wikidata-identifier');
85555
85556           idItem.select('button')
85557               .remove();
85558
85559           link = idItem
85560               .append('button')
85561               .attr('class', 'form-field-button wiki-link')
85562               .attr('title', t('icons.open_wikidata'))
85563               .attr('tabindex', -1)
85564               .call(svgIcon('#iD-icon-out-link'))
85565               .merge(link);
85566
85567           link
85568               .on('click', function() {
85569                   event.preventDefault();
85570                   if (_wikiURL) window.open(_wikiURL, '_blank');
85571               });
85572
85573           var readOnlyItems = wrap.selectAll('li:not(.preset-wikidata-identifier)');
85574
85575           readOnlyItems.select('input')
85576               .classed('disabled', 'true')
85577               .attr('readonly', 'true');
85578
85579           readOnlyItems.select('button')
85580               .remove();
85581
85582           readOnlyItems.append('button')
85583               .attr('class', 'form-field-button wiki-link')
85584               .attr('title', t('icons.copy'))
85585               .attr('tabindex', -1)
85586               .call(svgIcon('#iD-operation-copy'))
85587               .on('click', function() {
85588                   event.preventDefault();
85589                   select(this.parentNode)
85590                       .select('input')
85591                       .node()
85592                       .select();
85593                   document.execCommand('copy');
85594               });
85595       }
85596
85597
85598       function blur() {
85599           change();
85600       }
85601
85602
85603       function change() {
85604           var syncTags = {
85605               wikidata: utilGetSetValue(title)
85606           };
85607           dispatch$1.call('change', this, syncTags);
85608       }
85609
85610
85611       wiki.tags = function(tags) {
85612           var value = tags[field.key] || '';
85613           utilGetSetValue(title, value);
85614
85615           if (!/^Q[0-9]*$/.test(value)) {   // not a proper QID
85616               unrecognized();
85617               return;
85618           }
85619
85620           // QID value in correct format
85621           _wikiURL = 'https://wikidata.org/wiki/' + value;
85622           wikidata.entityByQID(value, function(err, entity) {
85623               if (err) {
85624                   unrecognized();
85625                   return;
85626               }
85627
85628               var label = '';
85629               var description = '';
85630
85631               if (entity.labels && Object.keys(entity.labels).length > 0) {
85632                   label = entity.labels[Object.keys(entity.labels)[0]].value;
85633               }
85634               if (entity.descriptions && Object.keys(entity.descriptions).length > 0) {
85635                   description = entity.descriptions[Object.keys(entity.descriptions)[0]].value;
85636               }
85637
85638               select('.preset-wikidata-label')
85639                   .style('display', function(){
85640                       return label.length > 0 ? 'flex' : 'none';
85641                   })
85642                   .select('input')
85643                   .attr('value', label);
85644
85645               select('.preset-wikidata-description')
85646                   .style('display', function(){
85647                       return description.length > 0 ? 'flex' : 'none';
85648                   })
85649                   .select('input')
85650                   .attr('value', description);
85651           });
85652
85653
85654           // not a proper QID
85655           function unrecognized() {
85656               select('.preset-wikidata-label')
85657                   .style('display', 'none');
85658               select('.preset-wikidata-description')
85659                   .style('display', 'none');
85660
85661               if (value && value !== '') {
85662                   _wikiURL = 'https://wikidata.org/wiki/Special:Search?search=' + value;
85663               } else {
85664                   _wikiURL = '';
85665               }
85666           }
85667       };
85668
85669
85670       wiki.focus = function() {
85671           title.node().focus();
85672       };
85673
85674
85675       return utilRebind(wiki, dispatch$1, 'on');
85676   }
85677
85678   function uiFieldWikipedia(field, context) {
85679       var dispatch$1 = dispatch('change');
85680       var wikipedia = services.wikipedia;
85681       var wikidata = services.wikidata;
85682       var lang = select(null);
85683       var title = select(null);
85684       var _wikiURL = '';
85685       var _entity;
85686
85687       var langCombo = uiCombobox(context, 'wikipedia-lang')
85688           .fetcher(function(value, cb) {
85689               var v = value.toLowerCase();
85690
85691               cb(wikipedia$2.filter(function(d) {
85692                   return d[0].toLowerCase().indexOf(v) >= 0 ||
85693                       d[1].toLowerCase().indexOf(v) >= 0 ||
85694                       d[2].toLowerCase().indexOf(v) >= 0;
85695               }).map(function(d) {
85696                   return { value: d[1] };
85697               }));
85698           });
85699
85700       var titleCombo = uiCombobox(context, 'wikipedia-title')
85701           .fetcher(function(value, cb) {
85702               if (!value && _entity) {
85703                   value = context.entity(_entity.id).tags.name || '';
85704               }
85705
85706               var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
85707               searchfn(language()[2], value, function(query, data) {
85708                   cb(data.map(function(d) {
85709                       return { value: d };
85710                   }));
85711               });
85712           });
85713
85714
85715       function wiki(selection) {
85716           var wrap = selection.selectAll('.form-field-input-wrap')
85717               .data([0]);
85718
85719           wrap = wrap.enter()
85720               .append('div')
85721               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
85722               .merge(wrap);
85723
85724
85725           var langRow = wrap.selectAll('.wiki-lang-container')
85726               .data([0]);
85727
85728           langRow = langRow.enter()
85729               .append('div')
85730               .attr('class', 'wiki-lang-container')
85731               .merge(langRow);
85732
85733
85734           lang = langRow.selectAll('input.wiki-lang')
85735               .data([0]);
85736
85737           lang = lang.enter()
85738               .append('input')
85739               .attr('type', 'text')
85740               .attr('class', 'wiki-lang')
85741               .attr('placeholder', t('translate.localized_translation_language'))
85742               .call(utilNoAuto)
85743               .call(langCombo)
85744               .merge(lang);
85745
85746           utilGetSetValue(lang, language()[1]);
85747
85748           lang
85749               .on('blur', changeLang)
85750               .on('change', changeLang);
85751
85752
85753           var titleRow = wrap.selectAll('.wiki-title-container')
85754               .data([0]);
85755
85756           titleRow = titleRow.enter()
85757               .append('div')
85758               .attr('class', 'wiki-title-container')
85759               .merge(titleRow);
85760
85761           title = titleRow.selectAll('input.wiki-title')
85762               .data([0]);
85763
85764           title = title.enter()
85765               .append('input')
85766               .attr('type', 'text')
85767               .attr('class', 'wiki-title')
85768               .attr('id', 'preset-input-' + field.safeid)
85769               .call(utilNoAuto)
85770               .call(titleCombo)
85771               .merge(title);
85772
85773           title
85774               .on('blur', blur)
85775               .on('change', change);
85776
85777
85778           var link = titleRow.selectAll('.wiki-link')
85779               .data([0]);
85780
85781           link = link.enter()
85782               .append('button')
85783               .attr('class', 'form-field-button wiki-link')
85784               .attr('tabindex', -1)
85785               .call(svgIcon('#iD-icon-out-link'))
85786               .merge(link);
85787
85788           link
85789               .on('click', function() {
85790                   event.preventDefault();
85791                   if (_wikiURL) window.open(_wikiURL, '_blank');
85792               });
85793       }
85794
85795
85796       function language() {
85797           var value = utilGetSetValue(lang).toLowerCase();
85798           var locale = utilDetect().locale.toLowerCase();
85799           var localeLanguage;
85800           return find$1(wikipedia$2, function(d) {
85801               if (d[2] === locale) localeLanguage = d;
85802               return d[0].toLowerCase() === value ||
85803                   d[1].toLowerCase() === value ||
85804                   d[2] === value;
85805           }) || localeLanguage || ['English', 'English', 'en'];
85806       }
85807
85808
85809       function changeLang() {
85810           utilGetSetValue(lang, language()[1]);
85811           change(true);
85812       }
85813
85814
85815       function blur() {
85816           change(true);
85817       }
85818
85819
85820       function change(skipWikidata) {
85821           var value = utilGetSetValue(title);
85822           var m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/);
85823           var l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; });
85824           var syncTags = {};
85825
85826           if (l) {
85827               // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
85828               value = decodeURIComponent(m[2]).replace(/_/g, ' ');
85829               if (m[3]) {
85830                   var anchor;
85831                   try {
85832                       // Best-effort `anchordecode:` implementation
85833                       anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
85834                   } catch (e) {
85835                       anchor = decodeURIComponent(m[3]);
85836                   }
85837                   value += '#' + anchor.replace(/_/g, ' ');
85838               }
85839               value = value.slice(0, 1).toUpperCase() + value.slice(1);
85840               utilGetSetValue(lang, l[1]);
85841               utilGetSetValue(title, value);
85842           }
85843
85844           if (value) {
85845               syncTags.wikipedia = language()[2] + ':' + value;
85846           } else {
85847               syncTags.wikipedia = undefined;
85848               syncTags.wikidata = undefined;
85849           }
85850
85851           dispatch$1.call('change', this, syncTags);
85852
85853
85854           if (skipWikidata || !value || !language()[2]) return;
85855
85856           // attempt asynchronous update of wikidata tag..
85857           var initGraph = context.graph();
85858           var initEntityID = _entity.id;
85859
85860           wikidata.itemsByTitle(language()[2], value, function(err, data) {
85861               if (err) return;
85862
85863               // If graph has changed, we can't apply this update.
85864               if (context.graph() !== initGraph) return;
85865
85866               if (!data || !Object.keys(data).length) return;
85867
85868               var qids = Object.keys(data);
85869               var value = qids && find$1(qids, function(id) { return id.match(/^Q\d+$/); });
85870               var currTags = clone(context.entity(initEntityID).tags);
85871
85872               currTags.wikidata = value;
85873
85874               // Coalesce the update of wikidata tag into the previous tag change
85875               context.overwrite(
85876                   actionChangeTags(initEntityID, currTags),
85877                   context.history().undoAnnotation()
85878               );
85879
85880               // do not dispatch.call('change') here, because entity_editor
85881               // changeTags() is not intended to be called asynchronously
85882           });
85883       }
85884
85885
85886       wiki.tags = function(tags) {
85887           var value = tags[field.key] || '';
85888           var m = value.match(/([^:]+):([^#]+)(?:#(.+))?/);
85889           var l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; });
85890           var anchor = m && m[3];
85891
85892           // value in correct format
85893           if (l) {
85894               utilGetSetValue(lang, l[1]);
85895               utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
85896               if (anchor) {
85897                   try {
85898                       // Best-effort `anchorencode:` implementation
85899                       anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
85900                   } catch (e) {
85901                       anchor = anchor.replace(/ /g, '_');
85902                   }
85903               }
85904               _wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
85905                   m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
85906
85907           // unrecognized value format
85908           } else {
85909               utilGetSetValue(title, value);
85910               if (value && value !== '') {
85911                   utilGetSetValue(lang, '');
85912                   _wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
85913               } else {
85914                   _wikiURL = '';
85915               }
85916           }
85917       };
85918
85919
85920       wiki.entity = function(val) {
85921           if (!arguments.length) return _entity;
85922           _entity = val;
85923           return wiki;
85924       };
85925
85926
85927       wiki.focus = function() {
85928           title.node().focus();
85929       };
85930
85931
85932       return utilRebind(wiki, dispatch$1, 'on');
85933   }
85934
85935   var uiFields = {
85936       access: uiFieldAccess,
85937       address: uiFieldAddress,
85938       check: uiFieldCheck,
85939       combo: uiFieldCombo,
85940       cycleway: uiFieldCycleway,
85941       defaultCheck: uiFieldCheck,
85942       email: uiFieldText,
85943       lanes: uiFieldLanes,
85944       localized: uiFieldLocalized,
85945       maxspeed: uiFieldMaxspeed,
85946       multiCombo: uiFieldCombo,
85947       networkCombo: uiFieldCombo,
85948       number: uiFieldText,
85949       onewayCheck: uiFieldCheck,
85950       radio: uiFieldRadio,
85951       restrictions: uiFieldRestrictions,
85952       semiCombo: uiFieldCombo,
85953       structureRadio: uiFieldRadio,
85954       tel: uiFieldText,
85955       text: uiFieldText,
85956       textarea: uiFieldTextarea,
85957       typeCombo: uiFieldCombo,
85958       url: uiFieldText,
85959       wikidata: uiFieldWikidata,
85960       wikipedia: uiFieldWikipedia
85961   };
85962
85963   function uiField(context, presetField, entity, options) {
85964       options = assignIn({
85965           show: true,
85966           wrap: true,
85967           remove: true,
85968           revert: true,
85969           info: true
85970       }, options);
85971
85972       var dispatch$1 = dispatch('change');
85973       var field = clone(presetField);
85974       var _show = options.show;
85975       var _state = '';
85976       var _tags = {};
85977
85978       field.keys = field.keys || [field.key];
85979
85980       // only create the fields that are actually being shown
85981       if (_show && !field.impl) {
85982           createField();
85983       }
85984
85985       // Creates the field.. This is done lazily,
85986       // once we know that the field will be shown.
85987       function createField() {
85988           field.impl = uiFields[field.type](field, context)
85989               .on('change', function(t, onInput) {
85990                   dispatch$1.call('change', field, t, onInput);
85991               });
85992
85993           if (entity) {
85994               field.entityID = entity.id;
85995               // if this field cares about the entity, pass it along
85996               if (field.impl.entity) {
85997                   field.impl.entity(entity);
85998               }
85999           }
86000       }
86001
86002
86003       function isModified() {
86004           if (!entity) return false;
86005           var original = context.graph().base().entities[entity.id];
86006           return some(field.keys, function(key) {
86007               return original ? _tags[key] !== original.tags[key] : _tags[key];
86008           });
86009       }
86010
86011
86012       function isPresent() {
86013           return some(field.keys, function(key) {
86014               if (field.type === 'multiCombo') {
86015                   for (var tagKey in _tags) {
86016                       if (tagKey.indexOf(key) === 0) {
86017                           return true;
86018                       }
86019                   }
86020                   return false;
86021               }
86022               return _tags[key] !== undefined;
86023           });
86024       }
86025
86026
86027       function revert(d) {
86028           event.stopPropagation();
86029           event.preventDefault();
86030           if (!entity) return false;
86031
86032           var original = context.graph().base().entities[entity.id];
86033           var t = {};
86034           d.keys.forEach(function(key) {
86035               t[key] = original ? original.tags[key] : undefined;
86036           });
86037
86038           dispatch$1.call('change', d, t);
86039       }
86040
86041
86042       function remove(d) {
86043           event.stopPropagation();
86044           event.preventDefault();
86045
86046           var t = {};
86047           d.keys.forEach(function(key) {
86048               t[key] = undefined;
86049           });
86050
86051           dispatch$1.call('change', d, t);
86052       }
86053
86054
86055       field.render = function(selection) {
86056           var container = selection.selectAll('.form-field')
86057               .data([field]);
86058
86059           // Enter
86060           var enter = container.enter()
86061               .append('div')
86062               .attr('class', function(d) { return 'form-field form-field-' + d.safeid; })
86063               .classed('nowrap', !options.wrap);
86064
86065           if (options.wrap) {
86066               var label = enter
86067                   .append('label')
86068                   .attr('class', 'form-field-label')
86069                   .attr('for', function(d) { return 'preset-input-' + d.safeid; });
86070
86071               label
86072                   .append('span')
86073                   .attr('class', 'label-text')
86074                   .text(function(d) { return d.label(); });
86075
86076               if (options.remove) {
86077                   label
86078                       .append('button')
86079                       .attr('class', 'remove-icon')
86080                       .attr('title', t('icons.remove'))
86081                       .attr('tabindex', -1)
86082                       .call(svgIcon('#iD-operation-delete'));
86083               }
86084
86085               if (options.revert) {
86086                   label
86087                       .append('button')
86088                       .attr('class', 'modified-icon')
86089                       .attr('title', t('icons.undo'))
86090                       .attr('tabindex', -1)
86091                       .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-redo' : '#iD-icon-undo'));
86092               }
86093           }
86094
86095
86096           // Update
86097           container = container
86098               .merge(enter);
86099
86100           container.select('.form-field-label > .remove-icon')  // propagate bound data
86101               .on('click', remove);
86102
86103           container.select('.form-field-label > .modified-icon')  // propagate bound data
86104               .on('click', revert);
86105
86106           container
86107               .classed('modified', isModified())
86108               .classed('present', isPresent())
86109               .each(function(d) {
86110                   if (!d.impl) {
86111                       createField();
86112                   }
86113
86114                   var reference, help;
86115
86116                   // instantiate field help
86117                   if (options.wrap && field.type === 'restrictions') {
86118                       help = uiFieldHelp(context, 'restrictions');
86119                   }
86120
86121                   // instantiate tag reference
86122                   if (options.wrap && options.info) {
86123                       var referenceKey = d.key;
86124                       if (d.type === 'multiCombo') {   // lookup key without the trailing ':'
86125                           referenceKey = referenceKey.replace(/:$/, '');
86126                       }
86127
86128                       reference = uiTagReference(d.reference || { key: referenceKey }, context);
86129                       if (_state === 'hover') {
86130                           reference.showing(false);
86131                       }
86132                   }
86133
86134                   select(this)
86135                       .call(d.impl);
86136
86137                   // add field help components
86138                   if (help) {
86139                       select(this)
86140                           .call(help.body)
86141                           .select('.form-field-label')
86142                           .call(help.button);
86143                   }
86144
86145                   // add tag reference components
86146                   if (reference) {
86147                       select(this)
86148                           .call(reference.body)
86149                           .select('.form-field-label')
86150                           .call(reference.button);
86151                   }
86152
86153                   d.impl.tags(_tags);
86154               });
86155       };
86156
86157
86158       field.state = function(val) {
86159           if (!arguments.length) return _state;
86160           _state = val;
86161           return field;
86162       };
86163
86164
86165       field.tags = function(val) {
86166           if (!arguments.length) return _tags;
86167           _tags = val;
86168           return field;
86169       };
86170
86171
86172       field.show = function() {
86173           _show = true;
86174           if (!field.impl) {
86175               createField();
86176           }
86177           if (field.default && field.key && _tags[field.key] !== field.default) {
86178               var t = {};
86179               t[field.key] = field.default;
86180               dispatch$1.call('change', this, t);
86181           }
86182       };
86183
86184
86185       // A shown field has a visible UI, a non-shown field is in the 'Add field' dropdown
86186       field.isShown = function() {
86187           return _show || isPresent();
86188       };
86189
86190
86191       // An allowed field can appear in the UI or in the 'Add field' dropdown.
86192       // A non-allowed field is hidden from the user altogether
86193       field.isAllowed = function() {
86194           if (!entity || isPresent()) return true;   // a field with a value should always display
86195
86196           var latest = context.hasEntity(entity.id);   // check the most current copy of the entity
86197           if (!latest) return true;
86198
86199           var require = field.prerequisiteTag;
86200           if (require && require.key) {
86201               var value = latest.tags[require.key];
86202               if (!value) return false;
86203
86204               if (require.valueNot) {
86205                   return require.valueNot !== value;
86206               }
86207               if (require.value) {
86208                   return require.value === value;
86209               }
86210               return true;
86211           }
86212           return true;
86213       };
86214
86215
86216       field.focus = function() {
86217           if (field.impl) {
86218               field.impl.focus();
86219           }
86220       };
86221
86222
86223       return utilRebind(field, dispatch$1, 'on');
86224   }
86225
86226   function uiFormFields(context) {
86227       var moreCombo = uiCombobox(context, 'more-fields').minItems(1);
86228       var _fieldsArr = [];
86229       var _state = '';
86230       var _klass = '';
86231
86232
86233       function formFields(selection) {
86234           var allowedFields = _fieldsArr.filter(function(field) { return field.isAllowed(); });
86235           var shown = allowedFields.filter(function(field) { return field.isShown(); });
86236           var notShown = allowedFields.filter(function(field) { return !field.isShown(); });
86237
86238           var container = selection.selectAll('.form-fields-container')
86239               .data([0]);
86240
86241           container = container.enter()
86242               .append('div')
86243               .attr('class', 'form-fields-container ' + (_klass || ''))
86244               .merge(container);
86245
86246
86247           var fields = container.selectAll('.wrap-form-field')
86248               .data(shown, function(d) { return d.id + (d.entityID || ''); });
86249
86250           fields.exit()
86251               .remove();
86252
86253           // Enter
86254           var enter = fields.enter()
86255               .append('div')
86256               .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.safeid; });
86257
86258           // Update
86259           fields = fields
86260               .merge(enter);
86261
86262           fields
86263               .order()
86264               .each(function(d) {
86265                   select(this)
86266                       .call(d.render);
86267               });
86268
86269
86270           notShown = notShown.map(function(field) {
86271               return {
86272                   title: field.label(),
86273                   value: field.label(),
86274                   field: field
86275               };
86276           });
86277
86278
86279           var more = selection.selectAll('.more-fields')
86280               .data((_state === 'hover' || notShown.length === 0) ? [] : [0]);
86281
86282           more.exit()
86283               .remove();
86284
86285           more = more.enter()
86286               .append('div')
86287               .attr('class', 'more-fields')
86288               .append('label')
86289               .text(t('inspector.add_fields'))
86290               .merge(more);
86291
86292
86293           var input = more.selectAll('.value')
86294               .data([0]);
86295
86296           input.exit()
86297               .remove();
86298
86299           input = input.enter()
86300               .append('input')
86301               .attr('class', 'value')
86302               .attr('type', 'text')
86303               .call(utilNoAuto)
86304               .merge(input);
86305
86306           input
86307               .call(utilGetSetValue, '')
86308               .attr('placeholder', function() {
86309                   var placeholder = [];
86310                   for (var field in notShown) {
86311                       placeholder.push(notShown[field].title);
86312                   }
86313                   return placeholder.slice(0,3).join(', ') + ((placeholder.length > 3) ? '…' : '');
86314               })
86315               .call(moreCombo
86316                   .data(notShown)
86317                   .on('accept', function (d) {
86318                       if (!d) return;  // user entered something that was not matched
86319                       var field = d.field;
86320                       field.show();
86321                       selection.call(formFields);  // rerender
86322                       if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
86323                           field.focus();
86324                       }
86325                   })
86326               );
86327       }
86328
86329
86330       formFields.fieldsArr = function(val) {
86331           if (!arguments.length) return _fieldsArr;
86332           _fieldsArr = val || [];
86333           return formFields;
86334       };
86335
86336       formFields.state = function(val) {
86337           if (!arguments.length) return _state;
86338           _state = val;
86339           return formFields;
86340       };
86341
86342       formFields.klass = function(val) {
86343           if (!arguments.length) return _klass;
86344           _klass = val;
86345           return formFields;
86346       };
86347
86348
86349       return formFields;
86350   }
86351
86352   function uiPresetEditor(context) {
86353       var dispatch$1 = dispatch('change');
86354       var formFields = uiFormFields(context);
86355       var _state;
86356       var _fieldsArr;
86357       var _preset;
86358       var _tags;
86359       var _entityID;
86360
86361
86362       function presetEditor(selection) {
86363           selection.call(uiDisclosure(context, 'preset_fields', true)
86364               .title(t('inspector.all_fields'))
86365               .content(render)
86366           );
86367       }
86368
86369
86370       function render(selection) {
86371           if (!_fieldsArr) {
86372               var entity = context.entity(_entityID);
86373               var geometry = context.geometry(_entityID);
86374               var presets = context.presets();
86375
86376               _fieldsArr = [];
86377
86378               _preset.fields.forEach(function(field) {
86379                   if (field.matchGeometry(geometry)) {
86380                       _fieldsArr.push(
86381                           uiField(context, field, entity)
86382                       );
86383                   }
86384               });
86385
86386               if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
86387                   _fieldsArr.push(
86388                       uiField(context, presets.field('restrictions'), entity)
86389                   );
86390               }
86391
86392               var additionalFields = union(_preset.moreFields, presets.universal());
86393               additionalFields.sort(function(field1, field2) {
86394                   return field1.label() > field2.label();
86395               });
86396
86397               additionalFields.forEach(function(field) {
86398                   if (_preset.fields.indexOf(field) === -1) {
86399                       _fieldsArr.push(
86400                           uiField(context, field, entity, { show: false })
86401                       );
86402                   }
86403               });
86404
86405               _fieldsArr.forEach(function(field) {
86406                   field
86407                       .on('change', function(t, onInput) {
86408                           dispatch$1.call('change', field, t, onInput);
86409                       });
86410               });
86411           }
86412
86413           _fieldsArr.forEach(function(field) {
86414               field
86415                   .state(_state)
86416                   .tags(_tags);
86417           });
86418
86419
86420           selection
86421               .call(formFields
86422                   .fieldsArr(_fieldsArr)
86423                   .state(_state)
86424                   .klass('inspector-inner fillL3')
86425               );
86426
86427
86428           selection.selectAll('.wrap-form-field input')
86429               .on('keydown', function() {
86430                   // if user presses enter, and combobox is not active, accept edits..
86431                   if (event.keyCode === 13 && select('.combobox').empty()) {
86432                       context.enter(modeBrowse(context));
86433                   }
86434               });
86435       }
86436
86437
86438       presetEditor.preset = function(val) {
86439           if (!arguments.length) return _preset;
86440           if (_preset && _preset.id === val.id) return presetEditor;
86441           _preset = val;
86442           _fieldsArr = null;
86443           return presetEditor;
86444       };
86445
86446
86447       presetEditor.state = function(val) {
86448           if (!arguments.length) return _state;
86449           _state = val;
86450           return presetEditor;
86451       };
86452
86453
86454       presetEditor.tags = function(val) {
86455           if (!arguments.length) return _tags;
86456           _tags = val;
86457           // Don't reset _fieldsArr here.
86458           return presetEditor;
86459       };
86460
86461
86462       presetEditor.entityID = function(val) {
86463           if (!arguments.length) return _entityID;
86464           if (_entityID === val) return presetEditor;
86465           _entityID = val;
86466           _fieldsArr = null;
86467           return presetEditor;
86468       };
86469
86470
86471       return utilRebind(presetEditor, dispatch$1, 'on');
86472   }
86473
86474   function uiEntityIssues(context) {
86475       var _selection = select(null);
86476       var _expandedIssueID;
86477       var _entityID;
86478
86479       // Listen for validation reload even though the entity editor is reloaded on
86480       // every graph change since the graph change event may happen before the issue
86481       // cache is refreshed
86482       context.validator().on('reload.entity_issues', function() {
86483
86484            _selection.selectAll('.disclosure-wrap-entity_issues')
86485                .call(render);
86486
86487           update();
86488       });
86489
86490
86491       function entityIssues(selection) {
86492           _selection = selection;
86493
86494           selection
86495               .call(uiDisclosure(context, 'entity_issues', true)
86496                   .content(render)
86497               );
86498
86499           update();
86500       }
86501
86502
86503       function update() {
86504           var issues = context.validator().getIssuesForEntityWithID(_entityID);
86505
86506           _selection
86507               .classed('hide', issues.length === 0);
86508
86509           _selection.selectAll('.hide-toggle-entity_issues span')
86510               .text(t('issues.list_title', { count: issues.length }));
86511       }
86512
86513
86514       function render(selection) {
86515           var issues = context.validator().getIssuesForEntityWithID(_entityID);
86516           _expandedIssueID = issues.length > 0 ? issues[0].id() : null;
86517
86518           var items = selection.selectAll('.issue')
86519               .data(issues, function(d) { return d.id(); });
86520
86521           // Exit
86522           items.exit()
86523               .remove();
86524
86525           // Enter
86526           var itemsEnter = items.enter()
86527               .append('div')
86528               .attr('class', function(d) { return 'issue severity-' + d.severity; })
86529               .call(tooltip()
86530                   .html(true)
86531                   .title(function(d) { return uiTooltipHtml(d.tooltip); })
86532                   .placement('top')
86533               )
86534               .on('mouseover.highlight', function(d) {
86535                   // don't hover-highlight the selected entity
86536                   var ids = d.entities.filter(function(e) { return e.id !== _entityID; })
86537                       .map(function(e) { return e.id; });
86538                   utilHighlightEntities(ids, true, context);
86539               })
86540               .on('mouseout.highlight', function(d) {
86541                   var ids = d.entities.filter(function(e) { return e.id !== _entityID; })
86542                       .map(function(e) { return e.id; });
86543                   utilHighlightEntities(ids, false, context);
86544               });
86545
86546           var messagesEnter = itemsEnter
86547               .append('button')
86548               .attr('class', 'message')
86549               .on('click', function(d) {
86550
86551                   _expandedIssueID = d.id();   // expand only the clicked item
86552                   selection.selectAll('.issue')
86553                       .classed('expanded', function(d) { return d.id() === _expandedIssueID; });
86554
86555                   var extent = d.extent(context.graph());
86556                   if (extent) {
86557                       var view = context.map().trimmedExtent();
86558                       var zoom = context.map().zoom();
86559                       if (!view.contains(extent) || zoom < 19) {
86560                           context.map().centerZoomEase(extent.center(), Math.max(zoom, 19));
86561                       }
86562                   }
86563               });
86564
86565           messagesEnter
86566               .append('span')
86567               .attr('class', 'issue-icon')
86568               .call(svgIcon('', 'pre-text'));
86569
86570           messagesEnter
86571               .append('strong')
86572               .attr('class', 'issue-text');
86573
86574           itemsEnter
86575               .append('ul')
86576               .attr('class', 'issue-fix-list');
86577
86578
86579           // Update
86580           items = items
86581               .merge(itemsEnter)
86582               .classed('expanded', function(d) { return d.id() === _expandedIssueID; });
86583
86584           items.select('.issue-icon svg use')     // propagate bound data
86585               .attr('href', function(d) {
86586                   return '#iD-icon-' + (d.severity === 'warning' ? 'alert' : 'error');
86587               });
86588
86589           items.select('.issue-text')     // propagate bound data
86590               .text(function(d) { return d.message; });
86591
86592
86593           // fixes
86594           var fixLists = items.selectAll('.issue-fix-list');
86595
86596           var fixes = fixLists.selectAll('.issue-fix-item')
86597               .data(function(d) { return d.fixes; })
86598               .enter()
86599               .append('li')
86600               .attr('class', function(d) {
86601                   return 'issue-fix-item ' + (d.onClick ? 'actionable' : '');
86602               })
86603               .append('button')
86604               .on('click', function(d) {
86605                   if (d.onClick) {
86606                       utilHighlightEntities(d.entityIds, false, context);
86607                       d.onClick();
86608                   }
86609               })
86610               .on('mouseover.highlight', function(d) {
86611                   utilHighlightEntities(d.entityIds, true, context);
86612               })
86613               .on('mouseout.highlight', function(d) {
86614                   utilHighlightEntities(d.entityIds, false, context);
86615               });
86616
86617           fixes.append('span')
86618               .attr('class', 'fix-icon')
86619               .each(function(d) {
86620                   var iconName = d.icon || 'iD-icon-wrench';
86621                   if (iconName.startsWith('maki')) {
86622                       iconName += '-15';
86623                   }
86624                   select(this).call(svgIcon('#' + iconName, 'pre-text'));
86625               });
86626
86627           fixes.append('span')
86628               .text(function(d) { return d.title; });
86629       }
86630
86631
86632       entityIssues.entityID = function(val) {
86633           if (!arguments.length) return _entityID;
86634           if (_entityID !== val) {
86635               _entityID = val;
86636               _expandedIssueID = null;
86637           }
86638           return entityIssues;
86639       };
86640
86641
86642       return entityIssues;
86643   }
86644
86645   function uiEntityEditor(context) {
86646       var dispatch$1 = dispatch('choose');
86647       var _state = 'select';
86648       var _coalesceChanges = false;
86649       var _modified = false;
86650       var _base;
86651       var _entityID;
86652       var _activePreset;
86653       var _tagReference;
86654
86655       var entityIssues = uiEntityIssues(context);
86656       var quickLinks = uiQuickLinks();
86657       var presetEditor = uiPresetEditor(context).on('change', changeTags);
86658       var rawTagEditor = uiRawTagEditor(context).on('change', changeTags);
86659       var rawMemberEditor = uiRawMemberEditor(context);
86660       var rawMembershipEditor = uiRawMembershipEditor(context);
86661
86662       function entityEditor(selection) {
86663           var entity = context.entity(_entityID);
86664           var tags = clone(entity.tags);
86665
86666           // Header
86667           var header = selection.selectAll('.header')
86668               .data([0]);
86669
86670           // Enter
86671           var headerEnter = header.enter()
86672               .append('div')
86673               .attr('class', 'header fillL cf');
86674
86675           headerEnter
86676               .append('button')
86677               .attr('class', 'fl preset-reset preset-choose')
86678               .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-forward' : '#iD-icon-backward'));
86679
86680           headerEnter
86681               .append('button')
86682               .attr('class', 'fr preset-close')
86683               .on('click', function() { context.enter(modeBrowse(context)); })
86684               .call(svgIcon(_modified ? '#iD-icon-apply' : '#iD-icon-close'));
86685
86686           headerEnter
86687               .append('h3')
86688               .text(t('inspector.edit'));
86689
86690           // Update
86691           header = header
86692               .merge(headerEnter);
86693
86694           header.selectAll('.preset-reset')
86695               .on('click', function() {
86696                   dispatch$1.call('choose', this, _activePreset);
86697               });
86698
86699
86700           // Body
86701           var body = selection.selectAll('.inspector-body')
86702               .data([0]);
86703
86704           // Enter
86705           var bodyEnter = body.enter()
86706               .append('div')
86707               .attr('class', 'inspector-body');
86708
86709           bodyEnter
86710               .append('div')
86711               .attr('class', 'preset-list-item inspector-inner')
86712               .append('div')
86713               .attr('class', 'preset-list-button-wrap')
86714               .append('button')
86715               .attr('class', 'preset-list-button preset-reset')
86716               .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
86717               .append('div')
86718               .attr('class', 'label')
86719               .append('div')
86720               .attr('class', 'label-inner');
86721
86722           bodyEnter
86723               .append('div')
86724               .attr('class', 'preset-quick-links');
86725
86726           bodyEnter
86727               .append('div')
86728               .attr('class', 'entity-issues');
86729
86730           bodyEnter
86731               .append('div')
86732               .attr('class', 'preset-editor');
86733
86734           bodyEnter
86735               .append('div')
86736               .attr('class', 'raw-tag-editor inspector-inner');
86737
86738           bodyEnter
86739               .append('div')
86740               .attr('class', 'raw-member-editor inspector-inner');
86741
86742           bodyEnter
86743               .append('div')
86744               .attr('class', 'raw-membership-editor inspector-inner');
86745
86746           bodyEnter
86747               .append('input')
86748               .attr('type', 'text')
86749               .attr('class', 'key-trap');
86750
86751
86752           // Update
86753           body = body
86754               .merge(bodyEnter);
86755
86756           // update header
86757           if (_tagReference) {
86758               body.selectAll('.preset-list-button-wrap')
86759                   .call(_tagReference.button);
86760
86761               body.selectAll('.preset-list-item')
86762                   .call(_tagReference.body);
86763           }
86764
86765           body.selectAll('.preset-reset')
86766               .on('click', function() {
86767                   dispatch$1.call('choose', this, _activePreset);
86768               });
86769
86770           body.select('.preset-list-item button')
86771               .call(uiPresetIcon()
86772                   .geometry(context.geometry(_entityID))
86773                   .preset(_activePreset)
86774               );
86775
86776           // NOTE: split on en-dash, not a hypen (to avoid conflict with hyphenated names)
86777           var label = body.select('.label-inner');
86778           var nameparts = label.selectAll('.namepart')
86779               .data(_activePreset.name().split(' – '), function(d) { return d; });
86780
86781           nameparts.exit()
86782               .remove();
86783
86784           nameparts
86785               .enter()
86786               .append('div')
86787               .attr('class', 'namepart')
86788               .text(function(d) { return d; });
86789
86790           // update quick links
86791           var choices = [{
86792               id: 'zoom_to',
86793               label: 'inspector.zoom_to.title',
86794               tooltip: function() {
86795                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_feature'), t('inspector.zoom_to.key'));
86796               },
86797               click: function zoomTo() {
86798                   context.mode().zoomToSelected();
86799               }
86800           }];
86801
86802           body.select('.preset-quick-links')
86803               .call(quickLinks.choices(choices));
86804
86805
86806           // update editor sections
86807           body.select('.entity-issues')
86808               .call(entityIssues
86809                   .entityID(_entityID)
86810               );
86811
86812           body.select('.preset-editor')
86813               .call(presetEditor
86814                   .preset(_activePreset)
86815                   .entityID(_entityID)
86816                   .tags(tags)
86817                   .state(_state)
86818               );
86819
86820           body.select('.raw-tag-editor')
86821               .call(rawTagEditor
86822                   .preset(_activePreset)
86823                   .entityID(_entityID)
86824                   .tags(tags)
86825                   .state(_state)
86826               );
86827
86828           if (entity.type === 'relation') {
86829               body.select('.raw-member-editor')
86830                   .style('display', 'block')
86831                   .call(rawMemberEditor
86832                       .entityID(_entityID)
86833                   );
86834           } else {
86835               body.select('.raw-member-editor')
86836                   .style('display', 'none');
86837           }
86838
86839           body.select('.raw-membership-editor')
86840               .call(rawMembershipEditor
86841                   .entityID(_entityID)
86842               );
86843
86844           body.select('.key-trap')
86845               .on('keydown.key-trap', function() {
86846                   // On tabbing, send focus back to the first field on the inspector-body
86847                   // (probably the `name` field) #4159
86848                   if (event.keyCode === 9 && !event.shiftKey) {
86849                       event.preventDefault();
86850                       body.select('input').node().focus();
86851                   }
86852               });
86853
86854           context.history()
86855               .on('change.entity-editor', historyChanged);
86856
86857
86858           function historyChanged() {
86859               if (_state === 'hide') return;
86860
86861               var entity = context.hasEntity(_entityID);
86862               var graph = context.graph();
86863               if (!entity) return;
86864
86865               var match = context.presets().match(entity, graph);
86866               var activePreset = entityEditor.preset();
86867               var weakPreset = activePreset && isEmpty(activePreset.addTags);
86868
86869               // A "weak" preset doesn't set any tags. (e.g. "Address")
86870               // Don't replace a weak preset with a fallback preset (e.g. "Point")
86871               if (!(weakPreset && match.isFallback())) {
86872                   entityEditor.preset(match);
86873               }
86874               entityEditor.modified(_base !== graph);
86875               entityEditor(selection);
86876           }
86877       }
86878
86879
86880       // Tag changes that fire on input can all get coalesced into a single
86881       // history operation when the user leaves the field.  #2342
86882       function changeTags(changed, onInput) {
86883           var entity = context.entity(_entityID);
86884           var annotation = t('operations.change_tags.annotation');
86885           var tags = clone(entity.tags);
86886
86887           for (var k in changed) {
86888               if (!k) continue;
86889               var v = changed[k];
86890               if (v !== undefined || tags.hasOwnProperty(k)) {
86891                   tags[k] = v;
86892               }
86893           }
86894
86895           if (!onInput) {
86896               tags = utilCleanTags(tags);
86897           }
86898
86899           if (!isEqual(entity.tags, tags)) {
86900               if (_coalesceChanges) {
86901                   context.overwrite(actionChangeTags(_entityID, tags), annotation);
86902               } else {
86903                   context.perform(actionChangeTags(_entityID, tags), annotation);
86904                   _coalesceChanges = !!onInput;
86905               }
86906           }
86907       }
86908
86909
86910       entityEditor.modified = function(val) {
86911           if (!arguments.length) return _modified;
86912           _modified = val;
86913           d3_selectAll('button.preset-close use')
86914               .attr('xlink:href', (_modified ? '#iD-icon-apply' : '#iD-icon-close'));
86915           return entityEditor;
86916       };
86917
86918
86919       entityEditor.state = function(val) {
86920           if (!arguments.length) return _state;
86921           _state = val;
86922           return entityEditor;
86923       };
86924
86925
86926       entityEditor.entityID = function(val) {
86927           if (!arguments.length) return _entityID;
86928           _entityID = val;
86929           _base = context.graph();
86930           _coalesceChanges = false;
86931
86932           // reset the scroll to the top of the inspector
86933           var body = d3_selectAll('.entity-editor-pane .inspector-body');
86934           if (!body.empty()) {
86935               body.node().scrollTop = 0;
86936           }
86937
86938           var presetMatch = context.presets().match(context.entity(_entityID), _base);
86939
86940           return entityEditor
86941               .preset(presetMatch)
86942               .modified(false);
86943       };
86944
86945
86946       entityEditor.preset = function(val) {
86947           if (!arguments.length) return _activePreset;
86948           if (val !== _activePreset) {
86949               _activePreset = val;
86950               _tagReference = uiTagReference(_activePreset.reference(context.geometry(_entityID)), context)
86951                   .showing(false);
86952           }
86953           return entityEditor;
86954       };
86955
86956
86957       return utilRebind(entityEditor, dispatch$1, 'on');
86958   }
86959
86960   var pair_1 = pair$1;
86961
86962   function search(x, dims, r) {
86963     if (!dims) dims = 'NSEW';
86964     if (typeof x !== 'string') return { val: null, regex: r };
86965
86966     r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
86967
86968     var m = r.exec(x);
86969     if (!m) return { val: null, regex: r };
86970
86971     var dim = m[1] || m[5];
86972     if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
86973
86974     return {
86975       val: (((m[2]) ? parseFloat(m[2]) : 0) +
86976             ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
86977             ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
86978             ((dim === 'S' || dim === 'W') ? -1 : 1),
86979       regex: r,
86980       raw: m[0],
86981       dim: dim
86982     };
86983   }
86984
86985   function pair$1(x, dims) {
86986     x = x.trim();
86987     var one = search(x, dims);
86988     if (one.val === null) return null;
86989     var two = search(x, dims, one.regex);
86990     if (two.val === null) return null;
86991     // null if one/two are not contiguous.
86992     if (one.raw + two.raw !== x) return null;
86993     if (one.dim) {
86994       return swapdim(one.val, two.val, one.dim);
86995     } else {
86996       return [one.val, two.val];
86997     }
86998   }
86999
87000   function swapdim(a, b, dim) {
87001     if (dim === 'N' || dim === 'S') return [a, b];
87002     if (dim === 'W' || dim === 'E') return [b, a];
87003   }
87004
87005   function uiFeatureList(context) {
87006       var _geocodeResults;
87007
87008
87009       function featureList(selection) {
87010           var header = selection
87011               .append('div')
87012               .attr('class', 'header fillL cf');
87013
87014           header
87015               .append('h3')
87016               .text(t('inspector.feature_list'));
87017
87018           var searchWrap = selection
87019               .append('div')
87020               .attr('class', 'search-header');
87021
87022           var search = searchWrap
87023               .append('input')
87024               .attr('placeholder', t('inspector.search'))
87025               .attr('type', 'search')
87026               .call(utilNoAuto)
87027               .on('keypress', keypress)
87028               .on('keydown', keydown)
87029               .on('input', inputevent);
87030
87031           searchWrap
87032               .call(svgIcon('#iD-icon-search', 'pre-text'));
87033
87034           var listWrap = selection
87035               .append('div')
87036               .attr('class', 'inspector-body');
87037
87038           var list = listWrap
87039               .append('div')
87040               .attr('class', 'feature-list cf');
87041
87042           context
87043               .on('exit.feature-list', clearSearch);
87044           context.map()
87045               .on('drawn.feature-list', mapDrawn);
87046
87047           context.keybinding()
87048               .on(uiCmd('⌘F'), focusSearch);
87049
87050
87051           function focusSearch() {
87052               var mode = context.mode() && context.mode().id;
87053               if (mode !== 'browse') return;
87054
87055               event.preventDefault();
87056               search.node().focus();
87057           }
87058
87059
87060           function keydown() {
87061               if (event.keyCode === 27) {  // escape
87062                   search.node().blur();
87063               }
87064           }
87065
87066
87067           function keypress() {
87068               var q = search.property('value'),
87069                   items = list.selectAll('.feature-list-item');
87070               if (event.keyCode === 13 && q.length && items.size()) {  // return
87071                   click(items.datum());
87072               }
87073           }
87074
87075
87076           function inputevent() {
87077               _geocodeResults = undefined;
87078               drawList();
87079           }
87080
87081
87082           function clearSearch() {
87083               search.property('value', '');
87084               drawList();
87085           }
87086
87087
87088           function mapDrawn(e) {
87089               if (e.full) {
87090                   drawList();
87091               }
87092           }
87093
87094
87095           function features() {
87096               var entities = {};
87097               var result = [];
87098               var graph = context.graph();
87099               var q = search.property('value').toLowerCase();
87100
87101               if (!q) return result;
87102
87103               var idMatch = q.match(/^([nwr])([0-9]+)$/);
87104
87105               if (idMatch) {
87106                   result.push({
87107                       id: idMatch[0],
87108                       geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
87109                       type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
87110                       name: idMatch[2]
87111                   });
87112               }
87113
87114               var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
87115
87116               if (locationMatch) {
87117                   var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
87118                   result.push({
87119                       id: -1,
87120                       geometry: 'point',
87121                       type: t('inspector.location'),
87122                       name: dmsCoordinatePair([loc[1], loc[0]]),
87123                       location: loc
87124                   });
87125               }
87126
87127               function addEntity(entity) {
87128                   if (entity.id in entities || result.length > 200)
87129                       return;
87130
87131                   entities[entity.id] = true;
87132
87133                   var name = utilDisplayName(entity) || '';
87134                   if (name.toLowerCase().indexOf(q) >= 0) {
87135                       var matched = context.presets().match(entity, graph);
87136                       var type = (matched && matched.name()) || utilDisplayType(entity.id);
87137
87138                       result.push({
87139                           id: entity.id,
87140                           entity: entity,
87141                           geometry: context.geometry(entity.id),
87142                           type: type,
87143                           name: name
87144                       });
87145                   }
87146
87147                   graph.parentRelations(entity).forEach(function(parent) {
87148                       addEntity(parent);
87149                   });
87150               }
87151
87152               var visible = context.surface().selectAll('.point, .line, .area').nodes();
87153               for (var i = 0; i < visible.length && result.length <= 200; i++) {
87154                   var datum = visible[i].__data__;
87155                   var entity = datum && datum.properties && datum.properties.entity;
87156                   if (entity) { addEntity(entity); }
87157               }
87158
87159               (_geocodeResults || []).forEach(function(d) {
87160                   if (d.osm_type && d.osm_id) {    // some results may be missing these - #1890
87161
87162                       // Make a temporary osmEntity so we can preset match
87163                       // and better localize the search result - #4725
87164                       var id = osmEntity.id.fromOSM(d.osm_type, d.osm_id);
87165                       var tags = {};
87166                       tags[d.class] = d.type;
87167
87168                       var attrs = { id: id, type: d.osm_type, tags: tags };
87169                       if (d.osm_type === 'way') {   // for ways, add some fake closed nodes
87170                           attrs.nodes = ['a','a'];  // so that geometry area is possible
87171                       }
87172
87173                       var tempEntity = osmEntity(attrs);
87174                       var tempGraph = coreGraph([tempEntity]);
87175                       var matched = context.presets().match(tempEntity, tempGraph);
87176                       var type = (matched && matched.name()) || utilDisplayType(id);
87177
87178                       result.push({
87179                           id: tempEntity.id,
87180                           geometry: tempEntity.geometry(tempGraph),
87181                           type: type,
87182                           name: d.display_name,
87183                           extent: new geoExtent(
87184                               [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
87185                               [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
87186                       });
87187                   }
87188               });
87189
87190               return result;
87191           }
87192
87193
87194           function drawList() {
87195               var value = search.property('value');
87196               var results = features();
87197
87198               list.classed('filtered', value.length);
87199
87200               var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
87201
87202               var resultsIndicator = list.selectAll('.no-results-item')
87203                   .data([0])
87204                   .enter()
87205                   .append('button')
87206                   .property('disabled', true)
87207                   .attr('class', 'no-results-item')
87208                   .call(svgIcon('#iD-icon-alert', 'pre-text'));
87209
87210               resultsIndicator.append('span')
87211                   .attr('class', 'entity-name');
87212
87213               list.selectAll('.no-results-item .entity-name')
87214                   .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
87215
87216               if (services.geocoder) {
87217                 list.selectAll('.geocode-item')
87218                     .data([0])
87219                     .enter()
87220                     .append('button')
87221                     .attr('class', 'geocode-item')
87222                     .on('click', geocoderSearch)
87223                     .append('div')
87224                     .attr('class', 'label')
87225                     .append('span')
87226                     .attr('class', 'entity-name')
87227                     .text(t('geocoder.search'));
87228               }
87229
87230               list.selectAll('.no-results-item')
87231                   .style('display', (value.length && !results.length) ? 'block' : 'none');
87232
87233               list.selectAll('.geocode-item')
87234                   .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
87235
87236               list.selectAll('.feature-list-item')
87237                   .data([-1])
87238                   .remove();
87239
87240               var items = list.selectAll('.feature-list-item')
87241                   .data(results, function(d) { return d.id; });
87242
87243               var enter = items.enter()
87244                   .insert('button', '.geocode-item')
87245                   .attr('class', 'feature-list-item')
87246                   .on('mouseover', mouseover)
87247                   .on('mouseout', mouseout)
87248                   .on('click', click);
87249
87250               var label = enter
87251                   .append('div')
87252                   .attr('class', 'label');
87253
87254               label
87255                   .each(function(d) {
87256                       select(this)
87257                           .call(svgIcon('#iD-icon-' + d.geometry, 'pre-text'));
87258                   });
87259
87260               label
87261                   .append('span')
87262                   .attr('class', 'entity-type')
87263                   .text(function(d) { return d.type; });
87264
87265               label
87266                   .append('span')
87267                   .attr('class', 'entity-name')
87268                   .text(function(d) { return d.name; });
87269
87270               enter
87271                   .style('opacity', 0)
87272                   .transition()
87273                   .style('opacity', 1);
87274
87275               items.order();
87276
87277               items.exit()
87278                   .remove();
87279           }
87280
87281
87282           function mouseover(d) {
87283               if (d.id === -1) return;
87284
87285               context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
87286                   .classed('hover', true);
87287           }
87288
87289
87290           function mouseout() {
87291               context.surface().selectAll('.hover')
87292                   .classed('hover', false);
87293           }
87294
87295
87296           function click(d) {
87297               event.preventDefault();
87298               if (d.location) {
87299                   context.map().centerZoomEase([d.location[1], d.location[0]], 19);
87300               }
87301               else if (d.entity) {
87302                   if (d.entity.type === 'node') {
87303                       context.map().center(d.entity.loc);
87304                   } else if (d.entity.type === 'way') {
87305                       var center = context.projection(context.map().center());
87306                       var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
87307                       context.map().center(edge.loc);
87308                   }
87309                   context.enter(modeSelect(context, [d.entity.id]));
87310               } else {
87311                   context.zoomToEntity(d.id);
87312               }
87313           }
87314
87315
87316           function geocoderSearch() {
87317               services.geocoder.search(search.property('value'), function (err, resp) {
87318                   _geocodeResults = resp || [];
87319                   drawList();
87320               });
87321           }
87322       }
87323
87324
87325       return featureList;
87326   }
87327
87328   var _flashTimer;
87329
87330
87331   function uiFlash() {
87332       var _duration = 2000;
87333       var _iconName = '#iD-icon-no';
87334       var _iconClass = 'disabled';
87335       var _text = '';
87336       var _textClass;
87337
87338
87339       function flash() {
87340           if (_flashTimer) {
87341               _flashTimer.stop();
87342           }
87343
87344           select('#footer-wrap')
87345               .attr('class', 'footer-hide');
87346           select('#flash-wrap')
87347               .attr('class', 'footer-show');
87348
87349           var content = select('#flash-wrap').selectAll('.flash-content')
87350               .data([0]);
87351
87352           // Enter
87353           var contentEnter = content.enter()
87354               .append('div')
87355               .attr('class', 'flash-content');
87356
87357           var iconEnter = contentEnter
87358               .append('svg')
87359               .attr('class', 'flash-icon')
87360               .append('g')
87361               .attr('transform', 'translate(10,10)');
87362
87363           iconEnter
87364               .append('circle')
87365               .attr('r', 9);
87366
87367           iconEnter
87368               .append('use')
87369               .attr('transform', 'translate(-7,-7)')
87370               .attr('width', '14')
87371               .attr('height', '14');
87372
87373           contentEnter
87374               .append('div')
87375               .attr('class', 'flash-text');
87376
87377
87378           // Update
87379           content = content
87380               .merge(contentEnter);
87381
87382           content
87383               .selectAll('.flash-icon')
87384               .attr('class', 'flash-icon ' + (_iconClass || ''));
87385
87386           content
87387               .selectAll('.flash-icon use')
87388               .attr('xlink:href', _iconName);
87389
87390           content
87391               .selectAll('.flash-text')
87392               .attr('class', 'flash-text ' + (_textClass || ''))
87393               .text(_text);
87394
87395
87396           _flashTimer = timeout$1(function() {
87397               _flashTimer = null;
87398               select('#footer-wrap')
87399                   .attr('class', 'footer-show');
87400               select('#flash-wrap')
87401                   .attr('class', 'footer-hide');
87402           }, _duration);
87403
87404           return content;
87405       }
87406
87407
87408       flash.duration = function(_) {
87409           if (!arguments.length) return _duration;
87410           _duration = _;
87411           return flash;
87412       };
87413
87414       flash.text = function(_) {
87415           if (!arguments.length) return _text;
87416           _text = _;
87417           return flash;
87418       };
87419
87420       flash.textClass = function(_) {
87421           if (!arguments.length) return _textClass;
87422           _textClass = _;
87423           return flash;
87424       };
87425
87426       flash.iconName = function(_) {
87427           if (!arguments.length) return _iconName;
87428           _iconName = _;
87429           return flash;
87430       };
87431
87432       flash.iconClass = function(_) {
87433           if (!arguments.length) return _iconClass;
87434           _iconClass = _;
87435           return flash;
87436       };
87437
87438       return flash;
87439   }
87440
87441   function uiImproveOsmComments() {
87442       var _error;
87443
87444
87445       function errorComments(selection) {
87446           // make the div immediately so it appears above the buttons
87447           var comments = selection.selectAll('.comments-container')
87448               .data([0]);
87449
87450           comments = comments.enter()
87451               .append('div')
87452               .attr('class', 'comments-container')
87453               .merge(comments);
87454
87455           // must retrieve comments from API before they can be displayed
87456           services.improveOSM.getComments(_error, function(err, d) {
87457               if (!d.comments) { return; } // nothing to do here
87458
87459               var commentEnter = comments.selectAll('.comment')
87460                   .data(d.comments)
87461                   .enter()
87462                   .append('div')
87463                   .attr('class', 'comment');
87464
87465               commentEnter
87466                   .append('div')
87467                   .attr('class', 'comment-avatar')
87468                   .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
87469
87470               var mainEnter = commentEnter
87471                   .append('div')
87472                   .attr('class', 'comment-main');
87473
87474               var metadataEnter = mainEnter
87475                   .append('div')
87476                   .attr('class', 'comment-metadata');
87477
87478               metadataEnter
87479                   .append('div')
87480                   .attr('class', 'comment-author')
87481                   .each(function(d) {
87482                       var selection = select(this);
87483                       var osm = services.osm;
87484                       if (osm && d.username) {
87485                           selection = selection
87486                               .append('a')
87487                               .attr('class', 'comment-author-link')
87488                               .attr('href', osm.userURL(d.username))
87489                               .attr('tabindex', -1)
87490                               .attr('target', '_blank');
87491                       }
87492                       selection
87493                           .text(function(d) { return d.username; });
87494                   });
87495
87496               metadataEnter
87497                   .append('div')
87498                   .attr('class', 'comment-date')
87499                   .text(function(d) {
87500                       return t('note.status.commented', { when: localeDateString(d.timestamp) });
87501                   });
87502
87503               mainEnter
87504                   .append('div')
87505                   .attr('class', 'comment-text')
87506                   .append('p')
87507                   .text(function(d) { return d.text; });
87508           });
87509       }
87510
87511       function localeDateString(s) {
87512           if (!s) return null;
87513           var detected = utilDetect();
87514           var options = { day: 'numeric', month: 'short', year: 'numeric' };
87515           var d = new Date(s * 1000); // timestamp is served in seconds, date takes ms
87516           if (isNaN(d.getTime())) return null;
87517           return d.toLocaleDateString(detected.locale, options);
87518       }
87519
87520       errorComments.error = function(val) {
87521           if (!arguments.length) return _error;
87522           _error = val;
87523           return errorComments;
87524       };
87525
87526       return errorComments;
87527   }
87528
87529   function uiImproveOsmDetails(context) {
87530       var _error;
87531
87532
87533       function errorDetail(d) {
87534           var unknown = t('inspector.unknown');
87535
87536           if (!d) return unknown;
87537
87538           if (d.desc) return d.desc;
87539
87540           var errorType = d.error_key;
87541           var et = en.QA.improveOSM.error_types[errorType];
87542
87543           var detail;
87544           if (et && et.description) {
87545               detail = t('QA.improveOSM.error_types.' + errorType + '.description', d.replacements);
87546           } else {
87547               detail = unknown;
87548           }
87549
87550           return detail;
87551       }
87552
87553
87554       function improveOsmDetails(selection) {
87555           var details = selection.selectAll('.error-details')
87556               .data(
87557                   (_error ? [_error] : []),
87558                   function(d) { return d.id + '-' + (d.status || 0); }
87559               );
87560
87561           details.exit()
87562               .remove();
87563
87564           var detailsEnter = details.enter()
87565               .append('div')
87566               .attr('class', 'error-details error-details-container');
87567
87568
87569           // description
87570           var descriptionEnter = detailsEnter
87571               .append('div')
87572               .attr('class', 'error-details-description');
87573
87574           descriptionEnter
87575               .append('h4')
87576               .text(function() { return t('QA.keepRight.detail_description'); });
87577
87578           descriptionEnter
87579               .append('div')
87580               .attr('class', 'error-details-description-text')
87581               .html(errorDetail);
87582
87583           // If there are entity links in the error message..
87584           var relatedEntities = [];
87585           descriptionEnter.selectAll('.error_entity_link, .error_object_link')
87586               .each(function() {
87587                   var link = select(this);
87588                   var isObjectLink = link.classed('error_object_link');
87589                   var entityID = isObjectLink ?
87590                       (utilEntityRoot(_error.object_type) + _error.object_id)
87591                       : this.textContent;
87592                   var entity = context.hasEntity(entityID);
87593
87594                   relatedEntities.push(entityID);
87595
87596                   // Add click handler
87597                   link
87598                       .on('mouseover', function() {
87599                           context.surface().selectAll(utilEntityOrMemberSelector([entityID], context.graph()))
87600                               .classed('hover', true);
87601                       })
87602                       .on('mouseout', function() {
87603                           context.surface().selectAll('.hover')
87604                               .classed('hover', false);
87605                       })
87606                       .on('click', function() {
87607                           event.preventDefault();
87608                           var osmlayer = context.layers().layer('osm');
87609                           if (!osmlayer.enabled()) {
87610                               osmlayer.enabled(true);
87611                           }
87612
87613                           context.map().centerZoom(_error.loc, 20);
87614
87615                           if (entity) {
87616                               context.enter(modeSelect(context, [entityID]));
87617                           } else {
87618                               context.loadEntity(entityID, function() {
87619                                   context.enter(modeSelect(context, [entityID]));
87620                               });
87621                           }
87622                       });
87623
87624                   // Replace with friendly name if possible
87625                   // (The entity may not yet be loaded into the graph)
87626                   if (entity) {
87627                       var name = utilDisplayName(entity);  // try to use common name
87628
87629                       if (!name && !isObjectLink) {
87630                           var preset = context.presets().match(entity, context.graph());
87631                           name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
87632                       }
87633
87634                       if (name) {
87635                           this.innerText = name;
87636                       }
87637                   }
87638               });
87639
87640           // Don't hide entities related to this error - #5880
87641           context.features().forceVisible(relatedEntities);
87642       }
87643
87644
87645       improveOsmDetails.error = function(val) {
87646           if (!arguments.length) return _error;
87647           _error = val;
87648           return improveOsmDetails;
87649       };
87650
87651
87652       return improveOsmDetails;
87653   }
87654
87655   function uiImproveOsmEditor(context) {
87656       var dispatch$1 = dispatch('change');
87657       var errorDetails = uiImproveOsmDetails(context);
87658       var errorComments = uiImproveOsmComments(context);
87659       var errorHeader = uiImproveOsmHeader(context);
87660       var quickLinks = uiQuickLinks();
87661
87662       var _error;
87663
87664
87665       function improveOsmEditor(selection) {
87666           // quick links
87667           var choices = [{
87668               id: 'zoom_to',
87669               label: 'inspector.zoom_to.title',
87670               tooltip: function() {
87671                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_issue'), t('inspector.zoom_to.key'));
87672               },
87673               click: function zoomTo() {
87674                   context.mode().zoomToSelected();
87675               }
87676           }];
87677
87678
87679           var header = selection.selectAll('.header')
87680               .data([0]);
87681
87682           var headerEnter = header.enter()
87683               .append('div')
87684               .attr('class', 'header fillL');
87685
87686           headerEnter
87687               .append('button')
87688               .attr('class', 'fr error-editor-close')
87689               .on('click', function() {
87690                   context.enter(modeBrowse(context));
87691               })
87692               .call(svgIcon('#iD-icon-close'));
87693
87694           headerEnter
87695               .append('h3')
87696               .text(t('QA.improveOSM.title'));
87697
87698
87699           var body = selection.selectAll('.body')
87700               .data([0]);
87701
87702           body = body.enter()
87703               .append('div')
87704               .attr('class', 'body')
87705               .merge(body);
87706
87707           var editor = body.selectAll('.error-editor')
87708               .data([0]);
87709
87710           editor.enter()
87711               .append('div')
87712               .attr('class', 'modal-section error-editor')
87713               .merge(editor)
87714               .call(errorHeader.error(_error))
87715               .call(quickLinks.choices(choices))
87716               .call(errorDetails.error(_error))
87717               .call(errorComments.error(_error))
87718               .call(improveOsmSaveSection);
87719       }
87720
87721       function improveOsmSaveSection(selection) {
87722           var isSelected = (_error && _error.id === context.selectedErrorID());
87723           var isShown = (_error && (isSelected || _error.newComment || _error.comment));
87724           var saveSection = selection.selectAll('.error-save')
87725               .data(
87726                   (isShown ? [_error] : []),
87727                   function(d) { return d.id + '-' + (d.status || 0); }
87728               );
87729
87730           // exit
87731           saveSection.exit()
87732               .remove();
87733
87734           // enter
87735           var saveSectionEnter = saveSection.enter()
87736               .append('div')
87737               .attr('class', 'error-save save-section cf');
87738
87739           saveSectionEnter
87740               .append('h4')
87741               .attr('class', '.error-save-header')
87742               .text(t('note.newComment'));
87743
87744           saveSectionEnter
87745               .append('textarea')
87746               .attr('class', 'new-comment-input')
87747               .attr('placeholder', t('QA.keepRight.comment_placeholder'))
87748               .attr('maxlength', 1000)
87749               .property('value', function(d) { return d.newComment; })
87750               .call(utilNoAuto)
87751               .on('input', changeInput)
87752               .on('blur', changeInput);
87753
87754           // update
87755           saveSection = saveSectionEnter
87756               .merge(saveSection)
87757               .call(errorSaveButtons);
87758
87759           function changeInput() {
87760               var input = select(this);
87761               var val = input.property('value').trim();
87762
87763               if (val === '') {
87764                   val = undefined;
87765               }
87766
87767               // store the unsaved comment with the error itself
87768               _error = _error.update({ newComment: val });
87769
87770               var errorService = services.improveOSM;
87771               if (errorService) {
87772                   errorService.replaceError(_error);
87773               }
87774
87775               saveSection
87776                   .call(errorSaveButtons);
87777           }
87778       }
87779
87780       function errorSaveButtons(selection) {
87781           var isSelected = (_error && _error.id === context.selectedErrorID());
87782           var buttonSection = selection.selectAll('.buttons')
87783               .data((isSelected ? [_error] : []), function(d) { return d.status + d.id; });
87784
87785           // exit
87786           buttonSection.exit()
87787               .remove();
87788
87789           // enter
87790           var buttonEnter = buttonSection.enter()
87791               .append('div')
87792               .attr('class', 'buttons');
87793
87794           buttonEnter
87795               .append('button')
87796               .attr('class', 'button comment-button action')
87797               .text(t('QA.keepRight.save_comment'));
87798
87799           buttonEnter
87800               .append('button')
87801               .attr('class', 'button close-button action');
87802
87803           buttonEnter
87804               .append('button')
87805               .attr('class', 'button ignore-button action');
87806
87807
87808           // update
87809           buttonSection = buttonSection
87810               .merge(buttonEnter);
87811
87812           buttonSection.select('.comment-button')
87813               .attr('disabled', function(d) {
87814                   return d.newComment === undefined ? true : null;
87815               })
87816               .on('click.comment', function(d) {
87817                   this.blur();    // avoid keeping focus on the button - #4641
87818                   var errorService = services.improveOSM;
87819                   if (errorService) {
87820                       errorService.postUpdate(d, function(err, error) {
87821                           dispatch$1.call('change', error);
87822                       });
87823                   }
87824               });
87825
87826           buttonSection.select('.close-button')
87827               .text(function(d) {
87828                   var andComment = (d.newComment !== undefined ? '_comment' : '');
87829                   return t('QA.keepRight.close' + andComment);
87830               })
87831               .on('click.close', function(d) {
87832                   this.blur();    // avoid keeping focus on the button - #4641
87833                   var errorService = services.improveOSM;
87834                   if (errorService) {
87835                       d.newStatus = 'SOLVED';
87836                       errorService.postUpdate(d, function(err, error) {
87837                           dispatch$1.call('change', error);
87838                       });
87839                   }
87840               });
87841
87842           buttonSection.select('.ignore-button')
87843               .text(function(d) {
87844                   var andComment = (d.newComment !== undefined ? '_comment' : '');
87845                   return t('QA.keepRight.ignore' + andComment);
87846               })
87847               .on('click.ignore', function(d) {
87848                   this.blur();    // avoid keeping focus on the button - #4641
87849                   var errorService = services.improveOSM;
87850                   if (errorService) {
87851                       d.newStatus = 'INVALID';
87852                       errorService.postUpdate(d, function(err, error) {
87853                           dispatch$1.call('change', error);
87854                       });
87855                   }
87856               });
87857       }
87858
87859       improveOsmEditor.error = function(val) {
87860           if (!arguments.length) return _error;
87861           _error = val;
87862           return improveOsmEditor;
87863       };
87864
87865
87866       return utilRebind(improveOsmEditor, dispatch$1, 'on');
87867   }
87868
87869   function uiImproveOsmHeader() {
87870       var _error;
87871
87872
87873       function errorTitle(d) {
87874           var unknown = t('inspector.unknown');
87875
87876           if (!d) return unknown;
87877           var errorType = d.error_key;
87878           var et = en.QA.improveOSM.error_types[errorType];
87879
87880           if (et && et.title) {
87881               return t('QA.improveOSM.error_types.' + errorType + '.title');
87882           } else {
87883               return unknown;
87884           }
87885       }
87886
87887
87888       function improveOsmHeader(selection) {
87889           var header = selection.selectAll('.error-header')
87890               .data(
87891                   (_error ? [_error] : []),
87892                   function(d) { return d.id + '-' + (d.status || 0); }
87893               );
87894
87895           header.exit()
87896               .remove();
87897
87898           var headerEnter = header.enter()
87899               .append('div')
87900               .attr('class', 'error-header');
87901
87902           var iconEnter = headerEnter
87903               .append('div')
87904               .attr('class', 'error-header-icon')
87905               .classed('new', function(d) { return d.id < 0; });
87906
87907           var svgEnter = iconEnter
87908               .append('svg')
87909               .attr('width', '20px')
87910               .attr('height', '30px')
87911               .attr('viewbox', '0 0 20 30')
87912               .attr('class', function(d) {
87913                   return [
87914                       'preset-icon-28',
87915                       'qa_error',
87916                       d.service,
87917                       'error_id-' + d.id,
87918                       'error_type-' + d.error_type,
87919                       'category-' + d.category
87920                   ].join(' ');
87921               });
87922
87923           svgEnter
87924               .append('polygon')
87925               .attr('fill', 'currentColor')
87926               .attr('class', 'qa_error-fill')
87927               .attr('points', '16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6');
87928
87929           svgEnter
87930               .append('use')
87931               .attr('class', 'icon-annotation')
87932               .attr('width', '11px')
87933               .attr('height', '11px')
87934               .attr('transform', 'translate(4.5, 7)')
87935               .attr('xlink:href', function(d) {
87936                   var picon = d.icon;
87937
87938                   if (!picon) {
87939                       return '';
87940                   } else {
87941                       var isMaki = /^maki-/.test(picon);
87942                       return '#' + picon + (isMaki ? '-11' : '');
87943                   }
87944               });
87945
87946           headerEnter
87947               .append('div')
87948               .attr('class', 'error-header-label')
87949               .text(errorTitle);
87950       }
87951
87952
87953       improveOsmHeader.error = function(val) {
87954           if (!arguments.length) return _error;
87955           _error = val;
87956           return improveOsmHeader;
87957       };
87958
87959
87960       return improveOsmHeader;
87961   }
87962
87963   function uiPresetList(context) {
87964       var dispatch$1 = dispatch('choose');
87965       var _entityID;
87966       var _currentPreset;
87967       var _autofocus = false;
87968
87969
87970       function presetList(selection) {
87971           var entity = context.entity(_entityID);
87972           var geometry = context.geometry(_entityID);
87973
87974           // Treat entities on addr:interpolation lines as points, not vertices (#3241)
87975           if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
87976               geometry = 'point';
87977           }
87978
87979           var presets = context.presets().matchGeometry(geometry);
87980
87981           selection.html('');
87982
87983           var messagewrap = selection
87984               .append('div')
87985               .attr('class', 'header fillL');
87986
87987           var message = messagewrap
87988               .append('h3')
87989               .text(t('inspector.choose'));
87990
87991           messagewrap
87992               .append('button')
87993               .attr('class', 'preset-choose')
87994               .on('click', function() { dispatch$1.call('choose', this, _currentPreset); })
87995               .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'));
87996
87997           function initialKeydown() {
87998               // hack to let delete shortcut work when search is autofocused
87999               if (search.property('value').length === 0 &&
88000                   (event.keyCode === utilKeybinding.keyCodes['⌫'] ||
88001                    event.keyCode === utilKeybinding.keyCodes['⌦'])) {
88002                   event.preventDefault();
88003                   event.stopPropagation();
88004                   operationDelete([_entityID], context)();
88005
88006               // hack to let undo work when search is autofocused
88007               } else if (search.property('value').length === 0 &&
88008                   (event.ctrlKey || event.metaKey) &&
88009                   event.keyCode === utilKeybinding.keyCodes.z) {
88010                   event.preventDefault();
88011                   event.stopPropagation();
88012                   context.undo();
88013               } else if (!event.ctrlKey && !event.metaKey) {
88014                   // don't check for delete/undo hack on future keydown events
88015                   select(this).on('keydown', keydown);
88016                   keydown.call(this);
88017               }
88018           }
88019
88020           function keydown() {
88021               // down arrow
88022               if (event.keyCode === utilKeybinding.keyCodes['↓'] &&
88023                   // if insertion point is at the end of the string
88024                   search.node().selectionStart === search.property('value').length) {
88025                   event.preventDefault();
88026                   event.stopPropagation();
88027                   // move focus to the first item in the preset list
88028                   var buttons = list.selectAll('.preset-list-button');
88029                   if (!buttons.empty()) buttons.nodes()[0].focus();
88030               }
88031           }
88032
88033           function keypress() {
88034               // enter
88035               var value = search.property('value');
88036               if (event.keyCode === 13 && value.length) {
88037                   list.selectAll('.preset-list-item:first-child').datum().choose();
88038               }
88039           }
88040
88041           function inputevent() {
88042               var value = search.property('value');
88043               list.classed('filtered', value.length);
88044               if (value.length) {
88045                   var results = presets.search(value, geometry);
88046                   message.text(t('inspector.results', {
88047                       n: results.collection.length,
88048                       search: value
88049                   }));
88050                   list.call(drawList, results);
88051               } else {
88052                   list.call(drawList, context.presets().defaults(geometry, 36));
88053                   message.text(t('inspector.choose'));
88054               }
88055           }
88056
88057           var searchWrap = selection
88058               .append('div')
88059               .attr('class', 'search-header');
88060
88061           var search = searchWrap
88062               .append('input')
88063               .attr('class', 'preset-search-input')
88064               .attr('placeholder', t('inspector.search'))
88065               .attr('type', 'search')
88066               .call(utilNoAuto)
88067               .on('keydown', initialKeydown)
88068               .on('keypress', keypress)
88069               .on('input', inputevent);
88070
88071           searchWrap
88072               .call(svgIcon('#iD-icon-search', 'pre-text'));
88073
88074           if (_autofocus) {
88075               search.node().focus();
88076           }
88077
88078           var listWrap = selection
88079               .append('div')
88080               .attr('class', 'inspector-body');
88081
88082           var list = listWrap
88083               .append('div')
88084               .attr('class', 'preset-list fillL cf')
88085               .call(drawList, context.presets().defaults(geometry, 36));
88086
88087           context.features().on('change.preset-list', updateForFeatureHiddenState);
88088       }
88089
88090
88091       function drawList(list, presets) {
88092           var collection = presets.collection.reduce(function(collection, preset) {
88093               if (preset.members) {
88094                   collection.push(CategoryItem(preset));
88095               } else if (preset.visible()) {
88096                   collection.push(PresetItem(preset));
88097               }
88098               return collection;
88099           }, []);
88100
88101           var items = list.selectAll('.preset-list-item')
88102               .data(collection, function(d) { return d.preset.id; });
88103
88104           items.order();
88105
88106           items.exit()
88107               .remove();
88108
88109           items.enter()
88110               .append('div')
88111               .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
88112               .classed('current', function(item) { return item.preset === _currentPreset; })
88113               .each(function(item) { select(this).call(item); })
88114               .style('opacity', 0)
88115               .transition()
88116               .style('opacity', 1);
88117
88118           updateForFeatureHiddenState();
88119       }
88120
88121       function itemKeydown(){
88122           // the actively focused item
88123           var item = select(this.closest('.preset-list-item'));
88124           var parentItem = select(item.node().parentElement.closest('.preset-list-item'));
88125
88126           // arrow down, move focus to the next, lower item
88127           if (event.keyCode === utilKeybinding.keyCodes['↓']) {
88128               event.preventDefault();
88129               event.stopPropagation();
88130               // the next item in the list at the same level
88131               var nextItem = select(item.node().nextElementSibling);
88132               // if there is no next item in this list
88133               if (nextItem.empty()) {
88134                   // if there is a parent item
88135                   if (!parentItem.empty()) {
88136                       // the item is the last item of a sublist,
88137                       // select the next item at the parent level
88138                       nextItem = select(parentItem.node().nextElementSibling);
88139                   }
88140               // if the focused item is expanded
88141               } else if (select(this).classed('expanded')) {
88142                   // select the first subitem instead
88143                   nextItem = item.select('.subgrid .preset-list-item:first-child');
88144               }
88145               if (!nextItem.empty()) {
88146                   // focus on the next item
88147                   nextItem.select('.preset-list-button').node().focus();
88148               }
88149
88150           // arrow up, move focus to the previous, higher item
88151           } else if (event.keyCode === utilKeybinding.keyCodes['↑']) {
88152               event.preventDefault();
88153               event.stopPropagation();
88154               // the previous item in the list at the same level
88155               var previousItem = select(item.node().previousElementSibling);
88156
88157               // if there is no previous item in this list
88158               if (previousItem.empty()) {
88159                   // if there is a parent item
88160                   if (!parentItem.empty()) {
88161                       // the item is the first subitem of a sublist select the parent item
88162                       previousItem = parentItem;
88163                   }
88164               // if the previous item is expanded
88165               } else if (previousItem.select('.preset-list-button').classed('expanded')) {
88166                   // select the last subitem of the sublist of the previous item
88167                   previousItem = previousItem.select('.subgrid .preset-list-item:last-child');
88168               }
88169
88170               if (!previousItem.empty()) {
88171                   // focus on the previous item
88172                   previousItem.select('.preset-list-button').node().focus();
88173               } else {
88174                   // the focus is at the top of the list, move focus back to the search field
88175                   var search = select(this.closest('.preset-list-pane')).select('.preset-search-input');
88176                   search.node().focus();
88177               }
88178
88179           // arrow left, move focus to the parent item if there is one
88180           } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
88181               event.preventDefault();
88182               event.stopPropagation();
88183               // if there is a parent item, focus on the parent item
88184               if (!parentItem.empty()) {
88185                   parentItem.select('.preset-list-button').node().focus();
88186               }
88187
88188           // arrow right, choose this item
88189           } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
88190               event.preventDefault();
88191               event.stopPropagation();
88192               item.datum().choose.call(select(this).node());
88193           }
88194       }
88195
88196
88197       function CategoryItem(preset) {
88198           var box, sublist, shown = false;
88199
88200           function item(selection) {
88201               var wrap = selection.append('div')
88202                   .attr('class', 'preset-list-button-wrap category');
88203
88204               function click() {
88205                   var isExpanded = select(this).classed('expanded');
88206                   var iconName = isExpanded ?
88207                       (textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward') : '#iD-icon-down';
88208                   select(this)
88209                       .classed('expanded', !isExpanded);
88210                   select(this).selectAll('div.label-inner svg.icon use')
88211                       .attr('href', iconName);
88212                   item.choose();
88213               }
88214
88215               var button = wrap
88216                   .append('button')
88217                   .attr('class', 'preset-list-button')
88218                   .classed('expanded', false)
88219                   .call(uiPresetIcon()
88220                       .geometry(context.geometry(_entityID))
88221                       .preset(preset))
88222                   .on('click', click)
88223                   .on('keydown', function() {
88224                       // right arrow, expand the focused item
88225                       if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
88226                           event.preventDefault();
88227                           event.stopPropagation();
88228                           // if the item isn't expanded
88229                           if (!select(this).classed('expanded')) {
88230                               // toggle expansion (expand the item)
88231                               click.call(this);
88232                           }
88233                       // left arrow, collapse the focused item
88234                       } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
88235                           event.preventDefault();
88236                           event.stopPropagation();
88237                           // if the item is expanded
88238                           if (select(this).classed('expanded')) {
88239                               // toggle expansion (collapse the item)
88240                               click.call(this);
88241                           }
88242                       } else {
88243                           itemKeydown.call(this);
88244                       }
88245                   });
88246
88247               var label = button
88248                   .append('div')
88249                   .attr('class', 'label')
88250                   .append('div')
88251                   .attr('class', 'label-inner');
88252
88253               label
88254                   .append('div')
88255                   .attr('class', 'namepart')
88256                   .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'))
88257                   .append('span')
88258                   .html(function() { return preset.name() + '&hellip;'; });
88259
88260               box = selection.append('div')
88261                   .attr('class', 'subgrid')
88262                   .style('max-height', '0px')
88263                   .style('opacity', 0);
88264
88265               box.append('div')
88266                   .attr('class', 'arrow');
88267
88268               sublist = box.append('div')
88269                   .attr('class', 'preset-list fillL3');
88270           }
88271
88272
88273           item.choose = function() {
88274               if (!box || !sublist) return;
88275
88276               if (shown) {
88277                   shown = false;
88278                   box.transition()
88279                       .duration(200)
88280                       .style('opacity', '0')
88281                       .style('max-height', '0px')
88282                       .style('padding-bottom', '0px');
88283               } else {
88284                   shown = true;
88285                   sublist.call(drawList, preset.members);
88286                   box.transition()
88287                       .duration(200)
88288                       .style('opacity', '1')
88289                       .style('max-height', 200 + preset.members.collection.length * 190 + 'px')
88290                       .style('padding-bottom', '10px');
88291               }
88292           };
88293
88294           item.preset = preset;
88295           return item;
88296       }
88297
88298
88299       function PresetItem(preset) {
88300           function item(selection) {
88301               var wrap = selection.append('div')
88302                   .attr('class', 'preset-list-button-wrap');
88303
88304               var button = wrap.append('button')
88305                   .attr('class', 'preset-list-button')
88306                   .call(uiPresetIcon()
88307                       .geometry(context.geometry(_entityID))
88308                       .preset(preset))
88309                   .on('click', item.choose)
88310                   .on('keydown', itemKeydown);
88311
88312               var label = button
88313                   .append('div')
88314                   .attr('class', 'label')
88315                   .append('div')
88316                   .attr('class', 'label-inner');
88317
88318               // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
88319               label.selectAll('.namepart')
88320                   .data(preset.name().split(' – '))
88321                   .enter()
88322                   .append('div')
88323                   .attr('class', 'namepart')
88324                   .text(function(d) { return d; });
88325
88326               wrap.call(item.reference.button);
88327               selection.call(item.reference.body);
88328           }
88329
88330           item.choose = function() {
88331               if (select(this).classed('disabled')) return;
88332
88333               context.presets().choose(preset);
88334               context.perform(
88335                   actionChangePreset(_entityID, _currentPreset, preset),
88336                   t('operations.change_tags.annotation')
88337               );
88338
88339               dispatch$1.call('choose', this, preset);
88340           };
88341
88342           item.help = function() {
88343               event.stopPropagation();
88344               item.reference.toggle();
88345           };
88346
88347           item.preset = preset;
88348           item.reference = uiTagReference(preset.reference(context.geometry(_entityID)), context);
88349
88350           return item;
88351       }
88352
88353       function updateForFeatureHiddenState() {
88354
88355           if (!context.hasEntity(_entityID)) return;
88356
88357           var geometry = context.geometry(_entityID);
88358
88359           var button = d3_selectAll('.preset-list .preset-list-button');
88360
88361           // remove existing tooltips
88362           button.call(tooltip().destroyAny);
88363
88364           button.each(function(item, index) {
88365
88366               var hiddenPresetFeaturesId = context.features().isHiddenPreset(item.preset, geometry);
88367               var isHiddenPreset = !!hiddenPresetFeaturesId && item.preset !== _currentPreset;
88368
88369               select(this)
88370                   .classed('disabled', isHiddenPreset);
88371
88372               if (isHiddenPreset) {
88373                   var isAutoHidden = context.features().autoHidden(hiddenPresetFeaturesId);
88374                   var tooltipIdSuffix = isAutoHidden ? 'zoom' : 'manual';
88375                   var tooltipObj = { features: t('feature.' + hiddenPresetFeaturesId + '.description') };
88376                   select(this).call(tooltip()
88377                       .title(t('inspector.hidden_preset.' + tooltipIdSuffix, tooltipObj))
88378                       .placement(index < 2 ? 'bottom' : 'top')
88379                   );
88380               }
88381           });
88382       }
88383
88384       presetList.autofocus = function(val) {
88385           if (!arguments.length) return _autofocus;
88386           _autofocus = val;
88387           return presetList;
88388       };
88389
88390
88391       presetList.entityID = function(val) {
88392           if (!arguments.length) return _entityID;
88393           _entityID = val;
88394           presetList.preset(context.presets().match(context.entity(_entityID), context.graph()));
88395           return presetList;
88396       };
88397
88398
88399       presetList.preset = function(val) {
88400           if (!arguments.length) return _currentPreset;
88401           _currentPreset = val;
88402           return presetList;
88403       };
88404
88405
88406       return utilRebind(presetList, dispatch$1, 'on');
88407   }
88408
88409   function uiViewOnOSM(context) {
88410       var _what;   // an osmEntity or osmNote
88411
88412
88413       function viewOnOSM(selection) {
88414           var url;
88415           if (_what instanceof osmEntity) {
88416               url = context.connection().entityURL(_what);
88417           } else if (_what instanceof osmNote) {
88418               url = context.connection().noteURL(_what);
88419           }
88420
88421           var data = ((!_what || _what.isNew()) ? [] : [_what]);
88422           var link = selection.selectAll('.view-on-osm')
88423               .data(data, function(d) { return d.id; });
88424
88425           // exit
88426           link.exit()
88427               .remove();
88428
88429           // enter
88430           var linkEnter = link.enter()
88431               .append('a')
88432               .attr('class', 'view-on-osm')
88433               .attr('target', '_blank')
88434               .attr('href', url)
88435               .call(svgIcon('#iD-icon-out-link', 'inline'));
88436
88437           linkEnter
88438               .append('span')
88439               .text(t('inspector.view_on_osm'));
88440       }
88441
88442
88443       viewOnOSM.what = function(_) {
88444           if (!arguments.length) return _what;
88445           _what = _;
88446           return viewOnOSM;
88447       };
88448
88449       return viewOnOSM;
88450   }
88451
88452   function uiInspector(context) {
88453       var presetList = uiPresetList(context);
88454       var entityEditor = uiEntityEditor(context);
88455       var wrap = select(null),
88456           presetPane = select(null),
88457           editorPane = select(null);
88458       var _state = 'select';
88459       var _entityID;
88460       var _newFeature = false;
88461
88462
88463       function inspector(selection, newFeature) {
88464           presetList
88465               .entityID(_entityID)
88466               .autofocus(_newFeature)
88467               .on('choose', inspector.setPreset);
88468
88469           entityEditor
88470               .state(_state)
88471               .entityID(_entityID)
88472               .on('choose', inspector.showList);
88473
88474           wrap = selection.selectAll('.panewrap')
88475               .data([0]);
88476
88477           var enter = wrap.enter()
88478               .append('div')
88479               .attr('class', 'panewrap');
88480
88481           enter
88482               .append('div')
88483               .attr('class', 'preset-list-pane pane');
88484
88485           enter
88486               .append('div')
88487               .attr('class', 'entity-editor-pane pane');
88488
88489           wrap = wrap.merge(enter);
88490           presetPane = wrap.selectAll('.preset-list-pane');
88491           editorPane = wrap.selectAll('.entity-editor-pane');
88492
88493           var entity = context.entity(_entityID);
88494
88495           var isTaglessOrIntersectionVertex = entity.geometry(context.graph()) === 'vertex' &&
88496               (!entity.hasNonGeometryTags() && !entity.isHighwayIntersection(context.graph()));
88497           // start with the preset list if the feature is new or is an uninteresting vertex
88498           var showPresetList = newFeature || isTaglessOrIntersectionVertex;
88499
88500           if (showPresetList) {
88501               wrap.style('right', '-100%');
88502               presetPane.call(presetList);
88503           } else {
88504               wrap.style('right', '0%');
88505               editorPane.call(entityEditor);
88506           }
88507
88508           var footer = selection.selectAll('.footer')
88509               .data([0]);
88510
88511           footer = footer.enter()
88512               .append('div')
88513               .attr('class', 'footer')
88514               .merge(footer);
88515
88516           footer
88517               .call(uiViewOnOSM(context)
88518                   .what(context.hasEntity(_entityID))
88519               );
88520       }
88521
88522       inspector.showList = function(preset) {
88523           wrap.transition()
88524               .styleTween('right', function() { return interpolate('0%', '-100%'); });
88525
88526           presetPane
88527               .call(presetList.preset(preset).autofocus(true));
88528       };
88529
88530       inspector.setPreset = function(preset) {
88531
88532           // upon setting multipolygon, go to the area preset list instead of the editor
88533           if (preset.id === 'type/multipolygon') {
88534               presetPane
88535                   .call(presetList.preset(preset).autofocus(true));
88536
88537           } else {
88538               wrap.transition()
88539                   .styleTween('right', function() { return interpolate('-100%', '0%'); });
88540
88541               editorPane
88542                   .call(entityEditor.preset(preset));
88543           }
88544
88545       };
88546
88547       inspector.state = function(val) {
88548           if (!arguments.length) return _state;
88549           _state = val;
88550           entityEditor.state(_state);
88551
88552           // remove any old field help overlay that might have gotten attached to the inspector
88553           d3_selectAll('.field-help-body').remove();
88554
88555           return inspector;
88556       };
88557
88558
88559       inspector.entityID = function(val) {
88560           if (!arguments.length) return _entityID;
88561           _entityID = val;
88562           return inspector;
88563       };
88564
88565
88566       inspector.newFeature = function(val) {
88567           if (!arguments.length) return _newFeature;
88568           _newFeature = val;
88569           return inspector;
88570       };
88571
88572
88573       return inspector;
88574   }
88575
88576   function uiKeepRightDetails(context) {
88577       var _error;
88578
88579
88580       function errorDetail(d) {
88581           var unknown = t('inspector.unknown');
88582
88583           if (!d) return unknown;
88584           var errorType = d.error_type;
88585           var parentErrorType = d.parent_error_type;
88586
88587           var et = en.QA.keepRight.errorTypes[errorType];
88588           var pt = en.QA.keepRight.errorTypes[parentErrorType];
88589
88590           var detail;
88591           if (et && et.description) {
88592               detail = t('QA.keepRight.errorTypes.' + errorType + '.description', d.replacements);
88593           } else if (pt && pt.description) {
88594               detail = t('QA.keepRight.errorTypes.' + parentErrorType + '.description', d.replacements);
88595           } else {
88596               detail = unknown;
88597           }
88598
88599           return detail;
88600       }
88601
88602
88603       function keepRightDetails(selection) {
88604           var details = selection.selectAll('.error-details')
88605               .data(
88606                   (_error ? [_error] : []),
88607                   function(d) { return d.id + '-' + (d.status || 0); }
88608               );
88609
88610           details.exit()
88611               .remove();
88612
88613           var detailsEnter = details.enter()
88614               .append('div')
88615               .attr('class', 'error-details error-details-container');
88616
88617
88618           // description
88619           var descriptionEnter = detailsEnter
88620               .append('div')
88621               .attr('class', 'error-details-description');
88622
88623           descriptionEnter
88624               .append('h4')
88625               .text(function() { return t('QA.keepRight.detail_description'); });
88626
88627           descriptionEnter
88628               .append('div')
88629               .attr('class', 'error-details-description-text')
88630               .html(errorDetail);
88631
88632           // If there are entity links in the error message..
88633           var relatedEntities = [];
88634           descriptionEnter.selectAll('.error_entity_link, .error_object_link')
88635               .each(function() {
88636                   var link = select(this);
88637                   var isObjectLink = link.classed('error_object_link');
88638                   var entityID = isObjectLink ?
88639                       (utilEntityRoot(_error.object_type) + _error.object_id)
88640                       : this.textContent;
88641                   var entity = context.hasEntity(entityID);
88642
88643                   relatedEntities.push(entityID);
88644
88645                   // Add click handler
88646                   link
88647                       .on('mouseover', function() {
88648                           context.surface().selectAll(utilEntityOrMemberSelector([entityID], context.graph()))
88649                               .classed('hover', true);
88650                       })
88651                       .on('mouseout', function() {
88652                           context.surface().selectAll('.hover')
88653                               .classed('hover', false);
88654                       })
88655                       .on('click', function() {
88656                           event.preventDefault();
88657                           var osmlayer = context.layers().layer('osm');
88658                           if (!osmlayer.enabled()) {
88659                               osmlayer.enabled(true);
88660                           }
88661
88662                           context.map().centerZoomEase(_error.loc, 20);
88663
88664                           if (entity) {
88665                               context.enter(modeSelect(context, [entityID]));
88666                           } else {
88667                               context.loadEntity(entityID, function() {
88668                                   context.enter(modeSelect(context, [entityID]));
88669                               });
88670                           }
88671                       });
88672
88673                   // Replace with friendly name if possible
88674                   // (The entity may not yet be loaded into the graph)
88675                   if (entity) {
88676                       var name = utilDisplayName(entity);  // try to use common name
88677
88678                       if (!name && !isObjectLink) {
88679                           var preset = context.presets().match(entity, context.graph());
88680                           name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
88681                       }
88682
88683                       if (name) {
88684                           this.innerText = name;
88685                       }
88686                   }
88687               });
88688
88689           // Don't hide entities related to this error - #5880
88690           context.features().forceVisible(relatedEntities);
88691       }
88692
88693
88694       keepRightDetails.error = function(val) {
88695           if (!arguments.length) return _error;
88696           _error = val;
88697           return keepRightDetails;
88698       };
88699
88700
88701       return keepRightDetails;
88702   }
88703
88704   function uiKeepRightEditor(context) {
88705       var dispatch$1 = dispatch('change');
88706       var keepRightDetails = uiKeepRightDetails(context);
88707       var keepRightHeader = uiKeepRightHeader(context);
88708       var quickLinks = uiQuickLinks();
88709
88710       var _error;
88711
88712
88713       function keepRightEditor(selection) {
88714           // quick links
88715           var choices = [{
88716               id: 'zoom_to',
88717               label: 'inspector.zoom_to.title',
88718               tooltip: function() {
88719                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_issue'), t('inspector.zoom_to.key'));
88720               },
88721               click: function zoomTo() {
88722                   context.mode().zoomToSelected();
88723               }
88724           }];
88725
88726
88727           var header = selection.selectAll('.header')
88728               .data([0]);
88729
88730           var headerEnter = header.enter()
88731               .append('div')
88732               .attr('class', 'header fillL');
88733
88734           headerEnter
88735               .append('button')
88736               .attr('class', 'fr error-editor-close')
88737               .on('click', function() {
88738                   context.enter(modeBrowse(context));
88739               })
88740               .call(svgIcon('#iD-icon-close'));
88741
88742           headerEnter
88743               .append('h3')
88744               .text(t('QA.keepRight.title'));
88745
88746
88747           var body = selection.selectAll('.body')
88748               .data([0]);
88749
88750           body = body.enter()
88751               .append('div')
88752               .attr('class', 'body')
88753               .merge(body);
88754
88755           var editor = body.selectAll('.error-editor')
88756               .data([0]);
88757
88758           editor.enter()
88759               .append('div')
88760               .attr('class', 'modal-section error-editor')
88761               .merge(editor)
88762               .call(keepRightHeader.error(_error))
88763               .call(quickLinks.choices(choices))
88764               .call(keepRightDetails.error(_error))
88765               .call(keepRightSaveSection);
88766
88767
88768           var footer = selection.selectAll('.footer')
88769               .data([0]);
88770
88771           footer.enter()
88772               .append('div')
88773               .attr('class', 'footer')
88774               .merge(footer)
88775               .call(uiViewOnKeepRight(context).what(_error));
88776       }
88777
88778
88779       function keepRightSaveSection(selection) {
88780           var isSelected = (_error && _error.id === context.selectedErrorID());
88781           var isShown = (_error && (isSelected || _error.newComment || _error.comment));
88782           var saveSection = selection.selectAll('.error-save')
88783               .data(
88784                   (isShown ? [_error] : []),
88785                   function(d) { return d.id + '-' + (d.status || 0); }
88786               );
88787
88788           // exit
88789           saveSection.exit()
88790               .remove();
88791
88792           // enter
88793           var saveSectionEnter = saveSection.enter()
88794               .append('div')
88795               .attr('class', 'error-save save-section cf');
88796
88797           saveSectionEnter
88798               .append('h4')
88799               .attr('class', '.error-save-header')
88800               .text(t('QA.keepRight.comment'));
88801
88802           saveSectionEnter
88803               .append('textarea')
88804               .attr('class', 'new-comment-input')
88805               .attr('placeholder', t('QA.keepRight.comment_placeholder'))
88806               .attr('maxlength', 1000)
88807               .property('value', function(d) { return d.newComment || d.comment; })
88808               .call(utilNoAuto)
88809               .on('input', changeInput)
88810               .on('blur', changeInput);
88811
88812           // update
88813           saveSection = saveSectionEnter
88814               .merge(saveSection)
88815               .call(keepRightSaveButtons);
88816
88817
88818           function changeInput() {
88819               var input = select(this);
88820               var val = input.property('value').trim();
88821
88822               if (val === _error.comment) {
88823                   val = undefined;
88824               }
88825
88826               // store the unsaved comment with the error itself
88827               _error = _error.update({ newComment: val });
88828
88829               var keepRight = services.keepRight;
88830               if (keepRight) {
88831                   keepRight.replaceError(_error);  // update keepright cache
88832               }
88833
88834               saveSection
88835                   .call(keepRightSaveButtons);
88836           }
88837       }
88838
88839
88840       function keepRightSaveButtons(selection) {
88841           var isSelected = (_error && _error.id === context.selectedErrorID());
88842           var buttonSection = selection.selectAll('.buttons')
88843               .data((isSelected ? [_error] : []), function(d) { return d.status + d.id; });
88844
88845           // exit
88846           buttonSection.exit()
88847               .remove();
88848
88849           // enter
88850           var buttonEnter = buttonSection.enter()
88851               .append('div')
88852               .attr('class', 'buttons');
88853
88854           buttonEnter
88855               .append('button')
88856               .attr('class', 'button comment-button action')
88857               .text(t('QA.keepRight.save_comment'));
88858
88859           buttonEnter
88860               .append('button')
88861               .attr('class', 'button close-button action');
88862
88863           buttonEnter
88864               .append('button')
88865               .attr('class', 'button ignore-button action');
88866
88867
88868           // update
88869           buttonSection = buttonSection
88870               .merge(buttonEnter);
88871
88872           buttonSection.select('.comment-button')   // select and propagate data
88873               .attr('disabled', function(d) {
88874                   return d.newComment === undefined ? true : null;
88875               })
88876               .on('click.comment', function(d) {
88877                   this.blur();    // avoid keeping focus on the button - #4641
88878                   var keepRight = services.keepRight;
88879                   if (keepRight) {
88880                       keepRight.postKeepRightUpdate(d, function(err, error) {
88881                           dispatch$1.call('change', error);
88882                       });
88883                   }
88884               });
88885
88886           buttonSection.select('.close-button')   // select and propagate data
88887               .text(function(d) {
88888                   var andComment = (d.newComment !== undefined ? '_comment' : '');
88889                   return t('QA.keepRight.close' + andComment);
88890               })
88891               .on('click.close', function(d) {
88892                   this.blur();    // avoid keeping focus on the button - #4641
88893                   var keepRight = services.keepRight;
88894                   if (keepRight) {
88895                       d.state = 'ignore_t';   // ignore temporarily (error fixed)
88896                       keepRight.postKeepRightUpdate(d, function(err, error) {
88897                           dispatch$1.call('change', error);
88898                       });
88899                   }
88900               });
88901
88902           buttonSection.select('.ignore-button')   // select and propagate data
88903               .text(function(d) {
88904                   var andComment = (d.newComment !== undefined ? '_comment' : '');
88905                   return t('QA.keepRight.ignore' + andComment);
88906               })
88907               .on('click.ignore', function(d) {
88908                   this.blur();    // avoid keeping focus on the button - #4641
88909                   var keepRight = services.keepRight;
88910                   if (keepRight) {
88911                       d.state = 'ignore';   // ignore permanently (false positive)
88912                       keepRight.postKeepRightUpdate(d, function(err, error) {
88913                           dispatch$1.call('change', error);
88914                       });
88915                   }
88916               });
88917       }
88918
88919
88920       keepRightEditor.error = function(val) {
88921           if (!arguments.length) return _error;
88922           _error = val;
88923           return keepRightEditor;
88924       };
88925
88926
88927       return utilRebind(keepRightEditor, dispatch$1, 'on');
88928   }
88929
88930   function uiKeepRightHeader() {
88931       var _error;
88932
88933
88934       function errorTitle(d) {
88935           var unknown = t('inspector.unknown');
88936
88937           if (!d) return unknown;
88938           var errorType = d.error_type;
88939           var parentErrorType = d.parent_error_type;
88940
88941           var et = en.QA.keepRight.errorTypes[errorType];
88942           var pt = en.QA.keepRight.errorTypes[parentErrorType];
88943
88944           if (et && et.title) {
88945               return t('QA.keepRight.errorTypes.' + errorType + '.title');
88946           } else if (pt && pt.title) {
88947               return t('QA.keepRight.errorTypes.' + parentErrorType + '.title');
88948           } else {
88949               return unknown;
88950           }
88951       }
88952
88953
88954       function keepRightHeader(selection) {
88955           var header = selection.selectAll('.error-header')
88956               .data(
88957                   (_error ? [_error] : []),
88958                   function(d) { return d.id + '-' + (d.status || 0); }
88959               );
88960
88961           header.exit()
88962               .remove();
88963
88964           var headerEnter = header.enter()
88965               .append('div')
88966               .attr('class', 'error-header');
88967
88968           var iconEnter = headerEnter
88969               .append('div')
88970               .attr('class', 'error-header-icon')
88971               .classed('new', function(d) { return d.id < 0; });
88972
88973           iconEnter
88974               .append('div')
88975               .attr('class', function(d) {
88976                   return 'preset-icon-28 qa_error ' + d.service + ' error_id-' + d.id + ' error_type-' + d.parent_error_type;
88977               })
88978               .call(svgIcon('#iD-icon-bolt', 'qa_error-fill'));
88979
88980           headerEnter
88981               .append('div')
88982               .attr('class', 'error-header-label')
88983               .text(errorTitle);
88984       }
88985
88986
88987       keepRightHeader.error = function(val) {
88988           if (!arguments.length) return _error;
88989           _error = val;
88990           return keepRightHeader;
88991       };
88992
88993
88994       return keepRightHeader;
88995   }
88996
88997   function uiLasso(context) {
88998       var group, polygon;
88999
89000       lasso.coordinates = [];
89001
89002       function lasso(selection) {
89003           context.container()
89004               .classed('lasso', true);
89005
89006           group = selection
89007               .append('g')
89008               .attr('class', 'lasso hide');
89009
89010           polygon = group
89011               .append('path')
89012               .attr('class', 'lasso-path');
89013
89014           group
89015               .call(uiToggle(true));
89016       }
89017
89018
89019       function draw() {
89020           if (polygon) {
89021               polygon.data([lasso.coordinates])
89022                   .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
89023           }
89024       }
89025
89026
89027       lasso.extent = function () {
89028           return lasso.coordinates.reduce(function(extent, point) {
89029               return extent.extend(geoExtent(point));
89030           }, geoExtent());
89031       };
89032
89033
89034       lasso.p = function(_) {
89035           if (!arguments.length) return lasso;
89036           lasso.coordinates.push(_);
89037           draw();
89038           return lasso;
89039       };
89040
89041
89042       lasso.close = function() {
89043           if (group) {
89044               group.call(uiToggle(false, function() {
89045                   select(this).remove();
89046               }));
89047           }
89048           context.container().classed('lasso', false);
89049       };
89050
89051
89052       return lasso;
89053   }
89054
89055   function uiNoteComments() {
89056       var _note;
89057
89058
89059       function noteComments(selection) {
89060           if (_note.isNew()) return; // don't draw .comments-container
89061
89062           var comments = selection.selectAll('.comments-container')
89063               .data([0]);
89064
89065           comments = comments.enter()
89066               .append('div')
89067               .attr('class', 'comments-container')
89068               .merge(comments);
89069
89070           var commentEnter = comments.selectAll('.comment')
89071               .data(_note.comments)
89072               .enter()
89073               .append('div')
89074               .attr('class', 'comment');
89075
89076           commentEnter
89077               .append('div')
89078               .attr('class', function(d) { return 'comment-avatar user-' + d.uid; })
89079               .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
89080
89081           var mainEnter = commentEnter
89082               .append('div')
89083               .attr('class', 'comment-main');
89084
89085           var metadataEnter = mainEnter
89086               .append('div')
89087               .attr('class', 'comment-metadata');
89088
89089           metadataEnter
89090               .append('div')
89091               .attr('class', 'comment-author')
89092               .each(function(d) {
89093                   var selection = select(this);
89094                   var osm = services.osm;
89095                   if (osm && d.user) {
89096                       selection = selection
89097                           .append('a')
89098                           .attr('class', 'comment-author-link')
89099                           .attr('href', osm.userURL(d.user))
89100                           .attr('tabindex', -1)
89101                           .attr('target', '_blank');
89102                   }
89103                   selection
89104                       .text(function(d) { return d.user || t('note.anonymous'); });
89105               });
89106
89107           metadataEnter
89108               .append('div')
89109               .attr('class', 'comment-date')
89110               .text(function(d) {
89111                   return t('note.status.' + d.action, { when: localeDateString(d.date) });
89112               });
89113
89114           mainEnter
89115               .append('div')
89116               .attr('class', 'comment-text')
89117               .html(function(d) { return d.html; });
89118
89119           comments
89120               .call(replaceAvatars);
89121       }
89122
89123
89124       function replaceAvatars(selection) {
89125           var osm = services.osm;
89126           if (!osm) return;
89127
89128           var uids = {};  // gather uids in the comment thread
89129           _note.comments.forEach(function(d) {
89130               if (d.uid) uids[d.uid] = true;
89131           });
89132
89133           Object.keys(uids).forEach(function(uid) {
89134               osm.loadUser(uid, function(err, user) {
89135                   if (!user || !user.image_url) return;
89136
89137                   selection.selectAll('.comment-avatar.user-' + uid)
89138                       .html('')
89139                       .append('img')
89140                       .attr('class', 'icon comment-avatar-icon')
89141                       .attr('src', user.image_url)
89142                       .attr('alt', user.display_name);
89143               });
89144           });
89145       }
89146
89147
89148       function localeDateString(s) {
89149           if (!s) return null;
89150           var detected = utilDetect();
89151           var options = { day: 'numeric', month: 'short', year: 'numeric' };
89152           s = s.replace(/-/g, '/'); // fix browser-specific Date() issues
89153           var d = new Date(s);
89154           if (isNaN(d.getTime())) return null;
89155           return d.toLocaleDateString(detected.locale, options);
89156       }
89157
89158
89159       noteComments.note = function(val) {
89160           if (!arguments.length) return _note;
89161           _note = val;
89162           return noteComments;
89163       };
89164
89165
89166       return noteComments;
89167   }
89168
89169   function uiNoteEditor(context) {
89170       var dispatch$1 = dispatch('change');
89171       var quickLinks = uiQuickLinks();
89172       var noteComments = uiNoteComments();
89173       var noteHeader = uiNoteHeader();
89174
89175       // var formFields = uiFormFields(context);
89176
89177       var _note;
89178       // var _fieldsArr;
89179
89180
89181       function noteEditor(selection) {
89182           // quick links
89183           var choices = [{
89184               id: 'zoom_to',
89185               label: 'inspector.zoom_to.title',
89186               tooltip: function() {
89187                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_note'), t('inspector.zoom_to.key'));
89188               },
89189               click: function zoomTo() {
89190                   context.mode().zoomToSelected();
89191               }
89192           }];
89193
89194
89195           var header = selection.selectAll('.header')
89196               .data([0]);
89197
89198           var headerEnter = header.enter()
89199               .append('div')
89200               .attr('class', 'header fillL');
89201
89202           headerEnter
89203               .append('button')
89204               .attr('class', 'fr note-editor-close')
89205               .on('click', function() {
89206                   context.enter(modeBrowse(context));
89207               })
89208               .call(svgIcon('#iD-icon-close'));
89209
89210           headerEnter
89211               .append('h3')
89212               .text(t('note.title'));
89213
89214
89215           var body = selection.selectAll('.body')
89216               .data([0]);
89217
89218           body = body.enter()
89219               .append('div')
89220               .attr('class', 'body')
89221               .merge(body);
89222
89223           var editor = body.selectAll('.note-editor')
89224               .data([0]);
89225
89226           editor.enter()
89227               .append('div')
89228               .attr('class', 'modal-section note-editor')
89229               .merge(editor)
89230               .call(noteHeader.note(_note))
89231               .call(quickLinks.choices(choices))
89232               .call(noteComments.note(_note))
89233               .call(noteSaveSection);
89234
89235
89236           var footer = selection.selectAll('.footer')
89237               .data([0]);
89238
89239           footer.enter()
89240               .append('div')
89241               .attr('class', 'footer')
89242               .merge(footer)
89243               .call(uiViewOnOSM(context).what(_note))
89244               .call(uiNoteReport(context).note(_note));
89245
89246
89247           // rerender the note editor on any auth change
89248           var osm = services.osm;
89249           if (osm) {
89250               osm.on('change.note-save', function() {
89251                   selection.call(noteEditor);
89252               });
89253           }
89254       }
89255
89256
89257       function noteSaveSection(selection) {
89258           var isSelected = (_note && _note.id === context.selectedNoteID());
89259           var noteSave = selection.selectAll('.note-save')
89260               .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
89261
89262           // exit
89263           noteSave.exit()
89264               .remove();
89265
89266           // enter
89267           var noteSaveEnter = noteSave.enter()
89268               .append('div')
89269               .attr('class', 'note-save save-section cf');
89270
89271           // // if new note, show categories to pick from
89272           // if (_note.isNew()) {
89273           //     var presets = context.presets();
89274
89275           //     // NOTE: this key isn't a age and therefore there is no documentation (yet)
89276           //     _fieldsArr = [
89277           //         uiField(context, presets.field('category'), null, { show: true, revert: false }),
89278           //     ];
89279
89280           //     _fieldsArr.forEach(function(field) {
89281           //         field
89282           //             .on('change', changeCategory);
89283           //     });
89284
89285           //     noteSaveEnter
89286           //         .append('div')
89287           //         .attr('class', 'note-category')
89288           //         .call(formFields.fieldsArr(_fieldsArr));
89289           // }
89290
89291           // function changeCategory() {
89292           //     // NOTE: perhaps there is a better way to get value
89293           //     var val = d3_select('input[name=\'category\']:checked').property('__data__') || undefined;
89294
89295           //     // store the unsaved category with the note itself
89296           //     _note = _note.update({ newCategory: val });
89297           //     var osm = services.osm;
89298           //     if (osm) {
89299           //         osm.replaceNote(_note);  // update note cache
89300           //     }
89301           //     noteSave
89302           //         .call(noteSaveButtons);
89303           // }
89304
89305           noteSaveEnter
89306               .append('h4')
89307               .attr('class', '.note-save-header')
89308               .text(function() {
89309                   return _note.isNew() ? t('note.newDescription') : t('note.newComment');
89310               });
89311
89312           noteSaveEnter
89313               .append('textarea')
89314               .attr('class', 'new-comment-input')
89315               .attr('placeholder', t('note.inputPlaceholder'))
89316               .attr('maxlength', 1000)
89317               .property('value', function(d) { return d.newComment; })
89318               .call(utilNoAuto)
89319               .on('keydown.note-input', keydown)
89320               .on('input.note-input', changeInput)
89321               .on('blur.note-input', changeInput);
89322
89323           // update
89324           noteSave = noteSaveEnter
89325               .merge(noteSave)
89326               .call(userDetails)
89327               .call(noteSaveButtons);
89328
89329
89330           // fast submit if user presses cmd+enter
89331           function keydown() {
89332               if (!(event.keyCode === 13 && event.metaKey)) return;
89333
89334               var osm = services.osm;
89335               if (!osm) return;
89336
89337               var hasAuth = osm.authenticated();
89338               if (!hasAuth) return;
89339
89340               if (!_note.newComment) return;
89341
89342               event.preventDefault();
89343
89344               select(this)
89345                   .on('keydown.note-input', null);
89346
89347               // focus on button and submit
89348               window.setTimeout(function() {
89349                   if (_note.isNew()) {
89350                       noteSave.selectAll('.save-button').node().focus();
89351                       clickSave(_note);
89352                   } else  {
89353                       noteSave.selectAll('.comment-button').node().focus();
89354                       clickComment(_note);
89355                   }
89356               }, 10);
89357           }
89358
89359
89360           function changeInput() {
89361               var input = select(this);
89362               var val = input.property('value').trim() || undefined;
89363
89364               // store the unsaved comment with the note itself
89365               _note = _note.update({ newComment: val });
89366
89367               var osm = services.osm;
89368               if (osm) {
89369                   osm.replaceNote(_note);  // update note cache
89370               }
89371
89372               noteSave
89373                   .call(noteSaveButtons);
89374           }
89375       }
89376
89377
89378       function userDetails(selection) {
89379           var detailSection = selection.selectAll('.detail-section')
89380               .data([0]);
89381
89382           detailSection = detailSection.enter()
89383               .append('div')
89384               .attr('class', 'detail-section')
89385               .merge(detailSection);
89386
89387           var osm = services.osm;
89388           if (!osm) return;
89389
89390           // Add warning if user is not logged in
89391           var hasAuth = osm.authenticated();
89392           var authWarning = detailSection.selectAll('.auth-warning')
89393               .data(hasAuth ? [] : [0]);
89394
89395           authWarning.exit()
89396               .transition()
89397               .duration(200)
89398               .style('opacity', 0)
89399               .remove();
89400
89401           var authEnter = authWarning.enter()
89402               .insert('div', '.tag-reference-body')
89403               .attr('class', 'field-warning auth-warning')
89404               .style('opacity', 0);
89405
89406           authEnter
89407               .call(svgIcon('#iD-icon-alert', 'inline'));
89408
89409           authEnter
89410               .append('span')
89411               .text(t('note.login'));
89412
89413           authEnter
89414               .append('a')
89415               .attr('target', '_blank')
89416               .call(svgIcon('#iD-icon-out-link', 'inline'))
89417               .append('span')
89418               .text(t('login'))
89419               .on('click.note-login', function() {
89420                   event.preventDefault();
89421                   osm.authenticate();
89422               });
89423
89424           authEnter
89425               .transition()
89426               .duration(200)
89427               .style('opacity', 1);
89428
89429
89430           var prose = detailSection.selectAll('.note-save-prose')
89431               .data(hasAuth ? [0] : []);
89432
89433           prose.exit()
89434               .remove();
89435
89436           prose = prose.enter()
89437               .append('p')
89438               .attr('class', 'note-save-prose')
89439               .text(t('note.upload_explanation'))
89440               .merge(prose);
89441
89442           osm.userDetails(function(err, user) {
89443               if (err) return;
89444
89445               var userLink = select(document.createElement('div'));
89446
89447               if (user.image_url) {
89448                   userLink
89449                       .append('img')
89450                       .attr('src', user.image_url)
89451                       .attr('class', 'icon pre-text user-icon');
89452               }
89453
89454               userLink
89455                   .append('a')
89456                   .attr('class', 'user-info')
89457                   .text(user.display_name)
89458                   .attr('href', osm.userURL(user.display_name))
89459                   .attr('tabindex', -1)
89460                   .attr('target', '_blank');
89461
89462               prose
89463                   .html(t('note.upload_explanation_with_user', { user: userLink.html() }));
89464           });
89465       }
89466
89467
89468       function noteSaveButtons(selection) {
89469           var osm = services.osm;
89470           var hasAuth = osm && osm.authenticated();
89471
89472           var isSelected = (_note && _note.id === context.selectedNoteID());
89473           var buttonSection = selection.selectAll('.buttons')
89474               .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
89475
89476           // exit
89477           buttonSection.exit()
89478               .remove();
89479
89480           // enter
89481           var buttonEnter = buttonSection.enter()
89482               .append('div')
89483               .attr('class', 'buttons');
89484
89485           if (_note.isNew()) {
89486               buttonEnter
89487                   .append('button')
89488                   .attr('class', 'button cancel-button secondary-action')
89489                   .text(t('confirm.cancel'));
89490
89491               buttonEnter
89492                   .append('button')
89493                   .attr('class', 'button save-button action')
89494                   .text(t('note.save'));
89495
89496           } else {
89497               buttonEnter
89498                   .append('button')
89499                   .attr('class', 'button status-button action');
89500
89501               buttonEnter
89502                   .append('button')
89503                   .attr('class', 'button comment-button action')
89504                   .text(t('note.comment'));
89505           }
89506
89507
89508           // update
89509           buttonSection = buttonSection
89510               .merge(buttonEnter);
89511
89512           buttonSection.select('.cancel-button')   // select and propagate data
89513               .on('click.cancel', clickCancel);
89514
89515           buttonSection.select('.save-button')     // select and propagate data
89516               .attr('disabled', isSaveDisabled)
89517               .on('click.save', clickSave);
89518
89519           buttonSection.select('.status-button')   // select and propagate data
89520               .attr('disabled', (hasAuth ? null : true))
89521               .text(function(d) {
89522                   var action = (d.status === 'open' ? 'close' : 'open');
89523                   var andComment = (d.newComment ? '_comment' : '');
89524                   return t('note.' + action + andComment);
89525               })
89526               .on('click.status', clickStatus);
89527
89528           buttonSection.select('.comment-button')   // select and propagate data
89529               .attr('disabled', isSaveDisabled)
89530               .on('click.comment', clickComment);
89531
89532
89533           function isSaveDisabled(d) {
89534               return (hasAuth && d.status === 'open' && d.newComment) ? null : true;
89535           }
89536       }
89537
89538
89539
89540       function clickCancel(d) {
89541           this.blur();    // avoid keeping focus on the button - #4641
89542           var osm = services.osm;
89543           if (osm) {
89544               osm.removeNote(d);
89545           }
89546           context.enter(modeBrowse(context));
89547           dispatch$1.call('change');
89548       }
89549
89550
89551       function clickSave(d) {
89552           this.blur();    // avoid keeping focus on the button - #4641
89553           var osm = services.osm;
89554           if (osm) {
89555               osm.postNoteCreate(d, function(err, note) {
89556                   dispatch$1.call('change', note);
89557               });
89558           }
89559       }
89560
89561
89562       function clickStatus(d) {
89563           this.blur();    // avoid keeping focus on the button - #4641
89564           var osm = services.osm;
89565           if (osm) {
89566               var setStatus = (d.status === 'open' ? 'closed' : 'open');
89567               osm.postNoteUpdate(d, setStatus, function(err, note) {
89568                   dispatch$1.call('change', note);
89569               });
89570           }
89571       }
89572
89573       function clickComment(d) {
89574           this.blur();    // avoid keeping focus on the button - #4641
89575           var osm = services.osm;
89576           if (osm) {
89577               osm.postNoteUpdate(d, d.status, function(err, note) {
89578                   dispatch$1.call('change', note);
89579               });
89580           }
89581       }
89582
89583
89584       noteEditor.note = function(val) {
89585           if (!arguments.length) return _note;
89586           _note = val;
89587           return noteEditor;
89588       };
89589
89590
89591       return utilRebind(noteEditor, dispatch$1, 'on');
89592   }
89593
89594   function uiNoteHeader() {
89595       var _note;
89596
89597
89598       function noteHeader(selection) {
89599           var header = selection.selectAll('.note-header')
89600               .data(
89601                   (_note ? [_note] : []),
89602                   function(d) { return d.status + d.id; }
89603               );
89604
89605           header.exit()
89606               .remove();
89607
89608           var headerEnter = header.enter()
89609               .append('div')
89610               .attr('class', 'note-header');
89611
89612           var iconEnter = headerEnter
89613               .append('div')
89614               .attr('class', function(d) { return 'note-header-icon ' + d.status; })
89615               .classed('new', function(d) { return d.id < 0; });
89616
89617           iconEnter
89618               .append('div')
89619               .attr('class', 'preset-icon-28')
89620               .call(svgIcon('#iD-icon-note', 'note-fill'));
89621
89622           iconEnter.each(function(d) {
89623               var statusIcon = '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
89624               iconEnter
89625                   .append('div')
89626                   .attr('class', 'note-icon-annotation')
89627                   .call(svgIcon(statusIcon, 'icon-annotation'));
89628           });
89629
89630           headerEnter
89631               .append('div')
89632               .attr('class', 'note-header-label')
89633               .text(function(d) {
89634                   if (_note.isNew()) { return t('note.new'); }
89635                   return t('note.note') + ' ' + d.id + ' ' +
89636                       (d.status === 'closed' ? t('note.closed') : '');
89637               });
89638       }
89639
89640
89641       noteHeader.note = function(val) {
89642           if (!arguments.length) return _note;
89643           _note = val;
89644           return noteHeader;
89645       };
89646
89647
89648       return noteHeader;
89649   }
89650
89651   function uiNoteReport() {
89652       var _note;
89653
89654       function noteReport(selection) {
89655           var url;
89656           if (services.osm && (_note instanceof osmNote) && (!_note.isNew())) {
89657               url = services.osm.noteReportURL(_note);
89658           }
89659
89660           var link = selection.selectAll('.note-report')
89661               .data(url ? [url] : []);
89662
89663           // exit
89664           link.exit()
89665               .remove();
89666
89667           // enter
89668           var linkEnter = link.enter()
89669               .append('a')
89670               .attr('class', 'note-report')
89671               .attr('target', '_blank')
89672               .attr('href', function(d) { return d; })
89673               .call(svgIcon('#iD-icon-out-link', 'inline'));
89674
89675           linkEnter
89676               .append('span')
89677               .text(t('note.report'));
89678       }
89679
89680
89681       noteReport.note = function(val) {
89682           if (!arguments.length) return _note;
89683           _note = val;
89684           return noteReport;
89685       };
89686
89687       return noteReport;
89688   }
89689
89690   function uiRadialMenu(context, operations) {
89691       var menu;
89692       var center = [0, 0];
89693       var tooltip;
89694
89695
89696       var radialMenu = function(selection) {
89697           if (!operations.length) return;
89698
89699           selection.node().parentNode.focus();
89700
89701           function click(operation) {
89702               event.stopPropagation();
89703               if (operation.disabled()) return;
89704               operation();
89705               radialMenu.close();
89706           }
89707
89708           menu = selection
89709               .append('g')
89710               .attr('class', 'radial-menu')
89711               .attr('transform', 'translate(' + center + ')')
89712               .attr('opacity', 0);
89713
89714           menu
89715               .transition()
89716               .attr('opacity', 1);
89717
89718           var r = 50;
89719           var a = Math.PI / 4;
89720           var a0 = -Math.PI / 4;
89721           var a1 = a0 + (operations.length - 1) * a;
89722
89723           menu
89724               .append('path')
89725               .attr('class', 'radial-menu-background')
89726               .attr('d', 'M' + r * Math.sin(a0) + ',' +
89727                                r * Math.cos(a0) +
89728                         ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
89729                                (r * Math.sin(a1) + 1e-3) + ',' +
89730                                (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
89731               .attr('stroke-width', 50)
89732               .attr('stroke-linecap', 'round');
89733
89734           var button = menu.selectAll()
89735               .data(operations)
89736               .enter()
89737               .append('g')
89738               .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
89739               .classed('disabled', function(d) { return d.disabled(); })
89740               .attr('transform', function(d, i) {
89741                   return 'translate(' + geoVecFloor([
89742                           r * Math.sin(a0 + i * a),
89743                           r * Math.cos(a0 + i * a)]).join(',') + ')';
89744               });
89745
89746           button
89747               .append('circle')
89748               .attr('r', 15)
89749               .on('click', click)
89750               .on('mousedown', mousedown)
89751               .on('mouseover', mouseover)
89752               .on('mouseout', mouseout);
89753
89754           button
89755               .append('use')
89756               .attr('transform', 'translate(-10,-10)')
89757               .attr('width', '20')
89758               .attr('height', '20')
89759               .attr('xlink:href', function(d) { return '#iD-operation-' + d.id; });
89760
89761           tooltip = select(document.body)
89762               .append('div')
89763               .attr('class', 'tooltip-inner radial-menu-tooltip');
89764
89765           function mousedown() {
89766               event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
89767           }
89768
89769           function mouseover(d, i) {
89770               var rect = context.surfaceRect();
89771               var angle = a0 + i * a;
89772               var top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px';
89773               var left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px';
89774               var bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px';
89775               var right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
89776
89777               tooltip
89778                   .style('top', null)
89779                   .style('left', null)
89780                   .style('bottom', null)
89781                   .style('right', null)
89782                   .style('display', 'block')
89783                   .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
89784
89785               if (i === 0) {
89786                   tooltip
89787                       .style('right', right)
89788                       .style('top', top);
89789               } else if (i >= 4) {
89790                   tooltip
89791                       .style('left', left)
89792                       .style('bottom', bottom);
89793               } else {
89794                   tooltip
89795                       .style('left', left)
89796                       .style('top', top);
89797               }
89798           }
89799
89800           function mouseout() {
89801               tooltip.style('display', 'none');
89802           }
89803       };
89804
89805
89806       radialMenu.close = function() {
89807           if (menu) {
89808               menu
89809                   .style('pointer-events', 'none')
89810                   .transition()
89811                   .attr('opacity', 0)
89812                   .remove();
89813           }
89814
89815           if (tooltip) {
89816               tooltip.remove();
89817           }
89818       };
89819
89820
89821       radialMenu.center = function(_) {
89822           if (!arguments.length) return center;
89823           center = _;
89824           return radialMenu;
89825       };
89826
89827
89828       return radialMenu;
89829   }
89830
89831   function uiSelectionList(context, selectedIDs) {
89832
89833       function selectEntity(entity) {
89834           context.enter(modeSelect(context, [entity.id]));
89835       }
89836
89837
89838       function deselectEntity(entity) {
89839           event.stopPropagation();
89840           var index = selectedIDs.indexOf(entity.id);
89841           if (index > -1) {
89842               selectedIDs.splice(index, 1);
89843           }
89844           context.enter(modeSelect(context, selectedIDs));
89845       }
89846
89847
89848       function selectionList(selection) {
89849           selection.classed('selection-list-pane', true);
89850
89851           var header = selection
89852               .append('div')
89853               .attr('class', 'header fillL cf');
89854
89855           header
89856               .append('h3')
89857               .text(t('inspector.multiselect'));
89858
89859           var listWrap = selection
89860               .append('div')
89861               .attr('class', 'inspector-body');
89862
89863           var list = listWrap
89864               .append('div')
89865               .attr('class', 'feature-list cf');
89866
89867           context.history().on('change.selection-list', drawList);
89868           drawList();
89869
89870
89871           function drawList() {
89872               var entities = selectedIDs
89873                   .map(function(id) { return context.hasEntity(id); })
89874                   .filter(function(entity) { return entity; });
89875
89876               var items = list.selectAll('.feature-list-item')
89877                   .data(entities, osmEntity.key);
89878
89879               items.exit()
89880                   .remove();
89881
89882               // Enter
89883               var enter = items.enter()
89884                   .append('div')
89885                   .attr('class', 'feature-list-item')
89886                   .on('click', selectEntity);
89887
89888               enter
89889                   .each(function(d) {
89890                       select(this).on('mouseover', function() {
89891                           utilHighlightEntities([d.id], true, context);
89892                       });
89893                       select(this).on('mouseout', function() {
89894                           utilHighlightEntities([d.id], false, context);
89895                       });
89896                   });
89897
89898               var label = enter
89899                   .append('button')
89900                   .attr('class', 'label');
89901
89902               enter
89903                   .append('button')
89904                   .attr('class', 'close')
89905                   .on('click', deselectEntity)
89906                   .call(svgIcon('#iD-icon-close'));
89907
89908               label
89909                   .append('span')
89910                   .attr('class', 'entity-geom-icon')
89911                   .call(svgIcon('', 'pre-text'));
89912
89913               label
89914                   .append('span')
89915                   .attr('class', 'entity-type');
89916
89917               label
89918                   .append('span')
89919                   .attr('class', 'entity-name');
89920
89921               // Update
89922               items = items.merge(enter);
89923
89924               items.selectAll('.entity-geom-icon use')
89925                   .attr('href', function() {
89926                       var entity = this.parentNode.parentNode.__data__;
89927                       return '#iD-icon-' + context.geometry(entity.id);
89928                   });
89929
89930               items.selectAll('.entity-type')
89931                   .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
89932
89933               items.selectAll('.entity-name')
89934                   .text(function(entity) { return utilDisplayName(entity); });
89935           }
89936       }
89937
89938       return selectionList;
89939   }
89940
89941   function uiSourceSwitch(context) {
89942       var keys;
89943
89944
89945       function click() {
89946           event.preventDefault();
89947
89948           var osm = context.connection();
89949           if (!osm) return;
89950
89951           if (context.inIntro()) return;
89952
89953           if (context.history().hasChanges() &&
89954               !window.confirm(t('source_switch.lose_changes'))) return;
89955
89956           var isLive = select(this)
89957               .classed('live');
89958
89959           isLive = !isLive;
89960           context.enter(modeBrowse(context));
89961           context.history().clearSaved();          // remove saved history
89962           context.flush();                         // remove stored data
89963
89964           select(this)
89965               .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
89966               .classed('live', isLive);
89967
89968           osm.switch(isLive ? keys[0] : keys[1]);  // switch connection (warning: dispatches 'change' event)
89969       }
89970
89971       var sourceSwitch = function(selection) {
89972           selection
89973               .append('a')
89974               .attr('href', '#')
89975               .text(t('source_switch.live'))
89976               .classed('live', true)
89977               .attr('tabindex', -1)
89978               .on('click', click);
89979       };
89980
89981
89982       sourceSwitch.keys = function(_) {
89983           if (!arguments.length) return keys;
89984           keys = _;
89985           return sourceSwitch;
89986       };
89987
89988
89989       return sourceSwitch;
89990   }
89991
89992   function uiSuccess(context) {
89993       var MAXEVENTS = 2;
89994
89995       // All else being equal, rank more "social" communities higher
89996       // (anything not in this list receives no adjustment)
89997       var COMMUNITYRANK = {
89998           'meetup': +5,
89999           'slack': +4,
90000           'facebook': +3,
90001           'reddit': +2,
90002           'forum': -2,
90003           'mailinglist': -3,
90004           'irc': -4
90005       };
90006
90007       var detected = utilDetect();
90008       var dispatch$1 = dispatch('cancel');
90009       var _changeset;
90010       var _location;
90011
90012
90013       // string-to-date parsing in JavaScript is weird
90014       function parseEventDate(when) {
90015           if (!when) return;
90016
90017           var raw = when.trim();
90018           if (!raw) return;
90019
90020           if (!/Z$/.test(raw)) {    // if no trailing 'Z', add one
90021               raw += 'Z';           // this forces date to be parsed as a UTC date
90022           }
90023
90024           var parsed = new Date(raw);
90025           return new Date(parsed.toUTCString().substr(0, 25));  // convert to local timezone
90026       }
90027
90028
90029       function success(selection) {
90030           var header = selection
90031               .append('div')
90032               .attr('class', 'header fillL');
90033
90034           header
90035               .append('button')
90036               .attr('class', 'fr')
90037               .on('click', function() { dispatch$1.call('cancel'); })
90038               .call(svgIcon('#iD-icon-close'));
90039
90040           header
90041               .append('h3')
90042               .text(t('success.just_edited'));
90043
90044           var body = selection
90045               .append('div')
90046               .attr('class', 'body save-success fillL');
90047
90048           var summary = body
90049               .append('div')
90050               .attr('class', 'save-summary');
90051
90052           summary
90053               .append('h3')
90054               .text(t('success.thank_you' + (_location ? '_location' : ''), { where: _location }));
90055
90056           summary
90057               .append('p')
90058               .text(t('success.help_html'))
90059               .append('a')
90060               .attr('class', 'link-out')
90061               .attr('target', '_blank')
90062               .attr('tabindex', -1)
90063               .attr('href', t('success.help_link_url'))
90064               .call(svgIcon('#iD-icon-out-link', 'inline'))
90065               .append('span')
90066               .text(t('success.help_link_text'));
90067
90068           var osm = context.connection();
90069           if (!osm) return;
90070
90071           var changesetURL = osm.changesetURL(_changeset.id);
90072
90073           var table = summary
90074               .append('table')
90075               .attr('class', 'summary-table');
90076
90077           var row = table
90078               .append('tr')
90079               .attr('class', 'summary-row');
90080
90081           row
90082               .append('td')
90083               .attr('class', 'cell-icon summary-icon')
90084               .append('a')
90085               .attr('target', '_blank')
90086               .attr('href', changesetURL)
90087               .append('svg')
90088               .attr('class', 'logo-small')
90089               .append('use')
90090               .attr('xlink:href', '#iD-logo-osm');
90091
90092           var summaryDetail = row
90093               .append('td')
90094               .attr('class', 'cell-detail summary-detail');
90095
90096           summaryDetail
90097               .append('a')
90098               .attr('class', 'cell-detail summary-view-on-osm')
90099               .attr('target', '_blank')
90100               .attr('href', changesetURL)
90101               .text(t('success.view_on_osm'));
90102
90103           summaryDetail
90104               .append('div')
90105               .text(t('success.changeset_id', { changeset_id: _changeset.id }));
90106
90107
90108           // Gather community polygon IDs intersecting the map..
90109           var matchFeatures = data.community.query(context.map().center(), true) || [];
90110           var matchIDs = matchFeatures.map(function(feature) { return feature.id; });
90111
90112           // Gather community resources that are either global or match a polygon.
90113           var matchResources = filter(data.community.resources, function(v) {
90114               return !v.featureId || matchIDs.indexOf(v.featureId) !== -1;
90115           });
90116
90117           if (matchResources.length) {
90118               // sort by size ascending, then by community rank
90119               matchResources.sort(function(a, b) {
90120                   var aSize = Infinity;
90121                   var bSize = Infinity;
90122                   var aRank = COMMUNITYRANK[a.type] || 0;
90123                   var bRank = COMMUNITYRANK[b.type] || 0;
90124
90125                   if (a.featureId) {
90126                       aSize = data.community.features[a.featureId].properties.area;
90127                   }
90128                   if (b.featureId) {
90129                       bSize = data.community.features[b.featureId].properties.area;
90130                   }
90131
90132                   return aSize < bSize ? -1 : aSize > bSize ? 1 : bRank - aRank;
90133               });
90134
90135               body
90136                   .call(showCommunityLinks, matchResources);
90137           }
90138       }
90139
90140
90141       function showCommunityLinks(selection, matchResources) {
90142           var communityLinks = selection
90143               .append('div')
90144               .attr('class', 'save-communityLinks');
90145
90146           communityLinks
90147               .append('h3')
90148               .text(t('success.like_osm'));
90149
90150           var table = communityLinks
90151               .append('table')
90152               .attr('class', 'community-table');
90153
90154           var row = table.selectAll('.community-row')
90155               .data(matchResources);
90156
90157           var rowEnter = row.enter()
90158               .append('tr')
90159               .attr('class', 'community-row');
90160
90161           rowEnter
90162               .append('td')
90163               .attr('class', 'cell-icon community-icon')
90164               .append('a')
90165               .attr('target', '_blank')
90166               .attr('href', function(d) { return d.url; })
90167               .append('svg')
90168               .attr('class', 'logo-small')
90169               .append('use')
90170               .attr('xlink:href', function(d) { return '#community-' + d.type; });
90171
90172           var communityDetail = rowEnter
90173               .append('td')
90174               .attr('class', 'cell-detail community-detail');
90175
90176           communityDetail
90177               .each(showCommunityDetails);
90178
90179           communityLinks
90180               .append('div')
90181               .attr('class', 'community-missing')
90182               .text(t('success.missing'))
90183               .append('a')
90184               .attr('class', 'link-out')
90185               .attr('target', '_blank')
90186               .attr('tabindex', -1)
90187               .call(svgIcon('#iD-icon-out-link', 'inline'))
90188               .attr('href', 'https://github.com/osmlab/osm-community-index/issues')
90189               .append('span')
90190               .text(t('success.tell_us'));
90191       }
90192
90193
90194       function showCommunityDetails(d) {
90195           var selection = select(this);
90196           var communityID = d.id;
90197           var replacements = {
90198               url: linkify(d.url),
90199               signupUrl: linkify(d.signupUrl || d.url)
90200           };
90201
90202           selection
90203               .append('div')
90204               .attr('class', 'community-name')
90205               .append('a')
90206               .attr('target', '_blank')
90207               .attr('href', d.url)
90208               .text(t('community.' + d.id + '.name'));
90209
90210           var descriptionHTML = t('community.' + d.id + '.description', replacements);
90211
90212           if (d.type === 'reddit') {   // linkify subreddits  #4997
90213               descriptionHTML = descriptionHTML
90214                   .replace(/(\/r\/\w*\/*)/i, function(match) { return linkify(d.url, match); });
90215           }
90216
90217           selection
90218               .append('div')
90219               .attr('class', 'community-description')
90220               .html(descriptionHTML);
90221
90222           if (d.extendedDescription || (d.languageCodes && d.languageCodes.length)) {
90223               selection
90224                   .append('div')
90225                   .call(uiDisclosure(context, 'community-more-' + d.id, false)
90226                       .expanded(false)
90227                       .updatePreference(false)
90228                       .title(t('success.more'))
90229                       .content(showMore)
90230                   );
90231           }
90232
90233           var nextEvents = (d.events || [])
90234               .map(function(event) {
90235                   event.date = parseEventDate(event.when);
90236                   return event;
90237               })
90238               .filter(function(event) {               // date is valid and future (or today)
90239                   var t = event.date.getTime();
90240                   var now = (new Date()).setHours(0,0,0,0);
90241                   return !isNaN(t) && t >= now;
90242               })
90243               .sort(function(a, b) {                  // sort by date ascending
90244                   return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
90245               })
90246               .slice(0, MAXEVENTS);                   // limit number of events shown
90247
90248           if (nextEvents.length) {
90249               selection
90250                   .append('div')
90251                   .call(uiDisclosure(context, 'community-events-' + d.id, false)
90252                       .expanded(false)
90253                       .updatePreference(false)
90254                       .title(t('success.events'))
90255                       .content(showNextEvents)
90256                   )
90257                   .select('.hide-toggle')
90258                   .append('span')
90259                   .attr('class', 'badge-text')
90260                   .text(nextEvents.length);
90261           }
90262
90263
90264           function showMore(selection) {
90265               var more = selection
90266                   .append('div')
90267                   .attr('class', 'community-more');
90268
90269               if (d.extendedDescription) {
90270                   more
90271                       .append('div')
90272                       .attr('class', 'community-extended-description')
90273                       .html(t('community.' + d.id + '.extendedDescription', replacements));
90274               }
90275
90276               if (d.languageCodes && d.languageCodes.length) {
90277                   more
90278                       .append('div')
90279                       .attr('class', 'community-languages')
90280                       .text(t('success.languages', { languages: d.languageCodes.join(', ') }));
90281               }
90282           }
90283
90284
90285           function showNextEvents(selection) {
90286               var events = selection
90287                   .append('div')
90288                   .attr('class', 'community-events');
90289
90290               var item = events.selectAll('.community-event')
90291                   .data(nextEvents);
90292
90293               var itemEnter = item.enter()
90294                   .append('div')
90295                   .attr('class', 'community-event');
90296
90297               itemEnter
90298                   .append('div')
90299                   .attr('class', 'community-event-name')
90300                   .append('a')
90301                   .attr('target', '_blank')
90302                   .attr('href', function(d) { return d.url; })
90303                   .text(function(d) {
90304                       var name = d.name;
90305                       if (d.i18n && d.id) {
90306                           name = t('community.' + communityID + '.events.' + d.id + '.name', { default: name });
90307                       }
90308                       return name;
90309                   });
90310
90311               itemEnter
90312                   .append('div')
90313                   .attr('class', 'community-event-when')
90314                   .text(function(d) {
90315                       var options = {
90316                           weekday: 'short', day: 'numeric', month: 'short', year: 'numeric'
90317                       };
90318                       if (d.date.getHours() || d.date.getMinutes()) {   // include time if it has one
90319                           options.hour = 'numeric';
90320                           options.minute = 'numeric';
90321                       }
90322                       return d.date.toLocaleString(detected.locale, options);
90323                   });
90324
90325               itemEnter
90326                   .append('div')
90327                   .attr('class', 'community-event-where')
90328                   .text(function(d) {
90329                       var where = d.where;
90330                       if (d.i18n && d.id) {
90331                           where = t('community.' + communityID + '.events.' + d.id + '.where', { default: where });
90332                       }
90333                       return where;
90334                   });
90335
90336               itemEnter
90337                   .append('div')
90338                   .attr('class', 'community-event-description')
90339                   .text(function(d) {
90340                       var description = d.description;
90341                       if (d.i18n && d.id) {
90342                           description = t('community.' + communityID + '.events.' + d.id + '.description', { default: description });
90343                       }
90344                       return description;
90345                   });
90346           }
90347
90348
90349           function linkify(url, text) {
90350               text = text || url;
90351               return '<a target="_blank" href="' + url + '">' + text + '</a>';
90352           }
90353       }
90354
90355
90356       success.changeset = function(_) {
90357           if (!arguments.length) return _changeset;
90358           _changeset = _;
90359           return success;
90360       };
90361
90362
90363       success.location = function(_) {
90364           if (!arguments.length) return _location;
90365           _location = _;
90366           return success;
90367       };
90368
90369
90370       return utilRebind(success, dispatch$1, 'on');
90371   }
90372
90373   function uiViewOnKeepRight() {
90374       var _error;   // a keepright error
90375
90376
90377       function viewOnKeepRight(selection) {
90378           var url;
90379           if (services.keepRight && (_error instanceof qaError)) {
90380               url = services.keepRight.errorURL(_error);
90381           }
90382
90383           var link = selection.selectAll('.view-on-keepRight')
90384               .data(url ? [url] : []);
90385
90386           // exit
90387           link.exit()
90388               .remove();
90389
90390           // enter
90391           var linkEnter = link.enter()
90392               .append('a')
90393               .attr('class', 'view-on-keepRight')
90394               .attr('target', '_blank')
90395               .attr('href', function(d) { return d; })
90396               .call(svgIcon('#iD-icon-out-link', 'inline'));
90397
90398           linkEnter
90399               .append('span')
90400               .text(t('inspector.view_on_keepRight'));
90401       }
90402
90403
90404       viewOnKeepRight.what = function(val) {
90405           if (!arguments.length) return _error;
90406           _error = val;
90407           return viewOnKeepRight;
90408       };
90409
90410       return viewOnKeepRight;
90411   }
90412
90413   function coreHistory(context) {
90414       var dispatch$1 = dispatch('change', 'annotatedChange', 'merge', 'restore', 'undone', 'redone');
90415       var lock = utilSessionMutex('lock');
90416       var duration = 150;
90417       var _imageryUsed = [];
90418       var _checkpoints = {};
90419       var _stack;
90420       var _index;
90421       var _tree;
90422
90423
90424       // internal _act, accepts list of actions and eased time
90425       function _act(actions, t) {
90426           actions = Array.prototype.slice.call(actions);
90427
90428           var annotation;
90429           if (!isFunction(actions[actions.length - 1])) {
90430               annotation = actions.pop();
90431           }
90432
90433           var graph = _stack[_index].graph;
90434           for (var i = 0; i < actions.length; i++) {
90435               graph = actions[i](graph, t);
90436           }
90437
90438           return {
90439               graph: graph,
90440               annotation: annotation,
90441               imageryUsed: _imageryUsed,
90442               transform: context.projection.transform(),
90443               selectedIDs: context.selectedIDs()
90444           };
90445       }
90446
90447
90448       // internal _perform with eased time
90449       function _perform(args, t) {
90450           var previous = _stack[_index].graph;
90451           _stack = _stack.slice(0, _index + 1);
90452           var actionResult = _act(args, t);
90453           _stack.push(actionResult);
90454           _index++;
90455           return change(previous, actionResult.annotation);
90456       }
90457
90458
90459       // internal _replace with eased time
90460       function _replace(args, t) {
90461           var previous = _stack[_index].graph;
90462           // assert(_index == _stack.length - 1)
90463           var actionResult = _act(args, t);
90464           _stack[_index] = actionResult;
90465           return change(previous, actionResult.annotation);
90466       }
90467
90468
90469       // internal _overwrite with eased time
90470       function _overwrite(args, t) {
90471           var previous = _stack[_index].graph;
90472           if (_index > 0) {
90473               _index--;
90474               _stack.pop();
90475           }
90476           _stack = _stack.slice(0, _index + 1);
90477           var actionResult = _act(args, t);
90478           _stack.push(actionResult);
90479           _index++;
90480           return change(previous, actionResult.annotation);
90481       }
90482
90483
90484       // determine difference and dispatch a change event
90485       function change(previous, isAnnotated) {
90486           var difference = coreDifference(previous, history.graph());
90487           dispatch$1.call('change', this, difference);
90488           if (isAnnotated) {
90489               // actions like dragging a node can fire lots of changes,
90490               // so use 'annotatedChange' to listen for grouped undo/redo changes
90491               dispatch$1.call('annotatedChange', this, difference);
90492           }
90493           return difference;
90494       }
90495
90496
90497       // iD uses namespaced keys so multiple installations do not conflict
90498       function getKey(n) {
90499           return 'iD_' + window.location.origin + '_' + n;
90500       }
90501
90502
90503       var history = {
90504
90505           graph: function() {
90506               return _stack[_index].graph;
90507           },
90508
90509
90510           tree: function() {
90511               return _tree;
90512           },
90513
90514
90515           base: function() {
90516               return _stack[0].graph;
90517           },
90518
90519
90520           merge: function(entities, extent) {
90521               _stack[0].graph.rebase(entities, map$3(_stack, 'graph'), false);
90522               _tree.rebase(entities, false);
90523
90524               dispatch$1.call('change', this, undefined, extent);
90525               dispatch$1.call('merge', this, entities);
90526           },
90527
90528
90529           perform: function() {
90530               // complete any transition already in progress
90531               select(document).interrupt('history.perform');
90532
90533               var transitionable = false;
90534               var action0 = arguments[0];
90535
90536               if (arguments.length === 1 ||
90537                   arguments.length === 2 && !isFunction(arguments[1])) {
90538                   transitionable = !!action0.transitionable;
90539               }
90540
90541               if (transitionable) {
90542                   var origArguments = arguments;
90543                   select(document)
90544                       .transition('history.perform')
90545                       .duration(duration)
90546                       .ease(linear$1)
90547                       .tween('history.tween', function() {
90548                           return function(t) {
90549                               if (t < 1) _overwrite([action0], t);
90550                           };
90551                       })
90552                       .on('start', function() {
90553                           _perform([action0], 0);
90554                       })
90555                       .on('end interrupt', function() {
90556                           _overwrite(origArguments, 1);
90557                       });
90558
90559               } else {
90560                   return _perform(arguments);
90561               }
90562           },
90563
90564
90565           replace: function() {
90566               select(document).interrupt('history.perform');
90567               return _replace(arguments, 1);
90568           },
90569
90570
90571           // Same as calling pop and then perform
90572           overwrite: function() {
90573               select(document).interrupt('history.perform');
90574               return _overwrite(arguments, 1);
90575           },
90576
90577
90578           pop: function(n) {
90579               select(document).interrupt('history.perform');
90580
90581               var previous = _stack[_index].graph;
90582               if (isNaN(+n) || +n < 0) {
90583                   n = 1;
90584               }
90585               while (n-- > 0 && _index > 0) {
90586                   _index--;
90587                   _stack.pop();
90588               }
90589               return change(previous);
90590           },
90591
90592
90593           // Back to the previous annotated state or _index = 0.
90594           undo: function() {
90595               select(document).interrupt('history.perform');
90596
90597               var previous = _stack[_index].graph;
90598               while (_index > 0) {
90599                   _index--;
90600                   if (_stack[_index].annotation) break;
90601               }
90602
90603               dispatch$1.call('undone', this, _stack[_index]);
90604               return change(previous, true);
90605           },
90606
90607
90608           // Forward to the next annotated state.
90609           redo: function() {
90610               select(document).interrupt('history.perform');
90611
90612               var previous = _stack[_index].graph;
90613               var tryIndex = _index;
90614               while (tryIndex < _stack.length - 1) {
90615                   tryIndex++;
90616                   if (_stack[tryIndex].annotation) {
90617                       _index = tryIndex;
90618                       dispatch$1.call('redone', this, _stack[_index]);
90619                       break;
90620                   }
90621               }
90622
90623               return change(previous, true);
90624           },
90625
90626
90627           undoAnnotation: function() {
90628               var i = _index;
90629               while (i >= 0) {
90630                   if (_stack[i].annotation) return _stack[i].annotation;
90631                   i--;
90632               }
90633           },
90634
90635
90636           redoAnnotation: function() {
90637               var i = _index + 1;
90638               while (i <= _stack.length - 1) {
90639                   if (_stack[i].annotation) return _stack[i].annotation;
90640                   i++;
90641               }
90642           },
90643
90644
90645           intersects: function(extent) {
90646               return _tree.intersects(extent, _stack[_index].graph);
90647           },
90648
90649
90650           difference: function() {
90651               var base = _stack[0].graph;
90652               var head = _stack[_index].graph;
90653               return coreDifference(base, head);
90654           },
90655
90656
90657           changes: function(action) {
90658               var base = _stack[0].graph;
90659               var head = _stack[_index].graph;
90660
90661               if (action) {
90662                   head = action(head);
90663               }
90664
90665               var difference = coreDifference(base, head);
90666
90667               return {
90668                   modified: difference.modified(),
90669                   created: difference.created(),
90670                   deleted: difference.deleted()
90671               };
90672           },
90673
90674
90675           hasChanges: function() {
90676               return this.difference().length() > 0;
90677           },
90678
90679
90680           imageryUsed: function(sources) {
90681               if (sources) {
90682                   _imageryUsed = sources;
90683                   return history;
90684               } else {
90685                   var arr = map$3(_stack.slice(1, _index + 1), 'imageryUsed');
90686                   return without(uniq(flatten(arr)), 'Custom');
90687               }
90688           },
90689
90690
90691           // save the current history state
90692           checkpoint: function(key) {
90693               _checkpoints[key] = {
90694                   stack: cloneDeep(_stack),
90695                   index: _index
90696               };
90697               return history;
90698           },
90699
90700
90701           // restore history state to a given checkpoint or reset completely
90702           reset: function(key) {
90703               if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
90704                   _stack = cloneDeep(_checkpoints[key].stack);
90705                   _index = _checkpoints[key].index;
90706               } else {
90707                   _stack = [{graph: coreGraph()}];
90708                   _index = 0;
90709                   _tree = coreTree(_stack[0].graph);
90710                   _checkpoints = {};
90711               }
90712               dispatch$1.call('change');
90713               return history;
90714           },
90715
90716
90717           toIntroGraph: function() {
90718               var nextId = { n: 0, r: 0, w: 0 };
90719               var permIds = {};
90720               var graph = this.graph();
90721               var baseEntities = {};
90722
90723               // clone base entities..
90724               forEach(graph.base().entities, function(entity) {
90725                   var copy = cloneDeepWith(entity, customizer);
90726                   baseEntities[copy.id] = copy;
90727               });
90728
90729               // replace base entities with head entities..
90730               forEach(graph.entities, function(entity, id) {
90731                   if (entity) {
90732                       var copy = cloneDeepWith(entity, customizer);
90733                       baseEntities[copy.id] = copy;
90734                   } else {
90735                       delete baseEntities[id];
90736                   }
90737               });
90738
90739               // swap temporary for permanent ids..
90740               forEach(baseEntities, function(entity) {
90741                   if (Array.isArray(entity.nodes)) {
90742                       entity.nodes = entity.nodes.map(function(node) {
90743                           return permIds[node] || node;
90744                       });
90745                   }
90746                   if (Array.isArray(entity.members)) {
90747                       entity.members = entity.members.map(function(member) {
90748                           member.id = permIds[member.id] || member.id;
90749                           return member;
90750                       });
90751                   }
90752               });
90753
90754               return JSON.stringify({ dataIntroGraph: baseEntities });
90755
90756
90757               function customizer(src) {
90758                   var copy = omit(cloneDeep(src), ['type', 'user', 'v', 'version', 'visible']);
90759                   if (isEmpty(copy.tags)) {
90760                       delete copy.tags;
90761                   }
90762
90763                   if (Array.isArray(copy.loc)) {
90764                       copy.loc[0] = +copy.loc[0].toFixed(6);
90765                       copy.loc[1] = +copy.loc[1].toFixed(6);
90766                   }
90767
90768                   var match = src.id.match(/([nrw])-\d*/);  // temporary id
90769                   if (match !== null) {
90770                       var nrw = match[1], permId;
90771                       do { permId = nrw + (++nextId[nrw]); }
90772                       while (baseEntities.hasOwnProperty(permId));
90773
90774                       copy.id = permIds[src.id] = permId;
90775                   }
90776                   return copy;
90777               }
90778           },
90779
90780
90781           toJSON: function() {
90782               if (!this.hasChanges()) return;
90783
90784               var allEntities = {};
90785               var baseEntities = {};
90786               var base = _stack[0];
90787
90788               var s = _stack.map(function(i) {
90789                   var modified = [];
90790                   var deleted = [];
90791
90792                   forEach(i.graph.entities, function(entity, id) {
90793                       if (entity) {
90794                           var key = osmEntity.key(entity);
90795                           allEntities[key] = entity;
90796                           modified.push(key);
90797                       } else {
90798                           deleted.push(id);
90799                       }
90800
90801                       // make sure that the originals of changed or deleted entities get merged
90802                       // into the base of the _stack after restoring the data from JSON.
90803                       if (id in base.graph.entities) {
90804                           baseEntities[id] = base.graph.entities[id];
90805                       }
90806                       if (entity && entity.nodes) {
90807                           // get originals of pre-existing child nodes
90808                           forEach(entity.nodes, function(nodeId) {
90809                               if (nodeId in base.graph.entities) {
90810                                   baseEntities[nodeId] = base.graph.entities[nodeId];
90811                               }
90812                           });
90813                       }
90814                       // get originals of parent entities too
90815                       forEach(base.graph._parentWays[id], function(parentId) {
90816                           if (parentId in base.graph.entities) {
90817                               baseEntities[parentId] = base.graph.entities[parentId];
90818                           }
90819                       });
90820                   });
90821
90822                   var x = {};
90823
90824                   if (modified.length) x.modified = modified;
90825                   if (deleted.length) x.deleted = deleted;
90826                   if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
90827                   if (i.annotation) x.annotation = i.annotation;
90828                   if (i.transform) x.transform = i.transform;
90829                   if (i.selectedIDs) x.selectedIDs = i.selectedIDs;
90830
90831                   return x;
90832               });
90833
90834               return JSON.stringify({
90835                   version: 3,
90836                   entities: values$1(allEntities),
90837                   baseEntities: values$1(baseEntities),
90838                   stack: s,
90839                   nextIDs: osmEntity.id.next,
90840                   index: _index
90841               });
90842           },
90843
90844
90845           fromJSON: function(json, loadChildNodes) {
90846               var h = JSON.parse(json);
90847               var loadComplete = true;
90848
90849               osmEntity.id.next = h.nextIDs;
90850               _index = h.index;
90851
90852               if (h.version === 2 || h.version === 3) {
90853                   var allEntities = {};
90854
90855                   h.entities.forEach(function(entity) {
90856                       allEntities[osmEntity.key(entity)] = osmEntity(entity);
90857                   });
90858
90859                   if (h.version === 3) {
90860                       // This merges originals for changed entities into the base of
90861                       // the _stack even if the current _stack doesn't have them (for
90862                       // example when iD has been restarted in a different region)
90863                       var baseEntities = h.baseEntities.map(function(d) { return osmEntity(d); });
90864                       _stack[0].graph.rebase(baseEntities, map$3(_stack, 'graph'), true);
90865                       _tree.rebase(baseEntities, true);
90866
90867                       // When we restore a modified way, we also need to fetch any missing
90868                       // childnodes that would normally have been downloaded with it.. #2142
90869                       if (loadChildNodes) {
90870                           var osm = context.connection();
90871                           var nodes = flatten(uniq(map$3(filter(baseEntities, { type: 'way' }), 'nodes')));
90872                           var missing = reject(nodes, function(n) { return _stack[0].graph.hasEntity(n); });
90873
90874                           if (!isEmpty(missing) && osm) {
90875                               loadComplete = false;
90876                               context.redrawEnable(false);
90877
90878                               var loading = uiLoading(context).blocking(true);
90879                               context.container().call(loading);
90880
90881                               var childNodesLoaded = function(err, result) {
90882                                   if (!err) {
90883                                       var visible = groupBy(result.data, 'visible');
90884                                       if (!isEmpty(visible.true)) {
90885                                           missing = difference(missing, map$3(visible.true, 'id'));
90886                                           _stack[0].graph.rebase(visible.true, map$3(_stack, 'graph'), true);
90887                                           _tree.rebase(visible.true, true);
90888                                       }
90889
90890                                       // fetch older versions of nodes that were deleted..
90891                                       forEach(visible.false, function(entity) {
90892                                           osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
90893                                       });
90894                                   }
90895
90896                                   if (err || isEmpty(missing)) {
90897                                       loading.close();
90898                                       context.redrawEnable(true);
90899                                       dispatch$1.call('change');
90900                                       dispatch$1.call('restore', this);
90901                                   }
90902                               };
90903
90904                               osm.loadMultiple(missing, childNodesLoaded);
90905                           }
90906                       }
90907                   }
90908
90909                   _stack = h.stack.map(function(d) {
90910                       var entities = {}, entity;
90911
90912                       if (d.modified) {
90913                           d.modified.forEach(function(key) {
90914                               entity = allEntities[key];
90915                               entities[entity.id] = entity;
90916                           });
90917                       }
90918
90919                       if (d.deleted) {
90920                           d.deleted.forEach(function(id) {
90921                               entities[id] = undefined;
90922                           });
90923                       }
90924
90925                       return {
90926                           graph: coreGraph(_stack[0].graph).load(entities),
90927                           annotation: d.annotation,
90928                           imageryUsed: d.imageryUsed,
90929                           transform: d.transform,
90930                           selectedIDs: d.selectedIDs
90931                       };
90932                   });
90933
90934               } else { // original version
90935                   _stack = h.stack.map(function(d) {
90936                       var entities = {};
90937
90938                       for (var i in d.entities) {
90939                           var entity = d.entities[i];
90940                           entities[i] = entity === 'undefined' ? undefined : osmEntity(entity);
90941                       }
90942
90943                       d.graph = coreGraph(_stack[0].graph).load(entities);
90944                       return d;
90945                   });
90946               }
90947
90948               var transform = _stack[_index].transform;
90949               if (transform) {
90950                   context.map().transformEase(transform, 0);   // 0 = immediate, no easing
90951               }
90952
90953               if (loadComplete) {
90954                   dispatch$1.call('change');
90955                   dispatch$1.call('restore', this);
90956               }
90957
90958               return history;
90959           },
90960
90961
90962           save: function() {
90963               if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
90964               return history;
90965           },
90966
90967
90968           clearSaved: function() {
90969               context.debouncedSave.cancel();
90970               if (lock.locked()) context.storage(getKey('saved_history'), null);
90971               return history;
90972           },
90973
90974
90975           lock: function() {
90976               return lock.lock();
90977           },
90978
90979
90980           unlock: function() {
90981               lock.unlock();
90982           },
90983
90984
90985           // is iD not open in another window and it detects that
90986           // there's a history stored in localStorage that's recoverable?
90987           restorableChanges: function() {
90988               return lock.locked() && !!context.storage(getKey('saved_history'));
90989           },
90990
90991
90992           // load history from a version stored in localStorage
90993           restore: function() {
90994               if (!lock.locked()) return;
90995
90996               var json = context.storage(getKey('saved_history'));
90997               if (json) history.fromJSON(json, true);
90998           },
90999
91000
91001           _getKey: getKey
91002
91003       };
91004
91005
91006       history.reset();
91007
91008       return utilRebind(history, dispatch$1, 'on');
91009   }
91010
91011   /** Used to store function metadata. */
91012   var metaMap = WeakMap && new WeakMap;
91013
91014   /**
91015    * The base implementation of `setData` without support for hot loop shorting.
91016    *
91017    * @private
91018    * @param {Function} func The function to associate metadata with.
91019    * @param {*} data The metadata.
91020    * @returns {Function} Returns `func`.
91021    */
91022   var baseSetData = !metaMap ? identity$8 : function(func, data) {
91023     metaMap.set(func, data);
91024     return func;
91025   };
91026
91027   /**
91028    * Creates a function that produces an instance of `Ctor` regardless of
91029    * whether it was invoked as part of a `new` expression or by `call` or `apply`.
91030    *
91031    * @private
91032    * @param {Function} Ctor The constructor to wrap.
91033    * @returns {Function} Returns the new wrapped function.
91034    */
91035   function createCtor(Ctor) {
91036     return function() {
91037       // Use a `switch` statement to work with class constructors. See
91038       // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
91039       // for more details.
91040       var args = arguments;
91041       switch (args.length) {
91042         case 0: return new Ctor;
91043         case 1: return new Ctor(args[0]);
91044         case 2: return new Ctor(args[0], args[1]);
91045         case 3: return new Ctor(args[0], args[1], args[2]);
91046         case 4: return new Ctor(args[0], args[1], args[2], args[3]);
91047         case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
91048         case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
91049         case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
91050       }
91051       var thisBinding = baseCreate(Ctor.prototype),
91052           result = Ctor.apply(thisBinding, args);
91053
91054       // Mimic the constructor's `return` behavior.
91055       // See https://es5.github.io/#x13.2.2 for more details.
91056       return isObject(result) ? result : thisBinding;
91057     };
91058   }
91059
91060   /** Used to compose bitmasks for function metadata. */
91061   var WRAP_BIND_FLAG = 1;
91062
91063   /**
91064    * Creates a function that wraps `func` to invoke it with the optional `this`
91065    * binding of `thisArg`.
91066    *
91067    * @private
91068    * @param {Function} func The function to wrap.
91069    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91070    * @param {*} [thisArg] The `this` binding of `func`.
91071    * @returns {Function} Returns the new wrapped function.
91072    */
91073   function createBind(func, bitmask, thisArg) {
91074     var isBind = bitmask & WRAP_BIND_FLAG,
91075         Ctor = createCtor(func);
91076
91077     function wrapper() {
91078       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
91079       return fn.apply(isBind ? thisArg : this, arguments);
91080     }
91081     return wrapper;
91082   }
91083
91084   /* Built-in method references for those with the same name as other `lodash` methods. */
91085   var nativeMax$5 = Math.max;
91086
91087   /**
91088    * Creates an array that is the composition of partially applied arguments,
91089    * placeholders, and provided arguments into a single array of arguments.
91090    *
91091    * @private
91092    * @param {Array} args The provided arguments.
91093    * @param {Array} partials The arguments to prepend to those provided.
91094    * @param {Array} holders The `partials` placeholder indexes.
91095    * @params {boolean} [isCurried] Specify composing for a curried function.
91096    * @returns {Array} Returns the new array of composed arguments.
91097    */
91098   function composeArgs(args, partials, holders, isCurried) {
91099     var argsIndex = -1,
91100         argsLength = args.length,
91101         holdersLength = holders.length,
91102         leftIndex = -1,
91103         leftLength = partials.length,
91104         rangeLength = nativeMax$5(argsLength - holdersLength, 0),
91105         result = Array(leftLength + rangeLength),
91106         isUncurried = !isCurried;
91107
91108     while (++leftIndex < leftLength) {
91109       result[leftIndex] = partials[leftIndex];
91110     }
91111     while (++argsIndex < holdersLength) {
91112       if (isUncurried || argsIndex < argsLength) {
91113         result[holders[argsIndex]] = args[argsIndex];
91114       }
91115     }
91116     while (rangeLength--) {
91117       result[leftIndex++] = args[argsIndex++];
91118     }
91119     return result;
91120   }
91121
91122   /* Built-in method references for those with the same name as other `lodash` methods. */
91123   var nativeMax$6 = Math.max;
91124
91125   /**
91126    * This function is like `composeArgs` except that the arguments composition
91127    * is tailored for `_.partialRight`.
91128    *
91129    * @private
91130    * @param {Array} args The provided arguments.
91131    * @param {Array} partials The arguments to append to those provided.
91132    * @param {Array} holders The `partials` placeholder indexes.
91133    * @params {boolean} [isCurried] Specify composing for a curried function.
91134    * @returns {Array} Returns the new array of composed arguments.
91135    */
91136   function composeArgsRight(args, partials, holders, isCurried) {
91137     var argsIndex = -1,
91138         argsLength = args.length,
91139         holdersIndex = -1,
91140         holdersLength = holders.length,
91141         rightIndex = -1,
91142         rightLength = partials.length,
91143         rangeLength = nativeMax$6(argsLength - holdersLength, 0),
91144         result = Array(rangeLength + rightLength),
91145         isUncurried = !isCurried;
91146
91147     while (++argsIndex < rangeLength) {
91148       result[argsIndex] = args[argsIndex];
91149     }
91150     var offset = argsIndex;
91151     while (++rightIndex < rightLength) {
91152       result[offset + rightIndex] = partials[rightIndex];
91153     }
91154     while (++holdersIndex < holdersLength) {
91155       if (isUncurried || argsIndex < argsLength) {
91156         result[offset + holders[holdersIndex]] = args[argsIndex++];
91157       }
91158     }
91159     return result;
91160   }
91161
91162   /**
91163    * Gets the number of `placeholder` occurrences in `array`.
91164    *
91165    * @private
91166    * @param {Array} array The array to inspect.
91167    * @param {*} placeholder The placeholder to search for.
91168    * @returns {number} Returns the placeholder count.
91169    */
91170   function countHolders(array, placeholder) {
91171     var length = array.length,
91172         result = 0;
91173
91174     while (length--) {
91175       if (array[length] === placeholder) {
91176         ++result;
91177       }
91178     }
91179     return result;
91180   }
91181
91182   /**
91183    * The function whose prototype chain sequence wrappers inherit from.
91184    *
91185    * @private
91186    */
91187   function baseLodash() {
91188     // No operation performed.
91189   }
91190
91191   /** Used as references for the maximum length and index of an array. */
91192   var MAX_ARRAY_LENGTH = 4294967295;
91193
91194   /**
91195    * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
91196    *
91197    * @private
91198    * @constructor
91199    * @param {*} value The value to wrap.
91200    */
91201   function LazyWrapper(value) {
91202     this.__wrapped__ = value;
91203     this.__actions__ = [];
91204     this.__dir__ = 1;
91205     this.__filtered__ = false;
91206     this.__iteratees__ = [];
91207     this.__takeCount__ = MAX_ARRAY_LENGTH;
91208     this.__views__ = [];
91209   }
91210
91211   // Ensure `LazyWrapper` is an instance of `baseLodash`.
91212   LazyWrapper.prototype = baseCreate(baseLodash.prototype);
91213   LazyWrapper.prototype.constructor = LazyWrapper;
91214
91215   /**
91216    * Gets metadata for `func`.
91217    *
91218    * @private
91219    * @param {Function} func The function to query.
91220    * @returns {*} Returns the metadata for `func`.
91221    */
91222   var getData = !metaMap ? noop$3 : function(func) {
91223     return metaMap.get(func);
91224   };
91225
91226   /** Used to lookup unminified function names. */
91227   var realNames = {};
91228
91229   /** Used for built-in method references. */
91230   var objectProto$k = Object.prototype;
91231
91232   /** Used to check objects for own properties. */
91233   var hasOwnProperty$h = objectProto$k.hasOwnProperty;
91234
91235   /**
91236    * Gets the name of `func`.
91237    *
91238    * @private
91239    * @param {Function} func The function to query.
91240    * @returns {string} Returns the function name.
91241    */
91242   function getFuncName(func) {
91243     var result = (func.name + ''),
91244         array = realNames[result],
91245         length = hasOwnProperty$h.call(realNames, result) ? array.length : 0;
91246
91247     while (length--) {
91248       var data = array[length],
91249           otherFunc = data.func;
91250       if (otherFunc == null || otherFunc == func) {
91251         return data.name;
91252       }
91253     }
91254     return result;
91255   }
91256
91257   /**
91258    * The base constructor for creating `lodash` wrapper objects.
91259    *
91260    * @private
91261    * @param {*} value The value to wrap.
91262    * @param {boolean} [chainAll] Enable explicit method chain sequences.
91263    */
91264   function LodashWrapper(value, chainAll) {
91265     this.__wrapped__ = value;
91266     this.__actions__ = [];
91267     this.__chain__ = !!chainAll;
91268     this.__index__ = 0;
91269     this.__values__ = undefined;
91270   }
91271
91272   LodashWrapper.prototype = baseCreate(baseLodash.prototype);
91273   LodashWrapper.prototype.constructor = LodashWrapper;
91274
91275   /**
91276    * Creates a clone of `wrapper`.
91277    *
91278    * @private
91279    * @param {Object} wrapper The wrapper to clone.
91280    * @returns {Object} Returns the cloned wrapper.
91281    */
91282   function wrapperClone(wrapper) {
91283     if (wrapper instanceof LazyWrapper) {
91284       return wrapper.clone();
91285     }
91286     var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
91287     result.__actions__ = copyArray(wrapper.__actions__);
91288     result.__index__  = wrapper.__index__;
91289     result.__values__ = wrapper.__values__;
91290     return result;
91291   }
91292
91293   /** Used for built-in method references. */
91294   var objectProto$l = Object.prototype;
91295
91296   /** Used to check objects for own properties. */
91297   var hasOwnProperty$i = objectProto$l.hasOwnProperty;
91298
91299   /**
91300    * Creates a `lodash` object which wraps `value` to enable implicit method
91301    * chain sequences. Methods that operate on and return arrays, collections,
91302    * and functions can be chained together. Methods that retrieve a single value
91303    * or may return a primitive value will automatically end the chain sequence
91304    * and return the unwrapped value. Otherwise, the value must be unwrapped
91305    * with `_#value`.
91306    *
91307    * Explicit chain sequences, which must be unwrapped with `_#value`, may be
91308    * enabled using `_.chain`.
91309    *
91310    * The execution of chained methods is lazy, that is, it's deferred until
91311    * `_#value` is implicitly or explicitly called.
91312    *
91313    * Lazy evaluation allows several methods to support shortcut fusion.
91314    * Shortcut fusion is an optimization to merge iteratee calls; this avoids
91315    * the creation of intermediate arrays and can greatly reduce the number of
91316    * iteratee executions. Sections of a chain sequence qualify for shortcut
91317    * fusion if the section is applied to an array and iteratees accept only
91318    * one argument. The heuristic for whether a section qualifies for shortcut
91319    * fusion is subject to change.
91320    *
91321    * Chaining is supported in custom builds as long as the `_#value` method is
91322    * directly or indirectly included in the build.
91323    *
91324    * In addition to lodash methods, wrappers have `Array` and `String` methods.
91325    *
91326    * The wrapper `Array` methods are:
91327    * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
91328    *
91329    * The wrapper `String` methods are:
91330    * `replace` and `split`
91331    *
91332    * The wrapper methods that support shortcut fusion are:
91333    * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
91334    * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
91335    * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
91336    *
91337    * The chainable wrapper methods are:
91338    * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
91339    * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
91340    * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
91341    * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
91342    * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
91343    * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
91344    * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
91345    * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
91346    * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
91347    * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
91348    * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
91349    * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
91350    * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
91351    * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
91352    * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
91353    * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
91354    * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
91355    * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
91356    * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
91357    * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
91358    * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
91359    * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
91360    * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
91361    * `zipObject`, `zipObjectDeep`, and `zipWith`
91362    *
91363    * The wrapper methods that are **not** chainable by default are:
91364    * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
91365    * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
91366    * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
91367    * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
91368    * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
91369    * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
91370    * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
91371    * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
91372    * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
91373    * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
91374    * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
91375    * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
91376    * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
91377    * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
91378    * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
91379    * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
91380    * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
91381    * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
91382    * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
91383    * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
91384    * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
91385    * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
91386    * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
91387    * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
91388    * `upperFirst`, `value`, and `words`
91389    *
91390    * @name _
91391    * @constructor
91392    * @category Seq
91393    * @param {*} value The value to wrap in a `lodash` instance.
91394    * @returns {Object} Returns the new `lodash` wrapper instance.
91395    * @example
91396    *
91397    * function square(n) {
91398    *   return n * n;
91399    * }
91400    *
91401    * var wrapped = _([1, 2, 3]);
91402    *
91403    * // Returns an unwrapped value.
91404    * wrapped.reduce(_.add);
91405    * // => 6
91406    *
91407    * // Returns a wrapped value.
91408    * var squares = wrapped.map(square);
91409    *
91410    * _.isArray(squares);
91411    * // => false
91412    *
91413    * _.isArray(squares.value());
91414    * // => true
91415    */
91416   function lodash(value) {
91417     if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
91418       if (value instanceof LodashWrapper) {
91419         return value;
91420       }
91421       if (hasOwnProperty$i.call(value, '__wrapped__')) {
91422         return wrapperClone(value);
91423       }
91424     }
91425     return new LodashWrapper(value);
91426   }
91427
91428   // Ensure wrappers are instances of `baseLodash`.
91429   lodash.prototype = baseLodash.prototype;
91430   lodash.prototype.constructor = lodash;
91431
91432   /**
91433    * Checks if `func` has a lazy counterpart.
91434    *
91435    * @private
91436    * @param {Function} func The function to check.
91437    * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
91438    *  else `false`.
91439    */
91440   function isLaziable(func) {
91441     var funcName = getFuncName(func),
91442         other = lodash[funcName];
91443
91444     if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
91445       return false;
91446     }
91447     if (func === other) {
91448       return true;
91449     }
91450     var data = getData(other);
91451     return !!data && func === data[0];
91452   }
91453
91454   /**
91455    * Sets metadata for `func`.
91456    *
91457    * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
91458    * period of time, it will trip its breaker and transition to an identity
91459    * function to avoid garbage collection pauses in V8. See
91460    * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
91461    * for more details.
91462    *
91463    * @private
91464    * @param {Function} func The function to associate metadata with.
91465    * @param {*} data The metadata.
91466    * @returns {Function} Returns `func`.
91467    */
91468   var setData = shortOut(baseSetData);
91469
91470   /** Used to match wrap detail comments. */
91471   var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
91472       reSplitDetails = /,? & /;
91473
91474   /**
91475    * Extracts wrapper details from the `source` body comment.
91476    *
91477    * @private
91478    * @param {string} source The source to inspect.
91479    * @returns {Array} Returns the wrapper details.
91480    */
91481   function getWrapDetails(source) {
91482     var match = source.match(reWrapDetails);
91483     return match ? match[1].split(reSplitDetails) : [];
91484   }
91485
91486   /** Used to match wrap detail comments. */
91487   var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
91488
91489   /**
91490    * Inserts wrapper `details` in a comment at the top of the `source` body.
91491    *
91492    * @private
91493    * @param {string} source The source to modify.
91494    * @returns {Array} details The details to insert.
91495    * @returns {string} Returns the modified source.
91496    */
91497   function insertWrapDetails(source, details) {
91498     var length = details.length;
91499     if (!length) {
91500       return source;
91501     }
91502     var lastIndex = length - 1;
91503     details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
91504     details = details.join(length > 2 ? ', ' : ' ');
91505     return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
91506   }
91507
91508   /** Used to compose bitmasks for function metadata. */
91509   var WRAP_BIND_FLAG$1 = 1,
91510       WRAP_BIND_KEY_FLAG = 2,
91511       WRAP_CURRY_FLAG = 8,
91512       WRAP_CURRY_RIGHT_FLAG = 16,
91513       WRAP_PARTIAL_FLAG = 32,
91514       WRAP_PARTIAL_RIGHT_FLAG = 64,
91515       WRAP_ARY_FLAG = 128,
91516       WRAP_REARG_FLAG = 256,
91517       WRAP_FLIP_FLAG = 512;
91518
91519   /** Used to associate wrap methods with their bit flags. */
91520   var wrapFlags = [
91521     ['ary', WRAP_ARY_FLAG],
91522     ['bind', WRAP_BIND_FLAG$1],
91523     ['bindKey', WRAP_BIND_KEY_FLAG],
91524     ['curry', WRAP_CURRY_FLAG],
91525     ['curryRight', WRAP_CURRY_RIGHT_FLAG],
91526     ['flip', WRAP_FLIP_FLAG],
91527     ['partial', WRAP_PARTIAL_FLAG],
91528     ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
91529     ['rearg', WRAP_REARG_FLAG]
91530   ];
91531
91532   /**
91533    * Updates wrapper `details` based on `bitmask` flags.
91534    *
91535    * @private
91536    * @returns {Array} details The details to modify.
91537    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91538    * @returns {Array} Returns `details`.
91539    */
91540   function updateWrapDetails(details, bitmask) {
91541     arrayEach(wrapFlags, function(pair) {
91542       var value = '_.' + pair[0];
91543       if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
91544         details.push(value);
91545       }
91546     });
91547     return details.sort();
91548   }
91549
91550   /**
91551    * Sets the `toString` method of `wrapper` to mimic the source of `reference`
91552    * with wrapper details in a comment at the top of the source body.
91553    *
91554    * @private
91555    * @param {Function} wrapper The function to modify.
91556    * @param {Function} reference The reference function.
91557    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91558    * @returns {Function} Returns `wrapper`.
91559    */
91560   function setWrapToString(wrapper, reference, bitmask) {
91561     var source = (reference + '');
91562     return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
91563   }
91564
91565   /** Used to compose bitmasks for function metadata. */
91566   var WRAP_BIND_FLAG$2 = 1,
91567       WRAP_BIND_KEY_FLAG$1 = 2,
91568       WRAP_CURRY_BOUND_FLAG = 4,
91569       WRAP_CURRY_FLAG$1 = 8,
91570       WRAP_PARTIAL_FLAG$1 = 32,
91571       WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
91572
91573   /**
91574    * Creates a function that wraps `func` to continue currying.
91575    *
91576    * @private
91577    * @param {Function} func The function to wrap.
91578    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91579    * @param {Function} wrapFunc The function to create the `func` wrapper.
91580    * @param {*} placeholder The placeholder value.
91581    * @param {*} [thisArg] The `this` binding of `func`.
91582    * @param {Array} [partials] The arguments to prepend to those provided to
91583    *  the new function.
91584    * @param {Array} [holders] The `partials` placeholder indexes.
91585    * @param {Array} [argPos] The argument positions of the new function.
91586    * @param {number} [ary] The arity cap of `func`.
91587    * @param {number} [arity] The arity of `func`.
91588    * @returns {Function} Returns the new wrapped function.
91589    */
91590   function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
91591     var isCurry = bitmask & WRAP_CURRY_FLAG$1,
91592         newHolders = isCurry ? holders : undefined,
91593         newHoldersRight = isCurry ? undefined : holders,
91594         newPartials = isCurry ? partials : undefined,
91595         newPartialsRight = isCurry ? undefined : partials;
91596
91597     bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$1 : WRAP_PARTIAL_RIGHT_FLAG$1);
91598     bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$1);
91599
91600     if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
91601       bitmask &= ~(WRAP_BIND_FLAG$2 | WRAP_BIND_KEY_FLAG$1);
91602     }
91603     var newData = [
91604       func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
91605       newHoldersRight, argPos, ary, arity
91606     ];
91607
91608     var result = wrapFunc.apply(undefined, newData);
91609     if (isLaziable(func)) {
91610       setData(result, newData);
91611     }
91612     result.placeholder = placeholder;
91613     return setWrapToString(result, func, bitmask);
91614   }
91615
91616   /**
91617    * Gets the argument placeholder value for `func`.
91618    *
91619    * @private
91620    * @param {Function} func The function to inspect.
91621    * @returns {*} Returns the placeholder value.
91622    */
91623   function getHolder(func) {
91624     var object = func;
91625     return object.placeholder;
91626   }
91627
91628   /* Built-in method references for those with the same name as other `lodash` methods. */
91629   var nativeMin$2 = Math.min;
91630
91631   /**
91632    * Reorder `array` according to the specified indexes where the element at
91633    * the first index is assigned as the first element, the element at
91634    * the second index is assigned as the second element, and so on.
91635    *
91636    * @private
91637    * @param {Array} array The array to reorder.
91638    * @param {Array} indexes The arranged array indexes.
91639    * @returns {Array} Returns `array`.
91640    */
91641   function reorder(array, indexes) {
91642     var arrLength = array.length,
91643         length = nativeMin$2(indexes.length, arrLength),
91644         oldArray = copyArray(array);
91645
91646     while (length--) {
91647       var index = indexes[length];
91648       array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
91649     }
91650     return array;
91651   }
91652
91653   /** Used as the internal argument placeholder. */
91654   var PLACEHOLDER = '__lodash_placeholder__';
91655
91656   /**
91657    * Replaces all `placeholder` elements in `array` with an internal placeholder
91658    * and returns an array of their indexes.
91659    *
91660    * @private
91661    * @param {Array} array The array to modify.
91662    * @param {*} placeholder The placeholder to replace.
91663    * @returns {Array} Returns the new array of placeholder indexes.
91664    */
91665   function replaceHolders(array, placeholder) {
91666     var index = -1,
91667         length = array.length,
91668         resIndex = 0,
91669         result = [];
91670
91671     while (++index < length) {
91672       var value = array[index];
91673       if (value === placeholder || value === PLACEHOLDER) {
91674         array[index] = PLACEHOLDER;
91675         result[resIndex++] = index;
91676       }
91677     }
91678     return result;
91679   }
91680
91681   /** Used to compose bitmasks for function metadata. */
91682   var WRAP_BIND_FLAG$3 = 1,
91683       WRAP_BIND_KEY_FLAG$2 = 2,
91684       WRAP_CURRY_FLAG$2 = 8,
91685       WRAP_CURRY_RIGHT_FLAG$1 = 16,
91686       WRAP_ARY_FLAG$1 = 128,
91687       WRAP_FLIP_FLAG$1 = 512;
91688
91689   /**
91690    * Creates a function that wraps `func` to invoke it with optional `this`
91691    * binding of `thisArg`, partial application, and currying.
91692    *
91693    * @private
91694    * @param {Function|string} func The function or method name to wrap.
91695    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91696    * @param {*} [thisArg] The `this` binding of `func`.
91697    * @param {Array} [partials] The arguments to prepend to those provided to
91698    *  the new function.
91699    * @param {Array} [holders] The `partials` placeholder indexes.
91700    * @param {Array} [partialsRight] The arguments to append to those provided
91701    *  to the new function.
91702    * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
91703    * @param {Array} [argPos] The argument positions of the new function.
91704    * @param {number} [ary] The arity cap of `func`.
91705    * @param {number} [arity] The arity of `func`.
91706    * @returns {Function} Returns the new wrapped function.
91707    */
91708   function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
91709     var isAry = bitmask & WRAP_ARY_FLAG$1,
91710         isBind = bitmask & WRAP_BIND_FLAG$3,
91711         isBindKey = bitmask & WRAP_BIND_KEY_FLAG$2,
91712         isCurried = bitmask & (WRAP_CURRY_FLAG$2 | WRAP_CURRY_RIGHT_FLAG$1),
91713         isFlip = bitmask & WRAP_FLIP_FLAG$1,
91714         Ctor = isBindKey ? undefined : createCtor(func);
91715
91716     function wrapper() {
91717       var length = arguments.length,
91718           args = Array(length),
91719           index = length;
91720
91721       while (index--) {
91722         args[index] = arguments[index];
91723       }
91724       if (isCurried) {
91725         var placeholder = getHolder(wrapper),
91726             holdersCount = countHolders(args, placeholder);
91727       }
91728       if (partials) {
91729         args = composeArgs(args, partials, holders, isCurried);
91730       }
91731       if (partialsRight) {
91732         args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
91733       }
91734       length -= holdersCount;
91735       if (isCurried && length < arity) {
91736         var newHolders = replaceHolders(args, placeholder);
91737         return createRecurry(
91738           func, bitmask, createHybrid, wrapper.placeholder, thisArg,
91739           args, newHolders, argPos, ary, arity - length
91740         );
91741       }
91742       var thisBinding = isBind ? thisArg : this,
91743           fn = isBindKey ? thisBinding[func] : func;
91744
91745       length = args.length;
91746       if (argPos) {
91747         args = reorder(args, argPos);
91748       } else if (isFlip && length > 1) {
91749         args.reverse();
91750       }
91751       if (isAry && ary < length) {
91752         args.length = ary;
91753       }
91754       if (this && this !== root$2 && this instanceof wrapper) {
91755         fn = Ctor || createCtor(fn);
91756       }
91757       return fn.apply(thisBinding, args);
91758     }
91759     return wrapper;
91760   }
91761
91762   /**
91763    * Creates a function that wraps `func` to enable currying.
91764    *
91765    * @private
91766    * @param {Function} func The function to wrap.
91767    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91768    * @param {number} arity The arity of `func`.
91769    * @returns {Function} Returns the new wrapped function.
91770    */
91771   function createCurry(func, bitmask, arity) {
91772     var Ctor = createCtor(func);
91773
91774     function wrapper() {
91775       var length = arguments.length,
91776           args = Array(length),
91777           index = length,
91778           placeholder = getHolder(wrapper);
91779
91780       while (index--) {
91781         args[index] = arguments[index];
91782       }
91783       var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
91784         ? []
91785         : replaceHolders(args, placeholder);
91786
91787       length -= holders.length;
91788       if (length < arity) {
91789         return createRecurry(
91790           func, bitmask, createHybrid, wrapper.placeholder, undefined,
91791           args, holders, undefined, undefined, arity - length);
91792       }
91793       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
91794       return apply(fn, this, args);
91795     }
91796     return wrapper;
91797   }
91798
91799   /** Used to compose bitmasks for function metadata. */
91800   var WRAP_BIND_FLAG$4 = 1;
91801
91802   /**
91803    * Creates a function that wraps `func` to invoke it with the `this` binding
91804    * of `thisArg` and `partials` prepended to the arguments it receives.
91805    *
91806    * @private
91807    * @param {Function} func The function to wrap.
91808    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91809    * @param {*} thisArg The `this` binding of `func`.
91810    * @param {Array} partials The arguments to prepend to those provided to
91811    *  the new function.
91812    * @returns {Function} Returns the new wrapped function.
91813    */
91814   function createPartial(func, bitmask, thisArg, partials) {
91815     var isBind = bitmask & WRAP_BIND_FLAG$4,
91816         Ctor = createCtor(func);
91817
91818     function wrapper() {
91819       var argsIndex = -1,
91820           argsLength = arguments.length,
91821           leftIndex = -1,
91822           leftLength = partials.length,
91823           args = Array(leftLength + argsLength),
91824           fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
91825
91826       while (++leftIndex < leftLength) {
91827         args[leftIndex] = partials[leftIndex];
91828       }
91829       while (argsLength--) {
91830         args[leftIndex++] = arguments[++argsIndex];
91831       }
91832       return apply(fn, isBind ? thisArg : this, args);
91833     }
91834     return wrapper;
91835   }
91836
91837   /** Used as the internal argument placeholder. */
91838   var PLACEHOLDER$1 = '__lodash_placeholder__';
91839
91840   /** Used to compose bitmasks for function metadata. */
91841   var WRAP_BIND_FLAG$5 = 1,
91842       WRAP_BIND_KEY_FLAG$3 = 2,
91843       WRAP_CURRY_BOUND_FLAG$1 = 4,
91844       WRAP_CURRY_FLAG$3 = 8,
91845       WRAP_ARY_FLAG$2 = 128,
91846       WRAP_REARG_FLAG$1 = 256;
91847
91848   /* Built-in method references for those with the same name as other `lodash` methods. */
91849   var nativeMin$3 = Math.min;
91850
91851   /**
91852    * Merges the function metadata of `source` into `data`.
91853    *
91854    * Merging metadata reduces the number of wrappers used to invoke a function.
91855    * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
91856    * may be applied regardless of execution order. Methods like `_.ary` and
91857    * `_.rearg` modify function arguments, making the order in which they are
91858    * executed important, preventing the merging of metadata. However, we make
91859    * an exception for a safe combined case where curried functions have `_.ary`
91860    * and or `_.rearg` applied.
91861    *
91862    * @private
91863    * @param {Array} data The destination metadata.
91864    * @param {Array} source The source metadata.
91865    * @returns {Array} Returns `data`.
91866    */
91867   function mergeData(data, source) {
91868     var bitmask = data[1],
91869         srcBitmask = source[1],
91870         newBitmask = bitmask | srcBitmask,
91871         isCommon = newBitmask < (WRAP_BIND_FLAG$5 | WRAP_BIND_KEY_FLAG$3 | WRAP_ARY_FLAG$2);
91872
91873     var isCombo =
91874       ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$3)) ||
91875       ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
91876       ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$3));
91877
91878     // Exit early if metadata can't be merged.
91879     if (!(isCommon || isCombo)) {
91880       return data;
91881     }
91882     // Use source `thisArg` if available.
91883     if (srcBitmask & WRAP_BIND_FLAG$5) {
91884       data[2] = source[2];
91885       // Set when currying a bound function.
91886       newBitmask |= bitmask & WRAP_BIND_FLAG$5 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
91887     }
91888     // Compose partial arguments.
91889     var value = source[3];
91890     if (value) {
91891       var partials = data[3];
91892       data[3] = partials ? composeArgs(partials, value, source[4]) : value;
91893       data[4] = partials ? replaceHolders(data[3], PLACEHOLDER$1) : source[4];
91894     }
91895     // Compose partial right arguments.
91896     value = source[5];
91897     if (value) {
91898       partials = data[5];
91899       data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
91900       data[6] = partials ? replaceHolders(data[5], PLACEHOLDER$1) : source[6];
91901     }
91902     // Use source `argPos` if available.
91903     value = source[7];
91904     if (value) {
91905       data[7] = value;
91906     }
91907     // Use source `ary` if it's smaller.
91908     if (srcBitmask & WRAP_ARY_FLAG$2) {
91909       data[8] = data[8] == null ? source[8] : nativeMin$3(data[8], source[8]);
91910     }
91911     // Use source `arity` if one is not provided.
91912     if (data[9] == null) {
91913       data[9] = source[9];
91914     }
91915     // Use source `func` and merge bitmasks.
91916     data[0] = source[0];
91917     data[1] = newBitmask;
91918
91919     return data;
91920   }
91921
91922   /** Error message constants. */
91923   var FUNC_ERROR_TEXT$4 = 'Expected a function';
91924
91925   /** Used to compose bitmasks for function metadata. */
91926   var WRAP_BIND_FLAG$6 = 1,
91927       WRAP_BIND_KEY_FLAG$4 = 2,
91928       WRAP_CURRY_FLAG$4 = 8,
91929       WRAP_CURRY_RIGHT_FLAG$2 = 16,
91930       WRAP_PARTIAL_FLAG$2 = 32,
91931       WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
91932
91933   /* Built-in method references for those with the same name as other `lodash` methods. */
91934   var nativeMax$7 = Math.max;
91935
91936   /**
91937    * Creates a function that either curries or invokes `func` with optional
91938    * `this` binding and partially applied arguments.
91939    *
91940    * @private
91941    * @param {Function|string} func The function or method name to wrap.
91942    * @param {number} bitmask The bitmask flags.
91943    *    1 - `_.bind`
91944    *    2 - `_.bindKey`
91945    *    4 - `_.curry` or `_.curryRight` of a bound function
91946    *    8 - `_.curry`
91947    *   16 - `_.curryRight`
91948    *   32 - `_.partial`
91949    *   64 - `_.partialRight`
91950    *  128 - `_.rearg`
91951    *  256 - `_.ary`
91952    *  512 - `_.flip`
91953    * @param {*} [thisArg] The `this` binding of `func`.
91954    * @param {Array} [partials] The arguments to be partially applied.
91955    * @param {Array} [holders] The `partials` placeholder indexes.
91956    * @param {Array} [argPos] The argument positions of the new function.
91957    * @param {number} [ary] The arity cap of `func`.
91958    * @param {number} [arity] The arity of `func`.
91959    * @returns {Function} Returns the new wrapped function.
91960    */
91961   function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
91962     var isBindKey = bitmask & WRAP_BIND_KEY_FLAG$4;
91963     if (!isBindKey && typeof func != 'function') {
91964       throw new TypeError(FUNC_ERROR_TEXT$4);
91965     }
91966     var length = partials ? partials.length : 0;
91967     if (!length) {
91968       bitmask &= ~(WRAP_PARTIAL_FLAG$2 | WRAP_PARTIAL_RIGHT_FLAG$2);
91969       partials = holders = undefined;
91970     }
91971     ary = ary === undefined ? ary : nativeMax$7(toInteger(ary), 0);
91972     arity = arity === undefined ? arity : toInteger(arity);
91973     length -= holders ? holders.length : 0;
91974
91975     if (bitmask & WRAP_PARTIAL_RIGHT_FLAG$2) {
91976       var partialsRight = partials,
91977           holdersRight = holders;
91978
91979       partials = holders = undefined;
91980     }
91981     var data = isBindKey ? undefined : getData(func);
91982
91983     var newData = [
91984       func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
91985       argPos, ary, arity
91986     ];
91987
91988     if (data) {
91989       mergeData(newData, data);
91990     }
91991     func = newData[0];
91992     bitmask = newData[1];
91993     thisArg = newData[2];
91994     partials = newData[3];
91995     holders = newData[4];
91996     arity = newData[9] = newData[9] === undefined
91997       ? (isBindKey ? 0 : func.length)
91998       : nativeMax$7(newData[9] - length, 0);
91999
92000     if (!arity && bitmask & (WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2)) {
92001       bitmask &= ~(WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2);
92002     }
92003     if (!bitmask || bitmask == WRAP_BIND_FLAG$6) {
92004       var result = createBind(func, bitmask, thisArg);
92005     } else if (bitmask == WRAP_CURRY_FLAG$4 || bitmask == WRAP_CURRY_RIGHT_FLAG$2) {
92006       result = createCurry(func, bitmask, arity);
92007     } else if ((bitmask == WRAP_PARTIAL_FLAG$2 || bitmask == (WRAP_BIND_FLAG$6 | WRAP_PARTIAL_FLAG$2)) && !holders.length) {
92008       result = createPartial(func, bitmask, thisArg, partials);
92009     } else {
92010       result = createHybrid.apply(undefined, newData);
92011     }
92012     var setter = data ? baseSetData : setData;
92013     return setWrapToString(setter(result, newData), func, bitmask);
92014   }
92015
92016   /** Used to compose bitmasks for function metadata. */
92017   var WRAP_BIND_FLAG$7 = 1,
92018       WRAP_PARTIAL_FLAG$3 = 32;
92019
92020   /**
92021    * Creates a function that invokes `func` with the `this` binding of `thisArg`
92022    * and `partials` prepended to the arguments it receives.
92023    *
92024    * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
92025    * may be used as a placeholder for partially applied arguments.
92026    *
92027    * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
92028    * property of bound functions.
92029    *
92030    * @static
92031    * @memberOf _
92032    * @since 0.1.0
92033    * @category Function
92034    * @param {Function} func The function to bind.
92035    * @param {*} thisArg The `this` binding of `func`.
92036    * @param {...*} [partials] The arguments to be partially applied.
92037    * @returns {Function} Returns the new bound function.
92038    * @example
92039    *
92040    * function greet(greeting, punctuation) {
92041    *   return greeting + ' ' + this.user + punctuation;
92042    * }
92043    *
92044    * var object = { 'user': 'fred' };
92045    *
92046    * var bound = _.bind(greet, object, 'hi');
92047    * bound('!');
92048    * // => 'hi fred!'
92049    *
92050    * // Bound with placeholders.
92051    * var bound = _.bind(greet, object, _, '!');
92052    * bound('hi');
92053    * // => 'hi fred!'
92054    */
92055   var bind$2 = baseRest(function(func, thisArg, partials) {
92056     var bitmask = WRAP_BIND_FLAG$7;
92057     if (partials.length) {
92058       var holders = replaceHolders(partials, getHolder(bind$2));
92059       bitmask |= WRAP_PARTIAL_FLAG$3;
92060     }
92061     return createWrap(func, bitmask, thisArg, partials, holders);
92062   });
92063
92064   // Assign default placeholders.
92065   bind$2.placeholder = {};
92066
92067   function presetCollection(collection) {
92068       var maxSearchResults = 50;
92069
92070       var presets = {
92071
92072           collection: collection,
92073
92074
92075           item: function(id) {
92076               return find$1(this.collection, function(d) {
92077                   return d.id === id;
92078               });
92079           },
92080
92081           index: function(id) {
92082               return findIndex(this.collection, function(d) {
92083                   return d.id === id;
92084               });
92085           },
92086
92087           matchGeometry: function(geometry) {
92088               return presetCollection(this.collection.filter(function(d) {
92089                   return d.matchGeometry(geometry);
92090               }));
92091           },
92092
92093
92094           search: function(value, geometry) {
92095               if (!value) return this;
92096
92097               value = value.toLowerCase();
92098
92099               // match at name beginning or just after a space (e.g. "office" -> match "Law Office")
92100               function leading(a) {
92101                   var index = a.indexOf(value);
92102                   return index === 0 || a[index - 1] === ' ';
92103               }
92104
92105               // match at name beginning only
92106               function leadingStrict(a) {
92107                   var index = a.indexOf(value);
92108                   return index === 0;
92109               }
92110
92111               function sortNames(a, b) {
92112                   var aCompare = (a.suggestion ? a.originalName : a.name()).toLowerCase();
92113                   var bCompare = (b.suggestion ? b.originalName : b.name()).toLowerCase();
92114
92115                   // priority if search string matches preset name exactly - #4325
92116                   if (value === aCompare) return -1;
92117                   if (value === bCompare) return 1;
92118
92119                   // priority for higher matchScore
92120                   var i = b.originalScore - a.originalScore;
92121                   if (i !== 0) return i;
92122
92123                   // priority if search string appears earlier in preset name
92124                   i = aCompare.indexOf(value) - bCompare.indexOf(value);
92125                   if (i !== 0) return i;
92126
92127                   // priority for shorter preset names
92128                   return aCompare.length - bCompare.length;
92129               }
92130
92131
92132               var searchable = this.collection.filter(function(a) {
92133                   return a.searchable !== false && a.suggestion !== true;
92134               });
92135               var suggestions = this.collection.filter(function(a) {
92136                   return a.suggestion === true;
92137               });
92138
92139               // matches value to preset.name
92140               var leading_name = searchable
92141                   .filter(function(a) {
92142                       return leading(a.name().toLowerCase());
92143                   }).sort(sortNames);
92144
92145               // matches value to preset.terms values
92146               var leading_terms = searchable
92147                   .filter(function(a) {
92148                       return some(a.terms() || [], leading);
92149                   });
92150
92151               // matches value to preset.tags values
92152               var leading_tag_values = searchable
92153                   .filter(function(a) {
92154                       return some(without(values$1(a.tags || {}), '*'), leading);
92155                   });
92156
92157               var leading_suggestions = suggestions
92158                   .filter(function(a) {
92159                       return leadingStrict(a.originalName.toLowerCase());
92160                   }).sort(sortNames);
92161
92162               // finds close matches to value in preset.name
92163               var similar_name = searchable
92164                   .map(function(a) {
92165                       return { preset: a, dist: utilEditDistance(value, a.name()) };
92166                   }).filter(function(a) {
92167                       return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
92168                   }).sort(function(a, b) {
92169                       return a.dist - b.dist;
92170                   }).map(function(a) {
92171                       return a.preset;
92172                   });
92173
92174               // finds close matches to value in preset.terms
92175               var similar_terms = searchable
92176                   .filter(function(a) {
92177                       return some(a.terms() || [], function(b) {
92178                           return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
92179                       });
92180                   });
92181
92182               var similar_suggestions = suggestions
92183                   .map(function(a) {
92184                       return { preset: a, dist: utilEditDistance(value, a.originalName.toLowerCase()) };
92185                   }).filter(function(a) {
92186                       return a.dist + Math.min(value.length - a.preset.originalName.length, 0) < 1;
92187                   }).sort(function(a, b) {
92188                       return a.dist - b.dist;
92189                   }).map(function(a) {
92190                       return a.preset;
92191                   });
92192
92193               var other = presets.item(geometry);
92194
92195               var results = leading_name.concat(
92196                   leading_suggestions,
92197                   leading_terms,
92198                   leading_tag_values,
92199                   similar_name,
92200                   similar_suggestions,
92201                   similar_terms
92202               ).slice(0, maxSearchResults - 1);
92203
92204               return presetCollection(uniq(results.concat(other)));
92205           }
92206       };
92207
92208
92209       return presets;
92210   }
92211
92212   function presetCategory(id, category, all) {
92213       category = clone(category);
92214
92215       category.id = id;
92216
92217
92218       category.members = presetCollection(category.members.map(function(id) {
92219           return all.item(id);
92220       }));
92221
92222
92223       category.matchGeometry = function(geometry) {
92224           return category.geometry.indexOf(geometry) >= 0;
92225       };
92226
92227
92228       category.matchScore = function() {
92229           return -1;
92230       };
92231
92232
92233       category.name = function() {
92234           return t('presets.categories.' + id + '.name', {'default': id});
92235       };
92236
92237
92238       category.terms = function() {
92239           return [];
92240       };
92241
92242
92243       return category;
92244   }
92245
92246   function presetField(id, field) {
92247       field = clone(field);
92248
92249       field.id = id;
92250
92251       // for use in classes, element ids, css selectors
92252       field.safeid = id.replace(/[^_a-zA-Z0-9\-]/g, '_');
92253
92254       field.matchGeometry = function(geometry) {
92255           return !field.geometry || field.geometry === geometry;
92256       };
92257
92258
92259       field.t = function(scope, options) {
92260           return t('presets.fields.' + id + '.' + scope, options);
92261       };
92262
92263
92264       field.label = function() {
92265           return field.overrideLabel || field.t('label', {'default': id});
92266       };
92267
92268
92269       var placeholder = field.placeholder;
92270       field.placeholder = function() {
92271           return field.t('placeholder', {'default': placeholder});
92272       };
92273
92274
92275       return field;
92276   }
92277
92278   function presetPreset(id, preset, fields, visible, rawPresets) {
92279       preset = clone(preset);
92280
92281       preset.id = id;
92282
92283       preset.parentPresetID = function() {
92284           var endIndex = preset.id.lastIndexOf('/');
92285           if (endIndex < 0) return null;
92286
92287           return preset.id.substring(0, endIndex);
92288       };
92289
92290
92291       // For a preset without fields, use the fields of the parent preset.
92292       // Replace {preset} placeholders with the fields of the specified presets.
92293       function resolveFieldInheritance() {
92294
92295           // Skip `fields` for the keys which define the preset.
92296           // These are usually `typeCombo` fields like `shop=*`
92297           function shouldInheritFieldWithID(fieldID) {
92298               var f = fields[fieldID];
92299               if (f.key) {
92300                   if (preset.tags[f.key] !== undefined &&
92301                       // inherit anyway if multiple values are allowed
92302                       f.type !== 'multiCombo' && f.type !== 'semiCombo') {
92303                       return false;
92304                   }
92305               }
92306               return true;
92307           }
92308
92309           // returns an array of field IDs to inherit from the given presetID, if found
92310           function inheritedFieldIDs(presetID, prop) {
92311               if (!presetID) return null;
92312
92313               var inheritPreset = rawPresets[presetID];
92314               if (!inheritPreset) return null;
92315
92316               var inheritFieldIDs = inheritPreset[prop] || [];
92317
92318               if (prop === 'fields') {
92319                   inheritFieldIDs = inheritFieldIDs.filter(shouldInheritFieldWithID);
92320               }
92321
92322               return inheritFieldIDs;
92323           }
92324
92325
92326           ['fields', 'moreFields'].forEach(function(prop) {
92327               var fieldIDs = [];
92328               if (preset[prop] && preset[prop].length) {    // fields were defined
92329                   preset[prop].forEach(function(fieldID) {
92330                       var match = fieldID.match(/\{(.*)\}/);
92331                       if (match !== null) {        // presetID wrapped in braces {}
92332                           var inheritIDs = inheritedFieldIDs(match[1], prop);
92333                           if (inheritIDs !== null) {
92334                               fieldIDs = fieldIDs.concat(inheritIDs);
92335                           } else {
92336                               /* eslint-disable no-console */
92337                               console.log('Cannot resolve presetID ' + match[0] +
92338                                   ' found in ' + preset.id + ' ' + prop);
92339                               /* eslint-enable no-console */
92340                           }
92341                       } else {
92342                           fieldIDs.push(fieldID);  // no braces - just a normal field
92343                       }
92344                   });
92345
92346               } else {  // no fields defined, so use the parent's if possible
92347                   fieldIDs = inheritedFieldIDs(preset.parentPresetID(), prop);
92348               }
92349               // resolve duplicate fields
92350               fieldIDs = uniq(fieldIDs);
92351
92352               // update this preset with the results
92353               preset[prop] = fieldIDs;
92354
92355               // update the raw object to allow for multiple levels of inheritance
92356               rawPresets[preset.id][prop] = fieldIDs;
92357           });
92358       }
92359
92360       if (rawPresets) {
92361           resolveFieldInheritance();
92362       }
92363
92364       preset.fields = (preset.fields || []).map(getFields);
92365       preset.moreFields = (preset.moreFields || []).map(getFields);
92366       preset.geometry = (preset.geometry || []);
92367
92368       visible = visible || false;
92369
92370       function getFields(f) {
92371           return fields[f];
92372       }
92373
92374
92375       preset.matchGeometry = function(geometry) {
92376           return preset.geometry.indexOf(geometry) >= 0;
92377       };
92378
92379
92380       preset.originalScore = preset.matchScore || 1;
92381
92382
92383       preset.matchScore = function(entity) {
92384           var tags = preset.tags;
92385           var score = 0;
92386
92387           for (var t in tags) {
92388               if (entity.tags[t] === tags[t]) {
92389                   score += preset.originalScore;
92390               } else if (tags[t] === '*' && t in entity.tags) {
92391                   score += preset.originalScore / 2;
92392               } else {
92393                   return -1;
92394               }
92395           }
92396
92397           return score;
92398       };
92399
92400
92401       preset.t = function(scope, options) {
92402           return t('presets.presets.' + id + '.' + scope, options);
92403       };
92404
92405
92406       preset.originalName = preset.name || '';
92407
92408
92409       preset.name = function() {
92410           if (preset.suggestion) {
92411               var path = id.split('/');
92412               path.pop();  // remove brand name
92413               // NOTE: insert an en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
92414               return preset.originalName + ' – ' + t('presets.presets.' + path.join('/') + '.name');
92415           }
92416           return preset.t('name', { 'default': preset.originalName });
92417       };
92418
92419
92420       preset.originalTerms = (preset.terms || []).join();
92421
92422
92423       preset.terms = function() {
92424           return preset.t('terms', { 'default': preset.originalTerms }).toLowerCase().trim().split(/\s*,+\s*/);
92425       };
92426
92427
92428       preset.isFallback = function() {
92429           var tagCount = Object.keys(preset.tags).length;
92430           return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
92431       };
92432
92433       preset.visible = function(val) {
92434           if (!arguments.length) return visible;
92435           visible = val;
92436           return visible;
92437       };
92438
92439
92440       var reference = preset.reference || {};
92441       preset.reference = function(geometry) {
92442           // Lookup documentation on Wikidata...
92443           var qid = preset.tags.wikidata || preset.tags['brand:wikidata'] || preset.tags['operator:wikidata'];
92444           if (qid) {
92445               return { qid: qid };
92446           }
92447
92448           // Lookup documentation on OSM Wikibase...
92449           var key = reference.key || Object.keys(omit(preset.tags, 'name'))[0];
92450           var value = reference.value || preset.tags[key];
92451
92452           if (geometry === 'relation' && key === 'type') {
92453               if (value in preset.tags) {
92454                   key = value;
92455                   value = preset.tags[key];
92456               } else {
92457                   return { rtype: value };
92458               }
92459           }
92460
92461           if (value === '*') {
92462               return { key: key };
92463           } else {
92464               return { key: key, value: value };
92465           }
92466       };
92467
92468
92469       preset.removeTags = preset.removeTags || preset.tags || {};
92470       preset.unsetTags = function(tags, geometry) {
92471           tags = omit(tags, Object.keys(preset.removeTags));
92472
92473           for (var f in preset.fields) {
92474               var field = preset.fields[f];
92475               if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
92476                   delete tags[field.key];
92477               }
92478           }
92479
92480           delete tags.area;
92481           return tags;
92482       };
92483
92484
92485       preset.addTags = preset.addTags || preset.tags || {};
92486       preset.setTags = function(tags, geometry) {
92487           var addTags = preset.addTags;
92488           var k;
92489
92490           tags = clone(tags);
92491
92492           for (k in addTags) {
92493               if (addTags[k] === '*') {
92494                   tags[k] = 'yes';
92495               } else {
92496                   tags[k] = addTags[k];
92497               }
92498           }
92499
92500           // Add area=yes if necessary.
92501           // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
92502           // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
92503           // 2. chosen preset doesn't have a key in areaKeys (`railway=station`)
92504           if (!addTags.hasOwnProperty('area')) {
92505               delete tags.area;
92506               if (geometry === 'area') {
92507                   var needsAreaTag = true;
92508                   if (preset.geometry.indexOf('line') === -1) {
92509                       for (k in addTags) {
92510                           if (k in areaKeys) {
92511                               needsAreaTag = false;
92512                               break;
92513                           }
92514                       }
92515                   }
92516                   if (needsAreaTag) {
92517                       tags.area = 'yes';
92518                   }
92519               }
92520           }
92521
92522           for (var f in preset.fields) {
92523               var field = preset.fields[f];
92524               if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
92525                   tags[field.key] = field.default;
92526               }
92527           }
92528
92529           return tags;
92530       };
92531
92532
92533       return preset;
92534   }
92535
92536   function presetIndex() {
92537       // a presetCollection with methods for
92538       // loading new data and returning defaults
92539
92540       var all = presetCollection([]);
92541       var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
92542       var _fields = {};
92543       var _universal = [];
92544       var _recent = presetCollection([]);
92545
92546       // Index of presets by (geometry, tag key).
92547       var _index = {
92548           point: {},
92549           vertex: {},
92550           line: {},
92551           area: {},
92552           relation: {}
92553       };
92554
92555       all.match = function(entity, resolver) {
92556           return resolver.transient(entity, 'presetMatch', function() {
92557               var geometry = entity.geometry(resolver);
92558               var address;
92559
92560               // Treat entities on addr:interpolation lines as points, not vertices - #3241
92561               if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
92562                   geometry = 'point';
92563               }
92564
92565               var geometryMatches = _index[geometry];
92566               var best = -1;
92567               var match;
92568
92569               for (var k in entity.tags) {
92570                   // If any part of an address is present,
92571                   // allow fallback to "Address" preset - #4353
92572                   if (/^addr:/.test(k) && geometryMatches['addr:*']) {
92573                       address = geometryMatches['addr:*'][0];
92574                   }
92575
92576                   var keyMatches = geometryMatches[k];
92577                   if (!keyMatches) continue;
92578
92579                   for (var i = 0; i < keyMatches.length; i++) {
92580                       var score = keyMatches[i].matchScore(entity);
92581                       if (score > best) {
92582                           best = score;
92583                           match = keyMatches[i];
92584                       }
92585                   }
92586                   
92587               }
92588
92589               if (address && (!match || match.isFallback())) {
92590                   match = address;
92591               }
92592               return match || all.item(geometry);
92593           });
92594       };
92595
92596       all.allowsVertex = function(entity, resolver) {
92597           if (entity.type !== 'node') return false;
92598           if (isEmpty(entity.tags)) return true;
92599           return resolver.transient(entity, 'vertexMatch', function() {
92600               var vertexPresets = _index.vertex;
92601               var match;
92602
92603               if (entity.isOnAddressLine(resolver)) {
92604                   match = true;
92605               } else {
92606                   for (var k in entity.tags) {
92607                       var keyMatches = vertexPresets[k];
92608                       if (!keyMatches) continue;
92609                       for (var i = 0; i < keyMatches.length; i++) {
92610                           var preset =  keyMatches[i];
92611                           if (preset.searchable !== false) {
92612                               if (preset.matchScore(entity) > -1) {
92613                                   match = preset;
92614                                   break;
92615                               }
92616                           }
92617                       }
92618
92619                       if (!match && /^addr:/.test(k) && vertexPresets['addr:*']) {
92620                           match = true;
92621                       }
92622
92623                       if (match) break;
92624
92625                   }
92626               }
92627
92628               return match;
92629           });
92630       };
92631
92632
92633       // Because of the open nature of tagging, iD will never have a complete
92634       // list of tags used in OSM, so we want it to have logic like "assume
92635       // that a closed way with an amenity tag is an area, unless the amenity
92636       // is one of these specific types". This function computes a structure
92637       // that allows testing of such conditions, based on the presets designated
92638       // as as supporting (or not supporting) the area geometry.
92639       //
92640       // The returned object L is a whitelist/blacklist of tags. A closed way
92641       // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
92642       // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
92643       // and the subkeys form the blacklist.
92644       all.areaKeys = function() {
92645           var areaKeys = {};
92646           var ignore = ['barrier', 'highway', 'footway', 'railway', 'type'];  // probably a line..
92647           var presets = reject(all.collection, 'suggestion');
92648
92649           // whitelist
92650           presets.forEach(function(d) {
92651               for (var key in d.tags) break;
92652               if (!key) return;
92653               if (ignore.indexOf(key) !== -1) return;
92654
92655               if (d.geometry.indexOf('area') !== -1) {    // probably an area..
92656                   areaKeys[key] = areaKeys[key] || {};
92657               }
92658           });
92659
92660           // blacklist
92661           presets.forEach(function(d) {
92662               for (var key in d.tags) break;
92663               if (!key) return;
92664               if (ignore.indexOf(key) !== -1) return;
92665
92666               var value = d.tags[key];
92667               if (key in areaKeys &&                      // probably an area...
92668                   d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
92669                   value !== '*') {
92670                   areaKeys[key][value] = true;
92671               }
92672           });
92673
92674           return areaKeys;
92675       };
92676
92677       all.build = function(d, visible) {
92678           if (d.fields) {
92679               forEach(d.fields, function(d, id) {
92680                   _fields[id] = presetField(id, d);
92681                   if (d.universal) {
92682                       _universal.push(_fields[id]);
92683                   }
92684               });
92685           }
92686
92687           if (d.presets) {
92688               var rawPresets = d.presets;
92689               forEach(d.presets, function(d, id) {
92690                   var existing = all.index(id);
92691                   if (existing !== -1) {
92692                       all.collection[existing] = presetPreset(id, d, _fields, visible, rawPresets);
92693                   } else {
92694                       all.collection.push(presetPreset(id, d, _fields, visible, rawPresets));
92695                   }
92696               });
92697           }
92698
92699           if (d.categories) {
92700               forEach(d.categories, function(d, id) {
92701                   var existing = all.index(id);
92702                   if (existing !== -1) {
92703                       all.collection[existing] = presetCategory(id, d, all);
92704                   } else {
92705                       all.collection.push(presetCategory(id, d, all));
92706                   }
92707               });
92708           }
92709
92710           if (d.defaults) {
92711               var getItem = bind$2(all.item, all);
92712               _defaults = {
92713                   area: presetCollection(d.defaults.area.map(getItem)),
92714                   line: presetCollection(d.defaults.line.map(getItem)),
92715                   point: presetCollection(d.defaults.point.map(getItem)),
92716                   vertex: presetCollection(d.defaults.vertex.map(getItem)),
92717                   relation: presetCollection(d.defaults.relation.map(getItem))
92718               };
92719           }
92720
92721           for (var i = 0; i < all.collection.length; i++) {
92722               var preset = all.collection[i];
92723               var geometry = preset.geometry;
92724
92725               for (var j = 0; j < geometry.length; j++) {
92726                   var g = _index[geometry[j]];
92727                   for (var k in preset.tags) {
92728                       (g[k] = g[k] || []).push(preset);
92729                   }
92730               }
92731           }
92732           return all;
92733       };
92734
92735       all.init = function() {
92736           all.collection = [];
92737           _recent.collection = [];
92738           _fields = {};
92739           _universal = [];
92740           _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
92741
92742           return all.build(data.presets, true);
92743       };
92744
92745
92746       all.reset = function() {
92747           all.collection = [];
92748           _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
92749           _fields = {};
92750           _universal = [];
92751           _recent = presetCollection([]);
92752
92753           // Index of presets by (geometry, tag key).
92754           _index = {
92755               point: {},
92756               vertex: {},
92757               line: {},
92758               area: {},
92759               relation: {}
92760           };
92761
92762           return all;
92763       };
92764
92765       all.fromExternal = function(external, done) {
92766           all.reset();
92767           d3_json(external, function(err, externalPresets) {
92768               if (err) {
92769                   all.init();
92770               } else {
92771                   all.build(data.presets, false); // make default presets hidden to begin
92772                   all.build(externalPresets, true); // make the external visible
92773               }
92774               done(all);
92775           });
92776       };
92777
92778       all.field = function(id) {
92779           return _fields[id];
92780       };
92781
92782       all.universal = function() {
92783           return _universal;
92784       };
92785
92786       all.defaults = function(geometry, n) {
92787           var rec = _recent.matchGeometry(geometry).collection.slice(0, 4);
92788           var def = uniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
92789           return presetCollection(uniq(rec.concat(def).concat(all.item(geometry))));
92790       };
92791
92792       all.choose = function(preset) {
92793           if (preset.searchable !== false) {
92794               _recent = presetCollection(uniq([preset].concat(_recent.collection)));
92795           }
92796           return all;
92797       };
92798
92799       return all;
92800   }
92801
92802   var areaKeys = {};
92803
92804   function setAreaKeys(value) {
92805       areaKeys = value;
92806   }
92807
92808
92809   function coreContext() {
92810       var context = {};
92811       context.version = '2.14.2';
92812
92813       // create a special translation that contains the keys in place of the strings
92814       var tkeys = cloneDeep(en);
92815       var parents = [];
92816
92817       function traverser(v, k, obj) {
92818           parents.push(k);
92819           if (isObject(v)) {
92820               forOwn(v, traverser);
92821           } else if (isString(v)) {
92822               obj[k] = parents.join('.');
92823           }
92824           parents.pop();
92825       }
92826
92827       forOwn(tkeys, traverser);
92828       addTranslation('_tkeys_', tkeys);
92829
92830       addTranslation('en', en);
92831       setLocale('en');
92832
92833       var dispatch$1 = dispatch('enter', 'exit', 'change');
92834
92835       // https://github.com/openstreetmap/iD/issues/772
92836       // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
92837       var storage;
92838       try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
92839       storage = storage || (function() {
92840           var s = {};
92841           return {
92842               getItem: function(k) { return s[k]; },
92843               setItem: function(k, v) { s[k] = v; },
92844               removeItem: function(k) { delete s[k]; }
92845           };
92846       })();
92847
92848       context.storage = function(k, v) {
92849           try {
92850               if (arguments.length === 1) return storage.getItem(k);
92851               else if (v === null) storage.removeItem(k);
92852               else storage.setItem(k, v);
92853           } catch (e) {
92854               // localstorage quota exceeded
92855               /* eslint-disable no-console */
92856               if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
92857               /* eslint-enable no-console */
92858           }
92859       };
92860
92861
92862       /* User interface and keybinding */
92863       var ui;
92864       context.ui = function() { return ui; };
92865
92866       var keybinding = utilKeybinding('context');
92867       context.keybinding = function() { return keybinding; };
92868       select(document).call(keybinding);
92869
92870
92871       /* Straight accessors. Avoid using these if you can. */
92872       var connection, history, validator;
92873       context.connection = function() { return connection; };
92874       context.history = function() { return history; };
92875       context.validator = function() { return validator; };
92876
92877       /* Connection */
92878       context.preauth = function(options) {
92879           if (connection) {
92880               connection.switch(options);
92881           }
92882           return context;
92883       };
92884
92885       context.loadTiles = utilCallWhenIdle(function(projection, callback) {
92886           var cid;
92887           function done(err, result) {
92888               if (connection.getConnectionId() !== cid) {
92889                   if (callback) callback({ message: 'Connection Switched', status: -1 });
92890                   return;
92891               }
92892               if (!err) history.merge(result.data, result.extent);
92893               if (callback) callback(err, result);
92894           }
92895           if (connection && context.editable()) {
92896               cid = connection.getConnectionId();
92897               connection.loadTiles(projection, done);
92898           }
92899       });
92900
92901       context.loadEntity = function(entityID, callback) {
92902           var cid;
92903           function done(err, result) {
92904               if (connection.getConnectionId() !== cid) {
92905                   if (callback) callback({ message: 'Connection Switched', status: -1 });
92906                   return;
92907               }
92908               if (!err) history.merge(result.data, result.extent);
92909               if (callback) callback(err, result);
92910           }
92911           if (connection) {
92912               cid = connection.getConnectionId();
92913               connection.loadEntity(entityID, done);
92914           }
92915       };
92916
92917       context.zoomToEntity = function(entityID, zoomTo) {
92918           if (zoomTo !== false) {
92919               this.loadEntity(entityID, function(err, result) {
92920                   if (err) return;
92921                   var entity = find$1(result.data, function(e) { return e.id === entityID; });
92922                   if (entity) {
92923                       map.zoomTo(entity);
92924                   }
92925               });
92926           }
92927
92928           map.on('drawn.zoomToEntity', function() {
92929               if (!context.hasEntity(entityID)) return;
92930               map.on('drawn.zoomToEntity', null);
92931               context.on('enter.zoomToEntity', null);
92932               context.enter(modeSelect(context, [entityID]));
92933           });
92934
92935           context.on('enter.zoomToEntity', function() {
92936               if (mode.id !== 'browse') {
92937                   map.on('drawn.zoomToEntity', null);
92938                   context.on('enter.zoomToEntity', null);
92939               }
92940           });
92941       };
92942
92943       var minEditableZoom = 16;
92944       context.minEditableZoom = function(_) {
92945           if (!arguments.length) return minEditableZoom;
92946           minEditableZoom = _;
92947           if (connection) {
92948               connection.tileZoom(_);
92949           }
92950           return context;
92951       };
92952
92953
92954       /* History */
92955       var inIntro = false;
92956       context.inIntro = function(_) {
92957           if (!arguments.length) return inIntro;
92958           inIntro = _;
92959           return context;
92960       };
92961
92962       context.save = function() {
92963           // no history save, no message onbeforeunload
92964           if (inIntro || select('.modal').size()) return;
92965
92966           var canSave;
92967           if (mode && mode.id === 'save') {
92968               canSave = false;
92969
92970               // Attempt to prevent user from creating duplicate changes - see #5200
92971               if (services.osm && services.osm.isChangesetInflight()) {
92972                   history.clearSaved();
92973                   return;
92974               }
92975
92976           } else {
92977               canSave = context.selectedIDs().every(function(id) {
92978                   var entity = context.hasEntity(id);
92979                   return entity && !entity.isDegenerate();
92980               });
92981           }
92982
92983           if (canSave) {
92984               history.save();
92985           }
92986           if (history.hasChanges()) {
92987               return t('save.unsaved_changes');
92988           }
92989       };
92990
92991
92992       /* Graph */
92993       context.hasEntity = function(id) {
92994           return history.graph().hasEntity(id);
92995       };
92996       context.entity = function(id) {
92997           return history.graph().entity(id);
92998       };
92999       context.childNodes = function(way) {
93000           return history.graph().childNodes(way);
93001       };
93002       context.geometry = function(id) {
93003           return context.entity(id).geometry(history.graph());
93004       };
93005
93006
93007       /* Modes */
93008       var mode;
93009       context.mode = function() {
93010           return mode;
93011       };
93012       context.enter = function(newMode) {
93013           if (mode) {
93014               mode.exit();
93015               dispatch$1.call('exit', this, mode);
93016           }
93017
93018           mode = newMode;
93019           mode.enter();
93020           dispatch$1.call('enter', this, mode);
93021       };
93022
93023       context.selectedIDs = function() {
93024           if (mode && mode.selectedIDs) {
93025               return mode.selectedIDs();
93026           } else {
93027               return [];
93028           }
93029       };
93030
93031       context.activeID = function() {
93032           return mode && mode.activeID && mode.activeID();
93033       };
93034
93035       var _selectedNoteID;
93036       context.selectedNoteID = function(noteID) {
93037           if (!arguments.length) return _selectedNoteID;
93038           _selectedNoteID = noteID;
93039           return context;
93040       };
93041
93042       var _selectedErrorID;
93043       context.selectedErrorID = function(errorID) {
93044           if (!arguments.length) return _selectedErrorID;
93045           _selectedErrorID = errorID;
93046           return context;
93047       };
93048
93049
93050       /* Behaviors */
93051       context.install = function(behavior) {
93052           context.surface().call(behavior);
93053       };
93054       context.uninstall = function(behavior) {
93055           context.surface().call(behavior.off);
93056       };
93057
93058
93059       /* Copy/Paste */
93060       var copyIDs = [], copyGraph;
93061       context.copyGraph = function() { return copyGraph; };
93062       context.copyIDs = function(_) {
93063           if (!arguments.length) return copyIDs;
93064           copyIDs = _;
93065           copyGraph = history.graph();
93066           return context;
93067       };
93068
93069
93070       /* Background */
93071       var background;
93072       context.background = function() { return background; };
93073
93074
93075       /* Features */
93076       var features;
93077       context.features = function() { return features; };
93078       context.hasHiddenConnections = function(id) {
93079           var graph = history.graph(),
93080               entity = graph.entity(id);
93081           return features.hasHiddenConnections(entity, graph);
93082       };
93083
93084
93085       /* Presets */
93086       var presets;
93087       context.presets = function() { return presets; };
93088
93089
93090       /* Map */
93091       var map;
93092       context.map = function() { return map; };
93093       context.layers = function() { return map.layers; };
93094       context.surface = function() { return map.surface; };
93095       context.editable = function() { return map.editable(); };
93096       context.surfaceRect = function() {
93097           return map.surface.node().getBoundingClientRect();
93098       };
93099
93100
93101       /* Debug */
93102       var debugFlags = {
93103           tile: false,        // tile boundaries
93104           collision: false,   // label collision bounding boxes
93105           imagery: false,     // imagery bounding polygons
93106           community: false,   // community bounding polygons
93107           imperial: false,    // imperial (not metric) bounding polygons
93108           driveLeft: false,   // driveLeft bounding polygons
93109           target: false       // touch targets
93110       };
93111       context.debugFlags = function() {
93112           return debugFlags;
93113       };
93114       context.setDebug = function(flag, val) {
93115           if (arguments.length === 1) val = true;
93116           debugFlags[flag] = val;
93117           dispatch$1.call('change');
93118           return context;
93119       };
93120       context.getDebug = function(flag) {
93121           return flag && debugFlags[flag];
93122       };
93123
93124
93125       /* Container */
93126       var container = select(document.body);
93127       context.container = function(_) {
93128           if (!arguments.length) return container;
93129           container = _;
93130           container.classed('id-container', true);
93131           return context;
93132       };
93133       var embed;
93134       context.embed = function(_) {
93135           if (!arguments.length) return embed;
93136           embed = _;
93137           return context;
93138       };
93139
93140
93141       /* Assets */
93142       var assetPath = '';
93143       context.assetPath = function(_) {
93144           if (!arguments.length) return assetPath;
93145           assetPath = _;
93146           return context;
93147       };
93148
93149       var assetMap = {};
93150       context.assetMap = function(_) {
93151           if (!arguments.length) return assetMap;
93152           assetMap = _;
93153           return context;
93154       };
93155
93156       context.asset = function(_) {
93157           var filename = assetPath + _;
93158           return assetMap[filename] || filename;
93159       };
93160
93161       context.imagePath = function(_) {
93162           return context.asset('img/' + _);
93163       };
93164
93165
93166       /* locales */
93167       // `locale` variable contains a "requested locale".
93168       // It won't become the `currentLocale` until after loadLocale() is called.
93169       var locale, localePath;
93170
93171       context.locale = function(loc, path) {
93172           if (!arguments.length) return currentLocale;
93173           locale = loc;
93174           localePath = path;
93175           return context;
93176       };
93177
93178       context.loadLocale = function(callback) {
93179           if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
93180               localePath = localePath || context.asset('locales/' + locale + '.json');
93181               d3_json(localePath, function(err, result) {
93182                   if (!err) {
93183                       addTranslation(locale, result[locale]);
93184                       setLocale(locale);
93185                       utilDetect(true);
93186                   }
93187                   if (callback) {
93188                       callback(err);
93189                   }
93190               });
93191           } else {
93192               if (locale) {
93193                   setLocale(locale);
93194                   utilDetect(true);
93195               }
93196               if (callback) {
93197                   callback();
93198               }
93199           }
93200       };
93201
93202
93203       /* reset (aka flush) */
93204       context.reset = context.flush = function() {
93205           context.debouncedSave.cancel();
93206           forEach(services, function(service) {
93207               if (service && typeof service.reset === 'function') {
93208                   service.reset(context);
93209               }
93210           });
93211           features.reset();
93212           history.reset();
93213           return context;
93214       };
93215
93216
93217       /* Init */
93218
93219       context.projection = geoRawMercator();
93220       context.curtainProjection = geoRawMercator();
93221
93222       locale = utilDetect().locale;
93223       if (locale && !dataLocales.hasOwnProperty(locale)) {
93224           locale = locale.split('-')[0];
93225       }
93226
93227       history = coreHistory(context);
93228
93229       context.graph = history.graph;
93230       context.changes = history.changes;
93231       context.intersects = history.intersects;
93232
93233       validator = coreValidator(context);
93234
93235       // run validation upon restoring from page reload
93236       history.on('restore', function() {
93237           validator.validate();
93238       });
93239       // re-run validation upon a significant graph change
93240       history.on('annotatedChange', function(difference) {
93241           if (difference) {
93242               validator.validate();
93243           }
93244       });
93245       // re-run validation upon merging fetched data
93246       history.on('merge', function(entities) {
93247           if (entities && entities.length > 0) {
93248               validator.validate();
93249           }
93250       });
93251
93252       // Debounce save, since it's a synchronous localStorage write,
93253       // and history changes can happen frequently (e.g. when dragging).
93254       context.debouncedSave = debounce(context.save, 350);
93255       function withDebouncedSave(fn) {
93256           return function() {
93257               var result = fn.apply(history, arguments);
93258               context.debouncedSave();
93259               return result;
93260           };
93261       }
93262
93263       context.perform = withDebouncedSave(history.perform);
93264       context.replace = withDebouncedSave(history.replace);
93265       context.pop = withDebouncedSave(history.pop);
93266       context.overwrite = withDebouncedSave(history.overwrite);
93267       context.undo = withDebouncedSave(history.undo);
93268       context.redo = withDebouncedSave(history.redo);
93269
93270       ui = uiInit(context);
93271
93272       connection = services.osm;
93273       background = rendererBackground(context);
93274       features = rendererFeatures(context);
93275       presets = presetIndex();
93276
93277       if (services.maprules && utilStringQs(window.location.hash).maprules) {
93278           var maprules = utilStringQs(window.location.hash).maprules;
93279           d3_json(maprules, function (err, mapcss) {
93280               if (err) return;
93281               services.maprules.init();
93282               forEach(mapcss, function(mapcssSelector) {
93283                   return services.maprules.addRule(mapcssSelector);
93284               });
93285           });
93286       }
93287
93288       map = rendererMap(context);
93289       context.mouse = map.mouse;
93290       context.extent = map.extent;
93291       context.pan = map.pan;
93292       context.zoomIn = map.zoomIn;
93293       context.zoomOut = map.zoomOut;
93294       context.zoomInFurther = map.zoomInFurther;
93295       context.zoomOutFurther = map.zoomOutFurther;
93296       context.redrawEnable = map.redrawEnable;
93297
93298       forEach(services, function(service) {
93299           if (service && typeof service.init === 'function') {
93300               service.init(context);
93301           }
93302       });
93303
93304       background.init();
93305       features.init();
93306       if (utilStringQs(window.location.hash).presets) {
93307           var external = utilStringQs(window.location.hash).presets;
93308           presets.fromExternal(external, function(externalPresets) {
93309               context.presets = function() { return externalPresets; }; // default + external presets...
93310               areaKeys = presets.areaKeys();
93311           });
93312       } else {
93313           presets.init();
93314           areaKeys = presets.areaKeys();
93315       }
93316
93317       return utilRebind(context, dispatch$1, 'on');
93318   }
93319
93320   function osmWay() {
93321       if (!(this instanceof osmWay)) {
93322           return (new osmWay()).initialize(arguments);
93323       } else if (arguments.length) {
93324           this.initialize(arguments);
93325       }
93326   }
93327
93328
93329   osmEntity.way = osmWay;
93330
93331   osmWay.prototype = Object.create(osmEntity.prototype);
93332
93333
93334   assignIn(osmWay.prototype, {
93335       type: 'way',
93336       nodes: [],
93337
93338
93339       copy: function(resolver, copies) {
93340           if (copies[this.id]) return copies[this.id];
93341
93342           var copy = osmEntity.prototype.copy.call(this, resolver, copies);
93343
93344           var nodes = this.nodes.map(function(id) {
93345               return resolver.entity(id).copy(resolver, copies).id;
93346           });
93347
93348           copy = copy.update({ nodes: nodes });
93349           copies[this.id] = copy;
93350
93351           return copy;
93352       },
93353
93354
93355       extent: function(resolver) {
93356           return resolver.transient(this, 'extent', function() {
93357               var extent = geoExtent();
93358               for (var i = 0; i < this.nodes.length; i++) {
93359                   var node = resolver.hasEntity(this.nodes[i]);
93360                   if (node) {
93361                       extent._extend(node.extent());
93362                   }
93363               }
93364               return extent;
93365           });
93366       },
93367
93368
93369       first: function() {
93370           return this.nodes[0];
93371       },
93372
93373
93374       last: function() {
93375           return this.nodes[this.nodes.length - 1];
93376       },
93377
93378
93379       contains: function(node) {
93380           return this.nodes.indexOf(node) >= 0;
93381       },
93382
93383
93384       affix: function(node) {
93385           if (this.nodes[0] === node) return 'prefix';
93386           if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
93387       },
93388
93389
93390       layer: function() {
93391           // explicit layer tag, clamp between -10, 10..
93392           if (isFinite(this.tags.layer)) {
93393               return Math.max(-10, Math.min(+(this.tags.layer), 10));
93394           }
93395
93396           // implied layer tag..
93397           if (this.tags.covered === 'yes') return -1;
93398           if (this.tags.location === 'overground') return 1;
93399           if (this.tags.location === 'underground') return -1;
93400           if (this.tags.location === 'underwater') return -10;
93401
93402           if (this.tags.power === 'line') return 10;
93403           if (this.tags.power === 'minor_line') return 10;
93404           if (this.tags.aerialway) return 10;
93405           if (this.tags.bridge) return 1;
93406           if (this.tags.cutting) return -1;
93407           if (this.tags.tunnel) return -1;
93408           if (this.tags.waterway) return -1;
93409           if (this.tags.man_made === 'pipeline') return -10;
93410           if (this.tags.boundary) return -10;
93411           return 0;
93412       },
93413
93414
93415       isOneWay: function() {
93416           // explicit oneway tag..
93417           var values = {
93418               'yes': true,
93419               '1': true,
93420               '-1': true,
93421               'reversible': true,
93422               'alternating': true,
93423               'no': false,
93424               '0': false
93425           };
93426           if (values[this.tags.oneway] !== undefined) {
93427               return values[this.tags.oneway];
93428           }
93429
93430           // implied oneway tag..
93431           for (var key in this.tags) {
93432               if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
93433                   return true;
93434           }
93435           return false;
93436       },
93437
93438       // Some identifier for tag that implies that this way is "sided",
93439       // i.e. the right side is the 'inside' (e.g. the right side of a
93440       // natural=cliff is lower).
93441       sidednessIdentifier: function() {
93442           for (var key in this.tags) {
93443               var value = this.tags[key];
93444               if (key in osmRightSideIsInsideTags && (value in osmRightSideIsInsideTags[key])) {
93445                   if (osmRightSideIsInsideTags[key][value] === true) {
93446                       return key;
93447                   } else {
93448                       // if the map's value is something other than a
93449                       // literal true, we should use it so we can
93450                       // special case some keys (e.g. natural=coastline
93451                       // is handled differently to other naturals).
93452                       return osmRightSideIsInsideTags[key][value];
93453                   }
93454               }
93455           }
93456
93457           return null;
93458       },
93459       isSided: function() {
93460           if (this.tags.two_sided === 'yes') {
93461               return false;
93462           }
93463
93464           return this.sidednessIdentifier() != null;
93465       },
93466
93467       lanes: function() {
93468           return osmLanes(this);
93469       },
93470
93471
93472       isClosed: function() {
93473           return this.nodes.length > 1 && this.first() === this.last();
93474       },
93475
93476
93477       isConvex: function(resolver) {
93478           if (!this.isClosed() || this.isDegenerate()) return null;
93479
93480           var nodes = uniq(resolver.childNodes(this));
93481           var coords = map$3(nodes, 'loc');
93482           var curr = 0;
93483           var prev = 0;
93484
93485           for (var i = 0; i < coords.length; i++) {
93486               var o = coords[(i+1) % coords.length];
93487               var a = coords[i];
93488               var b = coords[(i+2) % coords.length];
93489               var res = geoVecCross(a, b, o);
93490
93491               curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
93492               if (curr === 0) {
93493                   continue;
93494               } else if (prev && curr !== prev) {
93495                   return false;
93496               }
93497               prev = curr;
93498           }
93499           return true;
93500       },
93501
93502       // returns an objects with the tag that implies this is an area, if any
93503       tagSuggestingArea: function() {
93504
93505           if (this.tags.area === 'yes') return { area: 'yes' };
93506           if (this.tags.area === 'no') return null;
93507
93508           // `highway` and `railway` are typically linear features, but there
93509           // are a few exceptions that should be treated as areas, even in the
93510           // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
93511           var lineKeys = {
93512               highway: {
93513                   rest_area: true,
93514                   services: true
93515               },
93516               railway: {
93517                   roundhouse: true,
93518                   station: true,
93519                   traverser: true,
93520                   turntable: true,
93521                   wash: true
93522               }
93523           };
93524           var returnTags = {};
93525           for (var key in this.tags) {
93526               if (key in areaKeys && !(this.tags[key] in areaKeys[key])) {
93527                   returnTags[key] = this.tags[key];
93528                   return returnTags;
93529               }
93530               if (key in lineKeys && this.tags[key] in lineKeys[key]) {
93531                   returnTags[key] = this.tags[key];
93532                   return returnTags;
93533               }
93534           }
93535           return null;
93536       },
93537
93538       isArea: function() {
93539
93540           if (this.tags.area === 'yes')
93541               return true;
93542           if (!this.isClosed() || this.tags.area === 'no')
93543               return false;
93544           return this.tagSuggestingArea() !== null;
93545       },
93546
93547
93548       isDegenerate: function() {
93549           return uniq(this.nodes).length < (this.isArea() ? 3 : 2);
93550       },
93551
93552
93553       areAdjacent: function(n1, n2) {
93554           for (var i = 0; i < this.nodes.length; i++) {
93555               if (this.nodes[i] === n1) {
93556                   if (this.nodes[i - 1] === n2) return true;
93557                   if (this.nodes[i + 1] === n2) return true;
93558               }
93559           }
93560           return false;
93561       },
93562
93563
93564       geometry: function(graph) {
93565           return graph.transient(this, 'geometry', function() {
93566               return this.isArea() ? 'area' : 'line';
93567           });
93568       },
93569
93570
93571       // If this way is not closed, append the beginning node to the end of the nodelist to close it.
93572       close: function() {
93573           if (this.isClosed() || !this.nodes.length) return this;
93574
93575           var nodes = this.nodes.slice();
93576           nodes = nodes.filter(noRepeatNodes);
93577           nodes.push(nodes[0]);
93578           return this.update({ nodes: nodes });
93579       },
93580
93581
93582       // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
93583       unclose: function() {
93584           if (!this.isClosed()) return this;
93585
93586           var nodes = this.nodes.slice();
93587           var connector = this.first();
93588           var i = nodes.length - 1;
93589
93590           // remove trailing connectors..
93591           while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
93592               nodes.splice(i, 1);
93593               i = nodes.length - 1;
93594           }
93595
93596           nodes = nodes.filter(noRepeatNodes);
93597           return this.update({ nodes: nodes });
93598       },
93599
93600
93601       // Adds a node (id) in front of the node which is currently at position index.
93602       // If index is undefined, the node will be added to the end of the way for linear ways,
93603       //   or just before the final connecting node for circular ways.
93604       // Consecutive duplicates are eliminated including existing ones.
93605       // Circularity is always preserved when adding a node.
93606       addNode: function(id, index) {
93607           var nodes = this.nodes.slice();
93608           var isClosed = this.isClosed();
93609           var max = isClosed ? nodes.length - 1 : nodes.length;
93610
93611           if (index === undefined) {
93612               index = max;
93613           }
93614
93615           if (index < 0 || index > max) {
93616               throw new RangeError('index ' + index + ' out of range 0..' + max);
93617           }
93618
93619           // If this is a closed way, remove all connector nodes except the first one
93620           // (there may be duplicates) and adjust index if necessary..
93621           if (isClosed) {
93622               var connector = this.first();
93623
93624               // leading connectors..
93625               var i = 1;
93626               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
93627                   nodes.splice(i, 1);
93628                   if (index > i) index--;
93629               }
93630
93631               // trailing connectors..
93632               i = nodes.length - 1;
93633               while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
93634                   nodes.splice(i, 1);
93635                   if (index > i) index--;
93636                   i = nodes.length - 1;
93637               }
93638           }
93639
93640           nodes.splice(index, 0, id);
93641           nodes = nodes.filter(noRepeatNodes);
93642
93643           // If the way was closed before, append a connector node to keep it closed..
93644           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
93645               nodes.push(nodes[0]);
93646           }
93647
93648           return this.update({ nodes: nodes });
93649       },
93650
93651
93652       // Replaces the node which is currently at position index with the given node (id).
93653       // Consecutive duplicates are eliminated including existing ones.
93654       // Circularity is preserved when updating a node.
93655       updateNode: function(id, index) {
93656           var nodes = this.nodes.slice();
93657           var isClosed = this.isClosed();
93658           var max = nodes.length - 1;
93659
93660           if (index === undefined || index < 0 || index > max) {
93661               throw new RangeError('index ' + index + ' out of range 0..' + max);
93662           }
93663
93664           // If this is a closed way, remove all connector nodes except the first one
93665           // (there may be duplicates) and adjust index if necessary..
93666           if (isClosed) {
93667               var connector = this.first();
93668
93669               // leading connectors..
93670               var i = 1;
93671               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
93672                   nodes.splice(i, 1);
93673                   if (index > i) index--;
93674               }
93675
93676               // trailing connectors..
93677               i = nodes.length - 1;
93678               while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
93679                   nodes.splice(i, 1);
93680                   if (index === i) index = 0;  // update leading connector instead
93681                   i = nodes.length - 1;
93682               }
93683           }
93684
93685           nodes.splice(index, 1, id);
93686           nodes = nodes.filter(noRepeatNodes);
93687
93688           // If the way was closed before, append a connector node to keep it closed..
93689           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
93690               nodes.push(nodes[0]);
93691           }
93692
93693           return this.update({nodes: nodes});
93694       },
93695
93696
93697       // Replaces each occurrence of node id needle with replacement.
93698       // Consecutive duplicates are eliminated including existing ones.
93699       // Circularity is preserved.
93700       replaceNode: function(needleID, replacementID) {
93701           var nodes = this.nodes.slice();
93702           var isClosed = this.isClosed();
93703
93704           for (var i = 0; i < nodes.length; i++) {
93705               if (nodes[i] === needleID) {
93706                   nodes[i] = replacementID;
93707               }
93708           }
93709
93710           nodes = nodes.filter(noRepeatNodes);
93711
93712           // If the way was closed before, append a connector node to keep it closed..
93713           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
93714               nodes.push(nodes[0]);
93715           }
93716
93717           return this.update({nodes: nodes});
93718       },
93719
93720
93721       // Removes each occurrence of node id.
93722       // Consecutive duplicates are eliminated including existing ones.
93723       // Circularity is preserved.
93724       removeNode: function(id) {
93725           var nodes = this.nodes.slice();
93726           var isClosed = this.isClosed();
93727
93728           nodes = nodes
93729               .filter(function(node) { return node !== id; })
93730               .filter(noRepeatNodes);
93731
93732           // If the way was closed before, append a connector node to keep it closed..
93733           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
93734               nodes.push(nodes[0]);
93735           }
93736
93737           return this.update({nodes: nodes});
93738       },
93739
93740
93741       asJXON: function(changeset_id) {
93742           var r = {
93743               way: {
93744                   '@id': this.osmId(),
93745                   '@version': this.version || 0,
93746                   nd: map$3(this.nodes, function(id) {
93747                       return { keyAttributes: { ref: osmEntity.id.toOSM(id) } };
93748                   }),
93749                   tag: map$3(this.tags, function(v, k) {
93750                       return { keyAttributes: { k: k, v: v } };
93751                   })
93752               }
93753           };
93754           if (changeset_id) {
93755               r.way['@changeset'] = changeset_id;
93756           }
93757           return r;
93758       },
93759
93760
93761       asGeoJSON: function(resolver) {
93762           return resolver.transient(this, 'GeoJSON', function() {
93763               var coordinates = map$3(resolver.childNodes(this), 'loc');
93764               if (this.isArea() && this.isClosed()) {
93765                   return {
93766                       type: 'Polygon',
93767                       coordinates: [coordinates]
93768                   };
93769               } else {
93770                   return {
93771                       type: 'LineString',
93772                       coordinates: coordinates
93773                   };
93774               }
93775           });
93776       },
93777
93778
93779       area: function(resolver) {
93780           return resolver.transient(this, 'area', function() {
93781               var nodes = resolver.childNodes(this);
93782
93783               var json = {
93784                   type: 'Polygon',
93785                   coordinates: [map$3(nodes, 'loc')]
93786               };
93787
93788               if (!this.isClosed() && nodes.length) {
93789                   json.coordinates[0].push(nodes[0].loc);
93790               }
93791
93792               var area = d3_geoArea(json);
93793
93794               // Heuristic for detecting counterclockwise winding order. Assumes
93795               // that OpenStreetMap polygons are not hemisphere-spanning.
93796               if (area > 2 * Math.PI) {
93797                   json.coordinates[0] = json.coordinates[0].reverse();
93798                   area = d3_geoArea(json);
93799               }
93800
93801               return isNaN(area) ? 0 : area;
93802           });
93803       }
93804   });
93805
93806
93807   // Filter function to eliminate consecutive duplicates.
93808   function noRepeatNodes(node, i, arr) {
93809       return i === 0 || node !== arr[i - 1];
93810   }
93811
93812   // "Old" multipolyons, previously known as "simple" multipolygons, are as follows:
93813   //
93814   // 1. Relation tagged with `type=multipolygon` and no interesting tags.
93815   // 2. One and only one member with the `outer` role. Must be a way with interesting tags.
93816   // 3. No members without a role.
93817   //
93818   // Old multipolygons are no longer recommended but are still rendered as areas by iD.
93819
93820   function osmOldMultipolygonOuterMemberOfRelation(entity, graph) {
93821       if (entity.type !== 'relation' ||
93822           !entity.isMultipolygon()
93823           || Object.keys(entity.tags).filter(osmIsInterestingTag).length > 1) {
93824           return false;
93825       }
93826
93827       var outerMember;
93828       for (var memberIndex in entity.members) {
93829           var member = entity.members[memberIndex];
93830           if (!member.role) return false;
93831           if (member.role === 'outer') {
93832               if (outerMember) return false;
93833               if (member.type !== 'way') return false;
93834               if (!graph.hasEntity(member.id)) return false;
93835
93836               outerMember = graph.entity(member.id);
93837
93838               if (Object.keys(outerMember.tags).filter(osmIsInterestingTag).length === 0) {
93839                   return false;
93840               }
93841           }
93842       }
93843
93844       return outerMember;
93845   }
93846
93847   // For fixing up rendering of multipolygons with tags on the outer member.
93848   // https://github.com/openstreetmap/iD/issues/613
93849   function osmIsOldMultipolygonOuterMember(entity, graph) {
93850       if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
93851           return false;
93852
93853       var parents = graph.parentRelations(entity);
93854       if (parents.length !== 1)
93855           return false;
93856
93857       var parent = parents[0];
93858       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
93859           return false;
93860
93861       var members = parent.members, member;
93862       for (var i = 0; i < members.length; i++) {
93863           member = members[i];
93864           if (member.id === entity.id && member.role && member.role !== 'outer')
93865               return false; // Not outer member
93866           if (member.id !== entity.id && (!member.role || member.role === 'outer'))
93867               return false; // Not a simple multipolygon
93868       }
93869
93870       return parent;
93871   }
93872
93873
93874   function osmOldMultipolygonOuterMember(entity, graph) {
93875       if (entity.type !== 'way')
93876           return false;
93877
93878       var parents = graph.parentRelations(entity);
93879       if (parents.length !== 1)
93880           return false;
93881
93882       var parent = parents[0];
93883       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
93884           return false;
93885
93886       var members = parent.members, member, outerMember;
93887       for (var i = 0; i < members.length; i++) {
93888           member = members[i];
93889           if (!member.role || member.role === 'outer') {
93890               if (outerMember)
93891                   return false; // Not a simple multipolygon
93892               outerMember = member;
93893           }
93894       }
93895
93896       if (!outerMember)
93897           return false;
93898
93899       var outerEntity = graph.hasEntity(outerMember.id);
93900       if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
93901           return false;
93902
93903       return outerEntity;
93904   }
93905
93906
93907   // Join `toJoin` array into sequences of connecting ways.
93908
93909   // Segments which share identical start/end nodes will, as much as possible,
93910   // be connected with each other.
93911   //
93912   // The return value is a nested array. Each constituent array contains elements
93913   // of `toJoin` which have been determined to connect.
93914   //
93915   // Each consitituent array also has a `nodes` property whose value is an
93916   // ordered array of member nodes, with appropriate order reversal and
93917   // start/end coordinate de-duplication.
93918   //
93919   // Members of `toJoin` must have, at minimum, `type` and `id` properties.
93920   // Thus either an array of `osmWay`s or a relation member array may be used.
93921   //
93922   // If an member is an `osmWay`, its tags and childnodes may be reversed via
93923   // `actionReverse` in the output.
93924   //
93925   // The returned sequences array also has an `actions` array property, containing
93926   // any reversal actions that should be applied to the graph, should the calling
93927   // code attempt to actually join the given ways.
93928   //
93929   // Incomplete members (those for which `graph.hasEntity(element.id)` returns
93930   // false) and non-way members are ignored.
93931   //
93932   function osmJoinWays(toJoin, graph) {
93933       function resolve(member) {
93934           return graph.childNodes(graph.entity(member.id));
93935       }
93936
93937       function reverse(item) {
93938           var action = actionReverse(item.id, { reverseOneway: true });
93939           sequences.actions.push(action);
93940           return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
93941       }
93942
93943       // make a copy containing only the items to join
93944       toJoin = toJoin.filter(function(member) {
93945           return member.type === 'way' && graph.hasEntity(member.id);
93946       });
93947
93948       // Are the things we are joining relation members or `osmWays`?
93949       // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
93950       var i;
93951       var joinAsMembers = true;
93952       for (i = 0; i < toJoin.length; i++) {
93953           if (toJoin[i] instanceof osmWay) {
93954               joinAsMembers = false;
93955               break;
93956           }
93957       }
93958
93959       var sequences = [];
93960       sequences.actions = [];
93961
93962       while (toJoin.length) {
93963           // start a new sequence
93964           var item = toJoin.shift();
93965           var currWays = [item];
93966           var currNodes = resolve(item).slice();
93967           var doneSequence = false;
93968
93969           // add to it
93970           while (toJoin.length && !doneSequence) {
93971               var start = currNodes[0];
93972               var end = currNodes[currNodes.length - 1];
93973               var fn = null;
93974               var nodes = null;
93975
93976               // Find the next way/member to join.
93977               for (i = 0; i < toJoin.length; i++) {
93978                   item = toJoin[i];
93979                   nodes = resolve(item);
93980
93981                   // (for member ordering only, not way ordering - see #4872)
93982                   // Strongly prefer to generate a forward path that preserves the order
93983                   // of the members array. For multipolygons and most relations, member
93984                   // order does not matter - but for routes, it does. (see #4589)
93985                   // If we started this sequence backwards (i.e. next member way attaches to
93986                   // the start node and not the end node), reverse the initial way before continuing.
93987                   if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
93988                       (nodes[nodes.length - 1] === start || nodes[0] === start)
93989                   ) {
93990                       currWays[0] = reverse(currWays[0]);
93991                       currNodes.reverse();
93992                       start = currNodes[0];
93993                       end = currNodes[currNodes.length - 1];
93994                   }
93995
93996                   if (nodes[0] === end) {
93997                       fn = currNodes.push;               // join to end
93998                       nodes = nodes.slice(1);
93999                       break;
94000                   } else if (nodes[nodes.length - 1] === end) {
94001                       fn = currNodes.push;               // join to end
94002                       nodes = nodes.slice(0, -1).reverse();
94003                       item = reverse(item);
94004                       break;
94005                   } else if (nodes[nodes.length - 1] === start) {
94006                       fn = currNodes.unshift;            // join to beginning
94007                       nodes = nodes.slice(0, -1);
94008                       break;
94009                   } else if (nodes[0] === start) {
94010                       fn = currNodes.unshift;            // join to beginning
94011                       nodes = nodes.slice(1).reverse();
94012                       item = reverse(item);
94013                       break;
94014                   } else {
94015                       fn = nodes = null;
94016                   }
94017               }
94018
94019               if (!nodes) {     // couldn't find a joinable way/member
94020                   doneSequence = true;
94021                   break;
94022               }
94023
94024               fn.apply(currWays, [item]);
94025               fn.apply(currNodes, nodes);
94026
94027               toJoin.splice(i, 1);
94028           }
94029
94030           currWays.nodes = currNodes;
94031           sequences.push(currWays);
94032       }
94033
94034       return sequences;
94035   }
94036
94037   function osmRelation() {
94038       if (!(this instanceof osmRelation)) {
94039           return (new osmRelation()).initialize(arguments);
94040       } else if (arguments.length) {
94041           this.initialize(arguments);
94042       }
94043   }
94044
94045
94046   osmEntity.relation = osmRelation;
94047
94048   osmRelation.prototype = Object.create(osmEntity.prototype);
94049
94050
94051   osmRelation.creationOrder = function(a, b) {
94052       var aId = parseInt(osmEntity.id.toOSM(a.id), 10);
94053       var bId = parseInt(osmEntity.id.toOSM(b.id), 10);
94054
94055       if (aId < 0 || bId < 0) return aId - bId;
94056       return bId - aId;
94057   };
94058
94059
94060   assignIn(osmRelation.prototype, {
94061       type: 'relation',
94062       members: [],
94063
94064
94065       copy: function(resolver, copies) {
94066           if (copies[this.id]) return copies[this.id];
94067
94068           var copy = osmEntity.prototype.copy.call(this, resolver, copies);
94069
94070           var members = this.members.map(function(member) {
94071               return assignIn({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
94072           });
94073
94074           copy = copy.update({members: members});
94075           copies[this.id] = copy;
94076
94077           return copy;
94078       },
94079
94080
94081       extent: function(resolver, memo) {
94082           return resolver.transient(this, 'extent', function() {
94083               if (memo && memo[this.id]) return geoExtent();
94084               memo = memo || {};
94085               memo[this.id] = true;
94086
94087               var extent = geoExtent();
94088               for (var i = 0; i < this.members.length; i++) {
94089                   var member = resolver.hasEntity(this.members[i].id);
94090                   if (member) {
94091                       extent._extend(member.extent(resolver, memo));
94092                   }
94093               }
94094               return extent;
94095           });
94096       },
94097
94098
94099       geometry: function(graph) {
94100           return graph.transient(this, 'geometry', function() {
94101               return this.isMultipolygon() ? 'area' : 'relation';
94102           });
94103       },
94104
94105
94106       isDegenerate: function() {
94107           return this.members.length === 0;
94108       },
94109
94110
94111       // Return an array of members, each extended with an 'index' property whose value
94112       // is the member index.
94113       indexedMembers: function() {
94114           var result = new Array(this.members.length);
94115           for (var i = 0; i < this.members.length; i++) {
94116               result[i] = assignIn({}, this.members[i], {index: i});
94117           }
94118           return result;
94119       },
94120
94121
94122       // Return the first member with the given role. A copy of the member object
94123       // is returned, extended with an 'index' property whose value is the member index.
94124       memberByRole: function(role) {
94125           for (var i = 0; i < this.members.length; i++) {
94126               if (this.members[i].role === role) {
94127                   return assignIn({}, this.members[i], {index: i});
94128               }
94129           }
94130       },
94131
94132       // Same as memberByRole, but returns all members with the given role
94133       membersByRole: function(role) {
94134           var result = [];
94135           for (var i = 0; i < this.members.length; i++) {
94136               if (this.members[i].role === role) {
94137                   result.push(assignIn({}, this.members[i], {index: i}));
94138               }
94139           }
94140           return result;
94141       },
94142
94143       // Return the first member with the given id. A copy of the member object
94144       // is returned, extended with an 'index' property whose value is the member index.
94145       memberById: function(id) {
94146           for (var i = 0; i < this.members.length; i++) {
94147               if (this.members[i].id === id) {
94148                   return assignIn({}, this.members[i], {index: i});
94149               }
94150           }
94151       },
94152
94153
94154       // Return the first member with the given id and role. A copy of the member object
94155       // is returned, extended with an 'index' property whose value is the member index.
94156       memberByIdAndRole: function(id, role) {
94157           for (var i = 0; i < this.members.length; i++) {
94158               if (this.members[i].id === id && this.members[i].role === role) {
94159                   return assignIn({}, this.members[i], {index: i});
94160               }
94161           }
94162       },
94163
94164
94165       addMember: function(member, index) {
94166           var members = this.members.slice();
94167           members.splice(index === undefined ? members.length : index, 0, member);
94168           return this.update({members: members});
94169       },
94170
94171
94172       updateMember: function(member, index) {
94173           var members = this.members.slice();
94174           members.splice(index, 1, assignIn({}, members[index], member));
94175           return this.update({members: members});
94176       },
94177
94178
94179       removeMember: function(index) {
94180           var members = this.members.slice();
94181           members.splice(index, 1);
94182           return this.update({members: members});
94183       },
94184
94185
94186       removeMembersWithID: function(id) {
94187           var members = reject(this.members, function(m) { return m.id === id; });
94188           return this.update({members: members});
94189       },
94190
94191
94192       // Wherever a member appears with id `needle.id`, replace it with a member
94193       // with id `replacement.id`, type `replacement.type`, and the original role,
94194       // By default, adding a duplicate member (by id and role) is prevented.
94195       // Return an updated relation.
94196       replaceMember: function(needle, replacement, keepDuplicates) {
94197           if (!this.memberById(needle.id))
94198               return this;
94199
94200           var members = [];
94201
94202           for (var i = 0; i < this.members.length; i++) {
94203               var member = this.members[i];
94204               if (member.id !== needle.id) {
94205                   members.push(member);
94206               } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
94207                   members.push({id: replacement.id, type: replacement.type, role: member.role});
94208               }
94209           }
94210
94211           return this.update({members: members});
94212       },
94213
94214
94215       asJXON: function(changeset_id) {
94216           var r = {
94217               relation: {
94218                   '@id': this.osmId(),
94219                   '@version': this.version || 0,
94220                   member: map$3(this.members, function(member) {
94221                       return {
94222                           keyAttributes: {
94223                               type: member.type,
94224                               role: member.role,
94225                               ref: osmEntity.id.toOSM(member.id)
94226                           }
94227                       };
94228                   }),
94229                   tag: map$3(this.tags, function(v, k) {
94230                       return { keyAttributes: { k: k, v: v } };
94231                   })
94232               }
94233           };
94234           if (changeset_id) r.relation['@changeset'] = changeset_id;
94235           return r;
94236       },
94237
94238
94239       asGeoJSON: function(resolver) {
94240           return resolver.transient(this, 'GeoJSON', function () {
94241               if (this.isMultipolygon()) {
94242                   return {
94243                       type: 'MultiPolygon',
94244                       coordinates: this.multipolygon(resolver)
94245                   };
94246               } else {
94247                   return {
94248                       type: 'FeatureCollection',
94249                       properties: this.tags,
94250                       features: this.members.map(function (member) {
94251                           return assignIn({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
94252                       })
94253                   };
94254               }
94255           });
94256       },
94257
94258
94259       area: function(resolver) {
94260           return resolver.transient(this, 'area', function() {
94261               return d3_geoArea(this.asGeoJSON(resolver));
94262           });
94263       },
94264
94265
94266       isMultipolygon: function() {
94267           return this.tags.type === 'multipolygon';
94268       },
94269
94270
94271       isComplete: function(resolver) {
94272           for (var i = 0; i < this.members.length; i++) {
94273               if (!resolver.hasEntity(this.members[i].id)) {
94274                   return false;
94275               }
94276           }
94277           return true;
94278       },
94279
94280
94281       isRestriction: function() {
94282           return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
94283       },
94284
94285
94286       isValidRestriction: function() {
94287           if (!this.isRestriction()) return false;
94288
94289           var froms = this.members.filter(function(m) { return m.role === 'from'; });
94290           var vias = this.members.filter(function(m) { return m.role === 'via'; });
94291           var tos = this.members.filter(function(m) { return m.role === 'to'; });
94292
94293           if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
94294           if (froms.some(function(m) { return m.type !== 'way'; })) return false;
94295
94296           if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
94297           if (tos.some(function(m) { return m.type !== 'way'; })) return false;
94298
94299           if (vias.length === 0) return false;
94300           if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
94301
94302           return true;
94303       },
94304
94305
94306       // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
94307       // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
94308       //
94309       // This corresponds to the structure needed for rendering a multipolygon path using a
94310       // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
94311       //
94312       // In the case of invalid geometries, this function will still return a result which
94313       // includes the nodes of all way members, but some Nds may be unclosed and some inner
94314       // rings not matched with the intended outer ring.
94315       //
94316       multipolygon: function(resolver) {
94317           var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
94318           var inners = this.members.filter(function(m) { return 'inner' === m.role; });
94319
94320           outers = osmJoinWays(outers, resolver);
94321           inners = osmJoinWays(inners, resolver);
94322
94323           outers = outers.map(function(outer) { return map$3(outer.nodes, 'loc'); });
94324           inners = inners.map(function(inner) { return map$3(inner.nodes, 'loc'); });
94325
94326           var result = outers.map(function(o) {
94327               // Heuristic for detecting counterclockwise winding order. Assumes
94328               // that OpenStreetMap polygons are not hemisphere-spanning.
94329               return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
94330           });
94331
94332           function findOuter(inner) {
94333               var o, outer;
94334
94335               for (o = 0; o < outers.length; o++) {
94336                   outer = outers[o];
94337                   if (geoPolygonContainsPolygon(outer, inner))
94338                       return o;
94339               }
94340
94341               for (o = 0; o < outers.length; o++) {
94342                   outer = outers[o];
94343                   if (geoPolygonIntersectsPolygon(outer, inner, false))
94344                       return o;
94345               }
94346           }
94347
94348           for (var i = 0; i < inners.length; i++) {
94349               var inner = inners[i];
94350
94351               if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
94352                   inner = inner.reverse();
94353               }
94354
94355               var o = findOuter(inners[i]);
94356               if (o !== undefined)
94357                   result[o].push(inners[i]);
94358               else
94359                   result.push([inners[i]]); // Invalid geometry
94360           }
94361
94362           return result;
94363       }
94364   });
94365
94366   var services$1 = {improveOSM:{errorTypes:{ow:{icon:"fas-long-arrow-alt-right",category:"routing"},"mr-both":{icon:"maki-car",category:"geometry"},"mr-parking":{icon:"maki-parking",category:"geometry"},"mr-path":{icon:"maki-shoe",category:"geometry"},"mr-road":{icon:"maki-car",category:"geometry"},tr:{icon:"temaki-junction",category:"routing"}}},keepRight:{errorTypes:{}}};
94367
94368   function qaError() {
94369       if (!(this instanceof qaError)) {
94370           return (new qaError()).initialize(arguments);
94371       } else if (arguments.length) {
94372           this.initialize(arguments);
94373       }
94374   }
94375
94376   // Generic handling for services without nice IDs
94377   qaError.id = function() {
94378       return qaError.id.next--;
94379   };
94380
94381   qaError.id.next = -1;
94382
94383   assignIn(qaError.prototype, {
94384       type: 'qaError',
94385
94386       // All errors need a position
94387       loc: [0, 0],
94388
94389       // These should be passed in, used to retrieve from qa_errors.json
94390       service: '',
94391       error_type: '',
94392
94393       initialize: function(sources) {
94394           for (var i = 0; i < sources.length; ++i) {
94395               var source = sources[i];
94396               for (var prop in source) {
94397                   if (Object.prototype.hasOwnProperty.call(source, prop)) {
94398                       if (source[prop] === undefined) {
94399                           delete this[prop];
94400                       } else {
94401                           this[prop] = source[prop];
94402                       }
94403                   }
94404               }
94405           }
94406
94407           // Extract common error information from data
94408           if (this.service && this.error_type) {
94409               var serviceInfo = services$1[this.service];
94410
94411               if (serviceInfo) {
94412                   var errInfo = serviceInfo.errorTypes[this.error_type];
94413
94414                   if (errInfo) {
94415                       this.icon = errInfo.icon;
94416                       this.category = errInfo.category;
94417                   }
94418               }
94419           }
94420
94421           // All errors must have an ID for selection
94422           if (!this.id) {
94423               this.id = qaError.id() + '';  // as string
94424           }
94425
94426           return this;
94427       },
94428
94429       update: function(attrs) {
94430           return qaError(this, attrs); // {v: 1 + (this.v || 0)}
94431       }
94432   });
94433
94434   function osmTurn(turn) {
94435       if (!(this instanceof osmTurn)) {
94436           return new osmTurn(turn);
94437       }
94438       assignIn(this, turn);
94439   }
94440
94441
94442   function osmIntersection(graph, startVertexId, maxDistance) {
94443       maxDistance = maxDistance || 30;    // in meters
94444       var vgraph = coreGraph();           // virtual graph
94445       var i, j, k;
94446
94447
94448       function memberOfRestriction(entity) {
94449           return graph.parentRelations(entity)
94450               .some(function(r) { return r.isRestriction(); });
94451       }
94452
94453       function isRoad(way) {
94454           if (way.isArea() || way.isDegenerate()) return false;
94455           var roads = {
94456               'motorway': true,
94457               'motorway_link': true,
94458               'trunk': true,
94459               'trunk_link': true,
94460               'primary': true,
94461               'primary_link': true,
94462               'secondary': true,
94463               'secondary_link': true,
94464               'tertiary': true,
94465               'tertiary_link': true,
94466               'residential': true,
94467               'unclassified': true,
94468               'living_street': true,
94469               'service': true,
94470               'road': true,
94471               'track': true
94472           };
94473           return roads[way.tags.highway];
94474       }
94475
94476
94477       var startNode = graph.entity(startVertexId);
94478       var checkVertices = [startNode];
94479       var checkWays;
94480       var vertices = [];
94481       var vertexIds = [];
94482       var vertex;
94483       var ways = [];
94484       var wayIds = [];
94485       var way;
94486       var nodes = [];
94487       var node;
94488       var parents = [];
94489       var parent;
94490
94491       // `actions` will store whatever actions must be performed to satisfy
94492       // preconditions for adding a turn restriction to this intersection.
94493       //  - Remove any existing degenerate turn restrictions (missing from/to, etc)
94494       //  - Reverse oneways so that they are drawn in the forward direction
94495       //  - Split ways on key vertices
94496       var actions = [];
94497
94498
94499       // STEP 1:  walk the graph outwards from starting vertex to search
94500       //  for more key vertices and ways to include in the intersection..
94501
94502       while (checkVertices.length) {
94503           vertex = checkVertices.pop();
94504
94505           // check this vertex for parent ways that are roads
94506           checkWays = graph.parentWays(vertex);
94507           var hasWays = false;
94508           for (i = 0; i < checkWays.length; i++) {
94509               way = checkWays[i];
94510               if (!isRoad(way) && !memberOfRestriction(way)) continue;
94511
94512               ways.push(way);   // it's a road, or it's already in a turn restriction
94513               hasWays = true;
94514
94515               // check the way's children for more key vertices
94516               nodes = uniq(graph.childNodes(way));
94517               for (j = 0; j < nodes.length; j++) {
94518                   node = nodes[j];
94519                   if (node === vertex) continue;                                           // same thing
94520                   if (vertices.indexOf(node) !== -1) continue;                             // seen it already
94521                   if (node.loc && startNode.loc &&
94522                       geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue;   // too far from start
94523
94524                   // a key vertex will have parents that are also roads
94525                   var hasParents = false;
94526                   parents = graph.parentWays(node);
94527                   for (k = 0; k < parents.length; k++) {
94528                       parent = parents[k];
94529                       if (parent === way) continue;                 // same thing
94530                       if (ways.indexOf(parent) !== -1) continue;    // seen it already
94531                       if (!isRoad(parent)) continue;                // not a road
94532                       hasParents = true;
94533                       break;
94534                   }
94535
94536                   if (hasParents) {
94537                       checkVertices.push(node);
94538                   }
94539               }
94540           }
94541
94542           if (hasWays) {
94543               vertices.push(vertex);
94544           }
94545       }
94546
94547       vertices = uniq(vertices);
94548       ways = uniq(ways);
94549
94550
94551       // STEP 2:  Build a virtual graph containing only the entities in the intersection..
94552       // Everything done after this step should act on the virtual graph
94553       // Any actions that must be performed later to the main graph go in `actions` array
94554       ways.forEach(function(way) {
94555           graph.childNodes(way).forEach(function(node) {
94556               vgraph = vgraph.replace(node);
94557           });
94558
94559           vgraph = vgraph.replace(way);
94560
94561           graph.parentRelations(way).forEach(function(relation) {
94562               if (relation.isRestriction()) {
94563                   if (relation.isValidRestriction(graph)) {
94564                       vgraph = vgraph.replace(relation);
94565                   } else if (relation.isComplete(graph)) {
94566                       actions.push(actionDeleteRelation(relation.id));
94567                   }
94568               }
94569           });
94570       });
94571
94572
94573       // STEP 3:  Force all oneways to be drawn in the forward direction
94574       ways.forEach(function(w) {
94575           var way = vgraph.entity(w.id);
94576           if (way.tags.oneway === '-1') {
94577               var action = actionReverse(way.id, { reverseOneway: true });
94578               actions.push(action);
94579               vgraph = action(vgraph);
94580           }
94581       });
94582
94583
94584       // STEP 4:  Split ways on key vertices
94585       var origCount = osmEntity.id.next.way;
94586       vertices.forEach(function(v) {
94587           // This is an odd way to do it, but we need to find all the ways that
94588           // will be split here, then split them one at a time to ensure that these
94589           // actions can be replayed on the main graph exactly in the same order.
94590           // (It is unintuitive, but the order of ways returned from graph.parentWays()
94591           // is arbitrary, depending on how the main graph and vgraph were built)
94592           var splitAll = actionSplit(v.id);
94593           if (!splitAll.disabled(vgraph)) {
94594               splitAll.ways(vgraph).forEach(function(way) {
94595                   var splitOne = actionSplit(v.id).limitWays([way.id]);
94596                   actions.push(splitOne);
94597                   vgraph = splitOne(vgraph);
94598               });
94599           }
94600       });
94601
94602       // In here is where we should also split the intersection at nearby junction.
94603       //   for https://github.com/mapbox/iD-internal/issues/31
94604       // nearbyVertices.forEach(function(v) {
94605       // });
94606
94607       // Reasons why we reset the way id count here:
94608       //  1. Continuity with way ids created by the splits so that we can replay
94609       //     these actions later if the user decides to create a turn restriction
94610       //  2. Avoids churning way ids just by hovering over a vertex
94611       //     and displaying the turn restriction editor
94612       osmEntity.id.next.way = origCount;
94613
94614
94615       // STEP 5:  Update arrays to point to vgraph entities
94616       vertexIds = vertices.map(function(v) { return v.id; });
94617       vertices = [];
94618       ways = [];
94619
94620       vertexIds.forEach(function(id) {
94621           var vertex = vgraph.entity(id);
94622           var parents = vgraph.parentWays(vertex);
94623           vertices.push(vertex);
94624           ways = ways.concat(parents);
94625       });
94626
94627       vertices = uniq(vertices);
94628       ways = uniq(ways);
94629
94630       vertexIds = vertices.map(function(v) { return v.id; });
94631       wayIds = ways.map(function(w) { return w.id; });
94632
94633
94634       // STEP 6:  Update the ways with some metadata that will be useful for
94635       // walking the intersection graph later and rendering turn arrows.
94636
94637       function withMetadata(way, vertexIds) {
94638           var __oneWay = way.isOneWay();
94639
94640           // which affixes are key vertices?
94641           var __first = (vertexIds.indexOf(way.first()) !== -1);
94642           var __last = (vertexIds.indexOf(way.last()) !== -1);
94643
94644           // what roles is this way eligible for?
94645           var __via = (__first && __last);
94646           var __from = ((__first && !__oneWay) || __last);
94647           var __to = (__first || (__last && !__oneWay));
94648
94649           return way.update({
94650               __first:  __first,
94651               __last:  __last,
94652               __from:  __from,
94653               __via: __via,
94654               __to:  __to,
94655               __oneWay:  __oneWay
94656           });
94657       }
94658
94659       ways = [];
94660       wayIds.forEach(function(id) {
94661           var way = withMetadata(vgraph.entity(id), vertexIds);
94662           vgraph = vgraph.replace(way);
94663           ways.push(way);
94664       });
94665
94666
94667       // STEP 7:  Simplify - This is an iterative process where we:
94668       //  1. Find trivial vertices with only 2 parents
94669       //  2. trim off the leaf way from those vertices and remove from vgraph
94670
94671       var keepGoing;
94672       var removeWayIds = [];
94673       var removeVertexIds = [];
94674
94675       do {
94676           keepGoing = false;
94677           checkVertices = vertexIds.slice();
94678
94679           for (i = 0; i < checkVertices.length; i++) {
94680               var vertexId = checkVertices[i];
94681               vertex = vgraph.hasEntity(vertexId);
94682
94683               if (!vertex) {
94684                   if (vertexIds.indexOf(vertexId) !== -1) {
94685                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
94686                   }
94687                   removeVertexIds.push(vertexId);
94688                   continue;
94689               }
94690
94691               parents = vgraph.parentWays(vertex);
94692               if (parents.length < 3) {
94693                   if (vertexIds.indexOf(vertexId) !== -1) {
94694                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
94695                   }
94696               }
94697
94698               if (parents.length === 2) {     // vertex with 2 parents is trivial
94699                   var a = parents[0];
94700                   var b = parents[1];
94701                   var aIsLeaf = a && !a.__via;
94702                   var bIsLeaf = b && !b.__via;
94703                   var leaf, survivor;
94704
94705                   if (aIsLeaf && !bIsLeaf) {
94706                       leaf = a;
94707                       survivor = b;
94708                   } else if (!aIsLeaf && bIsLeaf) {
94709                       leaf = b;
94710                       survivor = a;
94711                   }
94712
94713                   if (leaf && survivor) {
94714                       survivor = withMetadata(survivor, vertexIds);      // update survivor way
94715                       vgraph = vgraph.replace(survivor).remove(leaf);    // update graph
94716                       removeWayIds.push(leaf.id);
94717                       keepGoing = true;
94718                   }
94719               }
94720
94721               parents = vgraph.parentWays(vertex);
94722
94723               if (parents.length < 2) {     // vertex is no longer a key vertex
94724                   if (vertexIds.indexOf(vertexId) !== -1) {
94725                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
94726                   }
94727                   removeVertexIds.push(vertexId);
94728                   keepGoing = true;
94729               }
94730
94731               if (parents.length < 1) {     // vertex is no longer attached to anything
94732                   vgraph = vgraph.remove(vertex);
94733               }
94734
94735           }
94736       } while (keepGoing);
94737
94738
94739       vertices = vertices
94740           .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
94741           .map(function(vertex) { return vgraph.entity(vertex.id); });
94742       ways = ways
94743           .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
94744           .map(function(way) { return vgraph.entity(way.id); });
94745
94746
94747       // OK!  Here is our intersection..
94748       var intersection = {
94749           graph: vgraph,
94750           actions: actions,
94751           vertices: vertices,
94752           ways: ways,
94753       };
94754
94755
94756
94757       // Get all the valid turns through this intersection given a starting way id.
94758       // This operates on the virtual graph for everything.
94759       //
94760       // Basically, walk through all possible paths from starting way,
94761       //   honoring the existing turn restrictions as we go (watch out for loops!)
94762       //
94763       // For each path found, generate and return a `osmTurn` datastructure.
94764       //
94765       intersection.turns = function(fromWayId, maxViaWay) {
94766           if (!fromWayId) return [];
94767           if (!maxViaWay) maxViaWay = 0;
94768
94769           var vgraph = intersection.graph;
94770           var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
94771
94772           var start = vgraph.entity(fromWayId);
94773           if (!start || !(start.__from || start.__via)) return [];
94774
94775           // maxViaWay=0   from-*-to              (0 vias)
94776           // maxViaWay=1   from-*-via-*-to        (1 via max)
94777           // maxViaWay=2   from-*-via-*-via-*-to  (2 vias max)
94778           var maxPathLength = (maxViaWay * 2) + 3;
94779           var turns = [];
94780
94781           step(start);
94782           return turns;
94783
94784
94785           // traverse the intersection graph and find all the valid paths
94786           function step(entity, currPath, currRestrictions, matchedRestriction) {
94787               currPath = clone(currPath || []);
94788               if (currPath.length >= maxPathLength) return;
94789               currPath.push(entity.id);
94790               currRestrictions = clone(currRestrictions || []);
94791               var i, j;
94792
94793               if (entity.type === 'node') {
94794                   var parents = vgraph.parentWays(entity);
94795                   var nextWays = [];
94796
94797                   // which ways can we step into?
94798                   for (i = 0; i < parents.length; i++) {
94799                       var way = parents[i];
94800
94801                       // if next way is a oneway incoming to this vertex, skip
94802                       if (way.__oneWay && way.nodes[0] !== entity.id) continue;
94803
94804                       // if we have seen it before (allowing for an initial u-turn), skip
94805                       if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
94806
94807                       // Check all "current" restrictions (where we've already walked the `FROM`)
94808                       var restrict = undefined;
94809                       for (j = 0; j < currRestrictions.length; j++) {
94810                           var restriction = currRestrictions[j];
94811                           var f = restriction.memberByRole('from');
94812                           var v = restriction.membersByRole('via');
94813                           var t = restriction.memberByRole('to');
94814                           var isOnly = /^only_/.test(restriction.tags.restriction);
94815
94816                           // Does the current path match this turn restriction?
94817                           var matchesFrom = (f.id === fromWayId);
94818                           var matchesViaTo = false;
94819                           var isAlongOnlyPath = false;
94820
94821                           if (t.id === way.id) {     // match TO
94822
94823                               if (v.length === 1 && v[0].type === 'node') {    // match VIA node
94824                                   matchesViaTo = (v[0].id === entity.id && (
94825                                       (matchesFrom && currPath.length === 2) ||
94826                                       (!matchesFrom && currPath.length > 2)
94827                                   ));
94828
94829                               } else {                                         // match all VIA ways
94830                                   var pathVias = [];
94831                                   for (k = 2; k < currPath.length; k +=2 ) {   // k = 2 skips FROM
94832                                       pathVias.push(currPath[k]);              // (path goes way-node-way...)
94833                                   }
94834                                   var restrictionVias = [];
94835                                   for (k = 0; k < v.length; k++) {
94836                                       if (v[k].type === 'way') {
94837                                           restrictionVias.push(v[k].id);
94838                                       }
94839                                   }
94840                                   var diff = difference(pathVias, restrictionVias);
94841                                   matchesViaTo = !diff.length;
94842                               }
94843
94844                           } else if (isOnly) {
94845                               for (k = 0; k < v.length; k++) {
94846                                   // way doesn't match TO, but is one of the via ways along the path of an "only"
94847                                   if (v[k].type === 'way' && v[k].id === way.id) {
94848                                       isAlongOnlyPath = true;
94849                                       break;
94850                                   }
94851                               }
94852                           }
94853
94854                           if (matchesViaTo) {
94855                               if (isOnly) {
94856                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
94857                               } else {
94858                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
94859                               }
94860                           } else {    // indirect - caused by a different nearby restriction
94861                               if (isAlongOnlyPath) {
94862                                   restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
94863                               } else if (isOnly) {
94864                                   restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
94865                               }
94866                           }
94867
94868                           // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
94869                           if (restrict && restrict.direct)
94870                               break;
94871                       }
94872
94873                       nextWays.push({ way: way, restrict: restrict });
94874                   }
94875
94876                   nextWays.forEach(function(nextWay) {
94877                       step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
94878                   });
94879
94880
94881               } else {  // entity.type === 'way'
94882                   if (currPath.length >= 3) {     // this is a "complete" path..
94883                       var turnPath = clone(currPath);
94884
94885                       // an indirect restriction - only include the partial path (starting at FROM)
94886                       if (matchedRestriction && matchedRestriction.direct === false) {
94887                           for (i = 0; i < turnPath.length; i++) {
94888                               if (turnPath[i] === matchedRestriction.from) {
94889                                   turnPath = turnPath.slice(i);
94890                                   break;
94891                               }
94892                           }
94893                       }
94894
94895                       var turn = pathToTurn(turnPath);
94896                       if (turn) {
94897                           if (matchedRestriction) {
94898                               turn.restrictionID = matchedRestriction.id;
94899                               turn.no = matchedRestriction.no;
94900                               turn.only = matchedRestriction.only;
94901                               turn.direct = matchedRestriction.direct;
94902                           }
94903                           turns.push(osmTurn(turn));
94904                       }
94905
94906                       if (currPath[0] === currPath[2]) return;   // if we made a u-turn - stop here
94907                   }
94908
94909                   if (matchedRestriction && matchedRestriction.end) return;  // don't advance any further
94910
94911                   // which nodes can we step into?
94912                   var n1 = vgraph.entity(entity.first());
94913                   var n2 = vgraph.entity(entity.last());
94914                   var dist = n1.loc && n2.loc && geoSphericalDistance(n1.loc, n2.loc);
94915                   var nextNodes = [];
94916
94917                   if (currPath.length > 1) {
94918                       if (dist > maxDistance) return;   // the next node is too far
94919                       if (!entity.__via) return;        // this way is a leaf / can't be a via
94920                   }
94921
94922                   if (!entity.__oneWay &&                     // bidirectional..
94923                       keyVertexIds.indexOf(n1.id) !== -1 &&   // key vertex..
94924                       currPath.indexOf(n1.id) === -1) {       // haven't seen it yet..
94925                       nextNodes.push(n1);                     // can advance to first node
94926                   }
94927                   if (keyVertexIds.indexOf(n2.id) !== -1 &&   // key vertex..
94928                       currPath.indexOf(n2.id) === -1) {       // haven't seen it yet..
94929                       nextNodes.push(n2);                     // can advance to last node
94930                   }
94931
94932                   nextNodes.forEach(function(nextNode) {
94933                       // gather restrictions FROM this way
94934                       var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
94935                           if (!r.isRestriction()) return false;
94936
94937                           var f = r.memberByRole('from');
94938                           if (!f || f.id !== entity.id) return false;
94939
94940                           var isOnly = /^only_/.test(r.tags.restriction);
94941                           if (!isOnly) return true;
94942
94943                           // `only_` restrictions only matter along the direction of the VIA - #4849
94944                           var isOnlyVia = false;
94945                           var v = r.membersByRole('via');
94946                           if (v.length === 1 && v[0].type === 'node') {   // via node
94947                               isOnlyVia = (v[0].id === nextNode.id);
94948                           } else {                                        // via way(s)
94949                               for (var i = 0; i < v.length; i++) {
94950                                   if (v[i].type !== 'way') continue;
94951                                   var viaWay = vgraph.entity(v[i].id);
94952                                   if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
94953                                       isOnlyVia = true;
94954                                       break;
94955                                   }
94956                               }
94957                           }
94958                           return isOnlyVia;
94959                       });
94960
94961                       step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
94962                   });
94963               }
94964           }
94965
94966
94967           // assumes path is alternating way-node-way of odd length
94968           function pathToTurn(path) {
94969               if (path.length < 3) return;
94970               var fromWayId, fromNodeId, fromVertexId;
94971               var toWayId, toNodeId, toVertexId;
94972               var viaWayIds, viaNodeId, isUturn;
94973
94974               fromWayId = path[0];
94975               toWayId = path[path.length - 1];
94976
94977               if (path.length === 3 && fromWayId === toWayId) {  // u turn
94978                   var way = vgraph.entity(fromWayId);
94979                   if (way.__oneWay) return null;
94980
94981                   isUturn = true;
94982                   viaNodeId = fromVertexId = toVertexId = path[1];
94983                   fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
94984
94985               } else {
94986                   isUturn = false;
94987                   fromVertexId = path[1];
94988                   fromNodeId = adjacentNode(fromWayId, fromVertexId);
94989                   toVertexId = path[path.length - 2];
94990                   toNodeId = adjacentNode(toWayId, toVertexId);
94991
94992                   if (path.length === 3) {
94993                       viaNodeId = path[1];
94994                   } else {
94995                       viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
94996                       viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);  // remove first, last
94997                   }
94998               }
94999
95000               return {
95001                   key:  path.join('_'),
95002                   path: path,
95003                   from: { node: fromNodeId, way:  fromWayId, vertex: fromVertexId },
95004                   via:  { node: viaNodeId,  ways: viaWayIds },
95005                   to:   { node: toNodeId,   way:  toWayId, vertex: toVertexId },
95006                   u:    isUturn
95007               };
95008
95009
95010               function adjacentNode(wayId, affixId) {
95011                   var nodes = vgraph.entity(wayId).nodes;
95012                   return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
95013               }
95014           }
95015
95016       };
95017
95018       return intersection;
95019   }
95020
95021
95022   function osmInferRestriction(graph, turn, projection) {
95023       var fromWay = graph.entity(turn.from.way);
95024       var fromNode = graph.entity(turn.from.node);
95025       var fromVertex = graph.entity(turn.from.vertex);
95026       var toWay = graph.entity(turn.to.way);
95027       var toNode = graph.entity(turn.to.node);
95028       var toVertex = graph.entity(turn.to.vertex);
95029
95030       var fromOneWay = (fromWay.tags.oneway === 'yes');
95031       var toOneWay = (toWay.tags.oneway === 'yes');
95032       var angle = (geoAngle(fromVertex, fromNode, projection) -
95033                   geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
95034
95035       while (angle < 0)
95036           angle += 360;
95037
95038       if (fromNode === toNode)
95039           return 'no_u_turn';
95040       if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
95041           return 'no_u_turn';   // wider tolerance for u-turn if both ways are oneway
95042       if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
95043           return 'no_u_turn';   // even wider tolerance for u-turn if there is a via way (from !== to)
95044       if (angle < 158)
95045           return 'no_right_turn';
95046       if (angle > 202)
95047           return 'no_left_turn';
95048
95049       return 'no_straight_on';
95050   }
95051
95052   function actionAddMember(relationId, member, memberIndex, insertPair) {
95053
95054       return function action(graph) {
95055           var relation = graph.entity(relationId);
95056
95057           // There are some special rules for Public Transport v2 routes.
95058           var isPTv2 = /stop|platform/.test(member.role);
95059
95060           if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
95061               // Try to perform sensible inserts based on how the ways join together
95062               graph = addWayMember(relation, graph);
95063           } else {
95064               // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
95065               // Stops and Platforms for PTv2 should be ordered first.
95066               // hack: We do not currently have the ability to place them in the exactly correct order.
95067               if (isPTv2 && isNaN(memberIndex)) {
95068                   memberIndex = 0;
95069               }
95070
95071               graph = graph.replace(relation.addMember(member, memberIndex));
95072           }
95073
95074           return graph;
95075       };
95076
95077
95078       // Add a way member into the relation "wherever it makes sense".
95079       // In this situation we were not supplied a memberIndex.
95080       function addWayMember(relation, graph) {
95081           var groups, tempWay, item, i, j, k;
95082
95083           // remove PTv2 stops and platforms before doing anything.
95084           var PTv2members = [];
95085           var members = [];
95086           for (i = 0; i < relation.members.length; i++) {
95087               var m = relation.members[i];
95088               if (/stop|platform/.test(m.role)) {
95089                   PTv2members.push(m);
95090               } else {
95091                   members.push(m);
95092               }
95093           }
95094           relation = relation.update({ members: members });
95095
95096
95097           if (insertPair) {
95098               // We're adding a member that must stay paired with an existing member.
95099               // (This feature is used by `actionSplit`)
95100               //
95101               // This is tricky because the members may exist multiple times in the
95102               // member list, and with different A-B/B-A ordering and different roles.
95103               // (e.g. a bus route that loops out and back - #4589).
95104               //
95105               // Replace the existing member with a temporary way,
95106               // so that `osmJoinWays` can treat the pair like a single way.
95107               tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
95108               graph = graph.replace(tempWay);
95109               var tempMember = { id: tempWay.id, type: 'way', role: member.role };
95110               var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
95111               groups = groupBy(tempRelation.members, function(m) { return m.type; });
95112               groups.way = groups.way || [];
95113
95114           } else {
95115               // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
95116               groups = groupBy(relation.members, function(m) { return m.type; });
95117               groups.way = groups.way || [];
95118               groups.way.push(member);
95119           }
95120
95121           members = withIndex(groups.way);
95122           var joined = osmJoinWays(members, graph);
95123
95124           // `joined` might not contain all of the way members,
95125           // But will contain only the completed (downloaded) members
95126           for (i = 0; i < joined.length; i++) {
95127               var segment = joined[i];
95128               var nodes = segment.nodes.slice();
95129               var startIndex = segment[0].index;
95130
95131               // j = array index in `members` where this segment starts
95132               for (j = 0; j < members.length; j++) {
95133                   if (members[j].index === startIndex) {
95134                       break;
95135                   }
95136               }
95137
95138               // k = each member in segment
95139               for (k = 0; k < segment.length; k++) {
95140                   item = segment[k];
95141                   var way = graph.entity(item.id);
95142
95143                   // If this is a paired item, generate members in correct order and role
95144                   if (tempWay && item.id === tempWay.id) {
95145                       if (nodes[0].id === insertPair.nodes[0]) {
95146                           item.pair = [
95147                               { id: insertPair.originalID, type: 'way', role: item.role },
95148                               { id: insertPair.insertedID, type: 'way', role: item.role }
95149                           ];
95150                       } else {
95151                           item.pair = [
95152                               { id: insertPair.insertedID, type: 'way', role: item.role },
95153                               { id: insertPair.originalID, type: 'way', role: item.role }
95154                           ];
95155                       }
95156                   }
95157
95158                   // reorder `members` if necessary
95159                   if (k > 0) {
95160                       if (j+k >= members.length || item.index !== members[j+k].index) {
95161                           moveMember(members, item.index, j+k);
95162                       }
95163                   }
95164
95165                   nodes.splice(0, way.nodes.length - 1);
95166               }
95167           }
95168
95169           if (tempWay) {
95170               graph = graph.remove(tempWay);
95171           }
95172
95173           // Final pass: skip dead items, split pairs, remove index properties
95174           var wayMembers = [];
95175           for (i = 0; i < members.length; i++) {
95176               item = members[i];
95177               if (item.index === -1) continue;
95178
95179               if (item.pair) {
95180                   wayMembers.push(item.pair[0]);
95181                   wayMembers.push(item.pair[1]);
95182               } else {
95183                   wayMembers.push(omit(item, 'index'));
95184               }
95185           }
95186
95187           // Put stops and platforms first, then nodes, ways, relations
95188           // This is recommended for Public Transport v2 routes:
95189           // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
95190           var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) );
95191
95192           return graph.replace(relation.update({members: newMembers}));
95193
95194
95195           // `moveMember()` changes the `members` array in place by splicing
95196           // the item with `.index = findIndex` to where it belongs,
95197           // and marking the old position as "dead" with `.index = -1`
95198           //
95199           // j=5, k=0                jk
95200           // segment                 5 4 7 6
95201           // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
95202           //
95203           // j=5, k=1                j k
95204           // segment                 5 4 7 6
95205           // members       0 1 2 3 4 5 6 7 8 9        move 4 to j+k
95206           // members       0 1 2 3 x 5 4 6 7 8 9      moved
95207           //
95208           // j=5, k=2                j   k
95209           // segment                 5 4 7 6
95210           // members       0 1 2 3 x 5 4 6 7 8 9      move 7 to j+k
95211           // members       0 1 2 3 x 5 4 7 6 x 8 9    moved
95212           //
95213           // j=5, k=3                j     k
95214           // segment                 5 4 7 6
95215           // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
95216           //
95217           function moveMember(arr, findIndex, toIndex) {
95218               for (var i = 0; i < arr.length; i++) {
95219                   if (arr[i].index === findIndex) {
95220                       break;
95221                   }
95222               }
95223
95224               var item = clone(arr[i]);
95225               arr[i].index = -1;   // mark as dead
95226               item.index = toIndex;
95227               arr.splice(toIndex, 0, item);
95228           }
95229
95230
95231           // This is the same as `Relation.indexedMembers`,
95232           // Except we don't want to index all the members, only the ways
95233           function withIndex(arr) {
95234               var result = new Array(arr.length);
95235               for (var i = 0; i < arr.length; i++) {
95236                   result[i] = clone(arr[i]);
95237                   result[i].index = i;
95238               }
95239               return result;
95240           }
95241       }
95242
95243   }
95244
95245   function actionAddMidpoint(midpoint, node) {
95246       return function(graph) {
95247           graph = graph.replace(node.move(midpoint.loc));
95248
95249           var parents = intersection(
95250               graph.parentWays(graph.entity(midpoint.edge[0])),
95251               graph.parentWays(graph.entity(midpoint.edge[1])));
95252
95253           parents.forEach(function(way) {
95254               for (var i = 0; i < way.nodes.length - 1; i++) {
95255                   if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
95256                       graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
95257
95258                       // Add only one midpoint on doubled-back segments,
95259                       // turning them into self-intersections.
95260                       return;
95261                   }
95262               }
95263           });
95264
95265           return graph;
95266       };
95267   }
95268
95269   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
95270   function actionAddVertex(wayId, nodeId, index) {
95271       return function(graph) {
95272           return graph.replace(graph.entity(wayId).addNode(nodeId, index));
95273       };
95274   }
95275
95276   function actionChangeMember(relationId, member, memberIndex) {
95277       return function(graph) {
95278           return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
95279       };
95280   }
95281
95282   function actionChangePreset(entityID, oldPreset, newPreset) {
95283       return function action(graph) {
95284           var entity = graph.entity(entityID);
95285           var geometry = entity.geometry(graph);
95286           var tags = entity.tags;
95287
95288           if (oldPreset) tags = oldPreset.unsetTags(tags, geometry);
95289           if (newPreset) tags = newPreset.setTags(tags, geometry);
95290
95291           return graph.replace(entity.update({tags: tags}));
95292       };
95293   }
95294
95295   function actionChangeTags(entityId, tags) {
95296       return function(graph) {
95297           var entity = graph.entity(entityId);
95298           return graph.replace(entity.update({tags: tags}));
95299       };
95300   }
95301
95302   function actionCircularize(wayId, projection, maxAngle) {
95303       maxAngle = (maxAngle || 20) * Math.PI / 180;
95304
95305
95306       var action = function(graph, t) {
95307           if (t === null || !isFinite(t)) t = 1;
95308           t = Math.min(Math.max(+t, 0), 1);
95309
95310           var way = graph.entity(wayId),
95311               origNodes = {};
95312
95313           graph.childNodes(way).forEach(function(node) {
95314               if (!origNodes[node.id]) origNodes[node.id] = node;
95315           });
95316
95317           if (!way.isConvex(graph)) {
95318               graph = action.makeConvex(graph);
95319           }
95320
95321           var nodes = uniq(graph.childNodes(way)),
95322               keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
95323               points = nodes.map(function(n) { return projection(n.loc); }),
95324               keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
95325               centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
95326               radius = d3_median(points, function(p) { return geoVecLength(centroid, p); }),
95327               sign = d3_polygonArea(points) > 0 ? 1 : -1,
95328               ids;
95329
95330           // we need atleast two key nodes for the algorithm to work
95331           if (!keyNodes.length) {
95332               keyNodes = [nodes[0]];
95333               keyPoints = [points[0]];
95334           }
95335
95336           if (keyNodes.length === 1) {
95337               var index = nodes.indexOf(keyNodes[0]),
95338                   oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
95339
95340               keyNodes.push(nodes[oppositeIndex]);
95341               keyPoints.push(points[oppositeIndex]);
95342           }
95343
95344           // key points and nodes are those connected to the ways,
95345           // they are projected onto the circle, inbetween nodes are moved
95346           // to constant intervals between key nodes, extra inbetween nodes are
95347           // added if necessary.
95348           for (var i = 0; i < keyPoints.length; i++) {
95349               var nextKeyNodeIndex = (i + 1) % keyNodes.length,
95350                   startNode = keyNodes[i],
95351                   endNode = keyNodes[nextKeyNodeIndex],
95352                   startNodeIndex = nodes.indexOf(startNode),
95353                   endNodeIndex = nodes.indexOf(endNode),
95354                   numberNewPoints = -1,
95355                   indexRange = endNodeIndex - startNodeIndex,
95356                   nearNodes = {},
95357                   inBetweenNodes = [],
95358                   startAngle, endAngle, totalAngle, eachAngle,
95359                   angle, loc, node, origNode, j;
95360
95361               if (indexRange < 0) {
95362                   indexRange += nodes.length;
95363               }
95364
95365               // position this key node
95366               var distance = geoVecLength(centroid, keyPoints[i]);
95367               if (distance === 0) { distance = 1e-4; }
95368               keyPoints[i] = [
95369                   centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
95370                   centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
95371               ];
95372               loc = projection.invert(keyPoints[i]);
95373               node = keyNodes[i];
95374               origNode = origNodes[node.id];
95375               node = node.move(geoVecInterp(origNode.loc, loc, t));
95376               graph = graph.replace(node);
95377
95378               // figure out the between delta angle we want to match to
95379               startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
95380               endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
95381               totalAngle = endAngle - startAngle;
95382
95383               // detects looping around -pi/pi
95384               if (totalAngle * sign > 0) {
95385                   totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
95386               }
95387
95388               do {
95389                   numberNewPoints++;
95390                   eachAngle = totalAngle / (indexRange + numberNewPoints);
95391               } while (Math.abs(eachAngle) > maxAngle);
95392
95393
95394               // move existing nodes
95395               for (j = 1; j < indexRange; j++) {
95396                   angle = startAngle + j * eachAngle;
95397                   loc = projection.invert([
95398                       centroid[0] + Math.cos(angle) * radius,
95399                       centroid[1] + Math.sin(angle) * radius
95400                   ]);
95401
95402                   node = nodes[(j + startNodeIndex) % nodes.length];
95403                   origNode = origNodes[node.id];
95404                   nearNodes[node.id] = angle;
95405
95406                   node = node.move(geoVecInterp(origNode.loc, loc, t));
95407                   graph = graph.replace(node);
95408               }
95409
95410               // add new inbetween nodes if necessary
95411               for (j = 0; j < numberNewPoints; j++) {
95412                   angle = startAngle + (indexRange + j) * eachAngle;
95413                   loc = projection.invert([
95414                       centroid[0] + Math.cos(angle) * radius,
95415                       centroid[1] + Math.sin(angle) * radius
95416                   ]);
95417
95418                   // choose a nearnode to use as the original
95419                   var min = Infinity;
95420                   for (var nodeId in nearNodes) {
95421                       var nearAngle = nearNodes[nodeId],
95422                           dist = Math.abs(nearAngle - angle);
95423                       if (dist < min) {
95424                           dist = min;
95425                           origNode = origNodes[nodeId];
95426                       }
95427                   }
95428
95429                   node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
95430                   graph = graph.replace(node);
95431
95432                   nodes.splice(endNodeIndex + j, 0, node);
95433                   inBetweenNodes.push(node.id);
95434               }
95435
95436               // Check for other ways that share these keyNodes..
95437               // If keyNodes are adjacent in both ways,
95438               // we can add inBetween nodes to that shared way too..
95439               if (indexRange === 1 && inBetweenNodes.length) {
95440                   var startIndex1 = way.nodes.lastIndexOf(startNode.id),
95441                       endIndex1 = way.nodes.lastIndexOf(endNode.id),
95442                       wayDirection1 = (endIndex1 - startIndex1);
95443                   if (wayDirection1 < -1) { wayDirection1 = 1; }
95444
95445                   /* eslint-disable no-loop-func */
95446                   forEach(without(graph.parentWays(keyNodes[i]), way), function(sharedWay) {
95447                       if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
95448                           var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id),
95449                               endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id),
95450                               wayDirection2 = (endIndex2 - startIndex2),
95451                               insertAt = endIndex2;
95452                           if (wayDirection2 < -1) { wayDirection2 = 1; }
95453
95454                           if (wayDirection1 !== wayDirection2) {
95455                               inBetweenNodes.reverse();
95456                               insertAt = startIndex2;
95457                           }
95458                           for (j = 0; j < inBetweenNodes.length; j++) {
95459                               sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
95460                           }
95461                           graph = graph.replace(sharedWay);
95462                       }
95463                   });
95464                   /* eslint-enable no-loop-func */
95465               }
95466
95467           }
95468
95469           // update the way to have all the new nodes
95470           ids = nodes.map(function(n) { return n.id; });
95471           ids.push(ids[0]);
95472
95473           way = way.update({nodes: ids});
95474           graph = graph.replace(way);
95475
95476           return graph;
95477       };
95478
95479
95480       action.makeConvex = function(graph) {
95481           var way = graph.entity(wayId),
95482               nodes = uniq(graph.childNodes(way)),
95483               points = nodes.map(function(n) { return projection(n.loc); }),
95484               sign = d3_polygonArea(points) > 0 ? 1 : -1,
95485               hull = d3_polygonHull(points);
95486
95487           // D3 convex hulls go counterclockwise..
95488           if (sign === -1) {
95489               nodes.reverse();
95490               points.reverse();
95491           }
95492
95493           for (var i = 0; i < hull.length - 1; i++) {
95494               var startIndex = points.indexOf(hull[i]),
95495                   endIndex = points.indexOf(hull[i+1]),
95496                   indexRange = (endIndex - startIndex);
95497
95498               if (indexRange < 0) {
95499                   indexRange += nodes.length;
95500               }
95501
95502               // move interior nodes to the surface of the convex hull..
95503               for (var j = 1; j < indexRange; j++) {
95504                   var point = geoVecInterp(hull[i], hull[i+1], j / indexRange),
95505                       node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
95506                   graph = graph.replace(node);
95507               }
95508           }
95509           return graph;
95510       };
95511
95512
95513       action.disabled = function(graph) {
95514           if (!graph.entity(wayId).isClosed())
95515               return 'not_closed';
95516       };
95517
95518
95519       action.transitionable = true;
95520
95521
95522       return action;
95523   }
95524
95525   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
95526   function actionDeleteWay(wayId) {
95527
95528
95529       function canDeleteNode(node, graph) {
95530           return !graph.parentWays(node).length &&
95531               !graph.parentRelations(node).length &&
95532               !node.hasInterestingTags();
95533       }
95534
95535
95536       var action = function(graph) {
95537           var way = graph.entity(wayId);
95538
95539           graph.parentRelations(way)
95540               .forEach(function(parent) {
95541                   parent = parent.removeMembersWithID(wayId);
95542                   graph = graph.replace(parent);
95543
95544                   if (parent.isDegenerate()) {
95545                       graph = actionDeleteRelation(parent.id)(graph);
95546                   }
95547               });
95548
95549           uniq(way.nodes).forEach(function(nodeId) {
95550               graph = graph.replace(way.removeNode(nodeId));
95551
95552               var node = graph.entity(nodeId);
95553               if (canDeleteNode(node, graph)) {
95554                   graph = graph.remove(node);
95555               }
95556           });
95557
95558           return graph.remove(way);
95559       };
95560
95561
95562       return action;
95563   }
95564
95565   function actionDeleteMultiple(ids) {
95566       var actions = {
95567           way: actionDeleteWay,
95568           node: actionDeleteNode,
95569           relation: actionDeleteRelation
95570       };
95571
95572
95573       var action = function(graph) {
95574           ids.forEach(function(id) {
95575               if (graph.hasEntity(id)) { // It may have been deleted aready.
95576                   graph = actions[graph.entity(id).type](id)(graph);
95577               }
95578           });
95579
95580           return graph;
95581       };
95582
95583
95584       return action;
95585   }
95586
95587   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
95588   function actionDeleteRelation(relationId) {
95589
95590
95591       function canDeleteEntity(entity, graph) {
95592           return !graph.parentWays(entity).length &&
95593               !graph.parentRelations(entity).length &&
95594               !entity.hasInterestingTags();
95595       }
95596
95597
95598       var action = function(graph) {
95599           var relation = graph.entity(relationId);
95600
95601           graph.parentRelations(relation)
95602               .forEach(function(parent) {
95603                   parent = parent.removeMembersWithID(relationId);
95604                   graph = graph.replace(parent);
95605
95606                   if (parent.isDegenerate()) {
95607                       graph = actionDeleteRelation(parent.id)(graph);
95608                   }
95609               });
95610
95611           uniq(map$3(relation.members, 'id')).forEach(function(memberId) {
95612               graph = graph.replace(relation.removeMembersWithID(memberId));
95613
95614               var entity = graph.entity(memberId);
95615               if (canDeleteEntity(entity, graph)) {
95616                   graph = actionDeleteMultiple([memberId])(graph);
95617               }
95618           });
95619
95620           return graph.remove(relation);
95621       };
95622
95623
95624       return action;
95625   }
95626
95627   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
95628   function actionDeleteNode(nodeId) {
95629       var action = function(graph) {
95630           var node = graph.entity(nodeId);
95631
95632           graph.parentWays(node)
95633               .forEach(function(parent) {
95634                   parent = parent.removeNode(nodeId);
95635                   graph = graph.replace(parent);
95636
95637                   if (parent.isDegenerate()) {
95638                       graph = actionDeleteWay(parent.id)(graph);
95639                   }
95640               });
95641
95642           graph.parentRelations(node)
95643               .forEach(function(parent) {
95644                   parent = parent.removeMembersWithID(nodeId);
95645                   graph = graph.replace(parent);
95646
95647                   if (parent.isDegenerate()) {
95648                       graph = actionDeleteRelation(parent.id)(graph);
95649                   }
95650               });
95651
95652           return graph.remove(node);
95653       };
95654
95655
95656       return action;
95657   }
95658
95659   // Connect the ways at the given nodes.
95660   //
95661   // First choose a node to be the survivor, with preference given
95662   // to an existing (not new) node.
95663   //
95664   // Tags and relation memberships of of non-surviving nodes are merged
95665   // to the survivor.
95666   //
95667   // This is the inverse of `iD.actionDisconnect`.
95668   //
95669   // Reference:
95670   //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
95671   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
95672   //
95673   function actionConnect(nodeIDs) {
95674       var action = function(graph) {
95675           var survivor;
95676           var node;
95677           var parents;
95678           var i, j;
95679
95680           // Choose a survivor node, prefer an existing (not new) node - #4974
95681           for (i = 0; i < nodeIDs.length; i++) {
95682               survivor = graph.entity(nodeIDs[i]);
95683               if (survivor.version) break;  // found one
95684           }
95685
95686           // Replace all non-surviving nodes with the survivor and merge tags.
95687           for (i = 0; i < nodeIDs.length; i++) {
95688               node = graph.entity(nodeIDs[i]);
95689               if (node.id === survivor.id) continue;
95690
95691               parents = graph.parentWays(node);
95692               for (j = 0; j < parents.length; j++) {
95693                   if (!parents[j].areAdjacent(node.id, survivor.id)) {
95694                       graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
95695                   }
95696               }
95697
95698               parents = graph.parentRelations(node);
95699               for (j = 0; j < parents.length; j++) {
95700                   graph = graph.replace(parents[j].replaceMember(node, survivor));
95701               }
95702
95703               survivor = survivor.mergeTags(node.tags);
95704               graph = actionDeleteNode(node.id)(graph);
95705           }
95706
95707           graph = graph.replace(survivor);
95708
95709           return graph;
95710       };
95711
95712
95713       action.disabled = function(graph) {
95714           var seen = {};
95715           var restrictionIDs = [];
95716           var survivor;
95717           var node, way;
95718           var relations, relation, role;
95719           var i, j, k;
95720
95721           // Choose a survivor node, prefer an existing (not new) node - #4974
95722           for (i = 0; i < nodeIDs.length; i++) {
95723               survivor = graph.entity(nodeIDs[i]);
95724               if (survivor.version) break;  // found one
95725           }
95726
95727           // 1. disable if the nodes being connected have conflicting relation roles
95728           for (i = 0; i < nodeIDs.length; i++) {
95729               node = graph.entity(nodeIDs[i]);
95730               relations = graph.parentRelations(node);
95731
95732               for (j = 0; j < relations.length; j++) {
95733                   relation = relations[j];
95734                   role = relation.memberById(node.id).role || '';
95735
95736                   // if this node is a via node in a restriction, remember for later
95737                   if (relation.isValidRestriction()) {
95738                       restrictionIDs.push(relation.id);
95739                   }
95740
95741                   if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
95742                       return 'relation';
95743                   } else {
95744                       seen[relation.id] = role;
95745                   }
95746               }
95747           }
95748
95749           // gather restrictions for parent ways
95750           for (i = 0; i < nodeIDs.length; i++) {
95751               node = graph.entity(nodeIDs[i]);
95752
95753               var parents = graph.parentWays(node);
95754               for (j = 0; j < parents.length; j++) {
95755                   var parent = parents[j];
95756                   relations = graph.parentRelations(parent);
95757
95758                   for (k = 0; k < relations.length; k++) {
95759                       relation = relations[k];
95760                       if (relation.isValidRestriction()) {
95761                           restrictionIDs.push(relation.id);
95762                       }
95763                   }
95764               }
95765           }
95766
95767
95768           // test restrictions
95769           restrictionIDs = uniq(restrictionIDs);
95770           for (i = 0; i < restrictionIDs.length; i++) {
95771               relation = graph.entity(restrictionIDs[i]);
95772               if (!relation.isComplete(graph)) continue;
95773
95774               var memberWays = relation.members
95775                   .filter(function(m) { return m.type === 'way'; })
95776                   .map(function(m) { return graph.entity(m.id); });
95777
95778               memberWays = uniq(memberWays);
95779               var f = relation.memberByRole('from');
95780               var t = relation.memberByRole('to');
95781               var isUturn = (f.id === t.id);
95782
95783               // 2a. disable if connection would damage a restriction
95784               // (a key node is a node at the junction of ways)
95785               var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
95786               for (j = 0; j < relation.members.length; j++) {
95787                   collectNodes(relation.members[j], nodes);
95788               }
95789
95790               nodes.keyfrom = uniq(nodes.keyfrom.filter(hasDuplicates));
95791               nodes.keyto = uniq(nodes.keyto.filter(hasDuplicates));
95792
95793               var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
95794               nodes.from = nodes.from.filter(filter);
95795               nodes.via = nodes.via.filter(filter);
95796               nodes.to = nodes.to.filter(filter);
95797
95798               var connectFrom = false;
95799               var connectVia = false;
95800               var connectTo = false;
95801               var connectKeyFrom = false;
95802               var connectKeyTo = false;
95803
95804               for (j = 0; j < nodeIDs.length; j++) {
95805                   var n = nodeIDs[j];
95806                   if (nodes.from.indexOf(n) !== -1)    { connectFrom = true; }
95807                   if (nodes.via.indexOf(n) !== -1)     { connectVia = true; }
95808                   if (nodes.to.indexOf(n) !== -1)      { connectTo = true; }
95809                   if (nodes.keyfrom.indexOf(n) !== -1) { connectKeyFrom = true; }
95810                   if (nodes.keyto.indexOf(n) !== -1)   { connectKeyTo = true; }
95811               }
95812               if (connectFrom && connectTo && !isUturn) { return 'restriction'; }
95813               if (connectFrom && connectVia) { return 'restriction'; }
95814               if (connectTo   && connectVia) { return 'restriction'; }
95815
95816               // connecting to a key node -
95817               // if both nodes are on a member way (i.e. part of the turn restriction),
95818               // the connecting node must be adjacent to the key node.
95819               if (connectKeyFrom || connectKeyTo) {
95820                   if (nodeIDs.length !== 2) { return 'restriction'; }
95821
95822                   var n0 = null;
95823                   var n1 = null;
95824                   for (j = 0; j < memberWays.length; j++) {
95825                       way = memberWays[j];
95826                       if (way.contains(nodeIDs[0])) { n0 = nodeIDs[0]; }
95827                       if (way.contains(nodeIDs[1])) { n1 = nodeIDs[1]; }
95828                   }
95829
95830                   if (n0 && n1) {    // both nodes are part of the restriction
95831                       var ok = false;
95832                       for (j = 0; j < memberWays.length; j++) {
95833                           way = memberWays[j];
95834                           if (way.areAdjacent(n0, n1)) {
95835                               ok = true;
95836                               break;
95837                           }
95838                       }
95839                       if (!ok) {
95840                           return 'restriction';
95841                       }
95842                   }
95843               }
95844
95845               // 2b. disable if nodes being connected will destroy a member way in a restriction
95846               // (to test, make a copy and try actually connecting the nodes)
95847               for (j = 0; j < memberWays.length; j++) {
95848                   way = memberWays[j].update({});   // make copy
95849                   for (k = 0; k < nodeIDs.length; k++) {
95850                       if (nodeIDs[k] === survivor.id) continue;
95851
95852                       if (way.areAdjacent(nodeIDs[k], survivor.id)) {
95853                           way = way.removeNode(nodeIDs[k]);
95854                       } else {
95855                           way = way.replaceNode(nodeIDs[k], survivor.id);
95856                       }
95857                   }
95858                   if (way.isDegenerate()) {
95859                       return 'restriction';
95860                   }
95861               }
95862           }
95863
95864           return false;
95865
95866
95867           // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
95868           function hasDuplicates(n, i, arr) {
95869               return arr.indexOf(n) !== arr.lastIndexOf(n);
95870           }
95871
95872           function keyNodeFilter(froms, tos) {
95873               return function(n) {
95874                   return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
95875               };
95876           }
95877
95878           function collectNodes(member, collection) {
95879               var entity = graph.hasEntity(member.id);
95880               if (!entity) return;
95881
95882               var role = member.role || '';
95883               if (!collection[role]) {
95884                   collection[role] = [];
95885               }
95886
95887               if (member.type === 'node') {
95888                   collection[role].push(member.id);
95889                   if (role === 'via') {
95890                       collection.keyfrom.push(member.id);
95891                       collection.keyto.push(member.id);
95892                   }
95893
95894               } else if (member.type === 'way') {
95895                   collection[role].push.apply(collection[role], entity.nodes);
95896                   if (role === 'from' || role === 'via') {
95897                       collection.keyfrom.push(entity.first());
95898                       collection.keyfrom.push(entity.last());
95899                   }
95900                   if (role === 'to' || role === 'via') {
95901                       collection.keyto.push(entity.first());
95902                       collection.keyto.push(entity.last());
95903                   }
95904               }
95905           }
95906       };
95907
95908
95909       return action;
95910   }
95911
95912   function actionCopyEntities(ids, fromGraph) {
95913       var copies = {};
95914
95915
95916       var action = function(graph) {
95917           ids.forEach(function(id) {
95918               fromGraph.entity(id).copy(fromGraph, copies);
95919           });
95920
95921           for (var id in copies) {
95922               graph = graph.replace(copies[id]);
95923           }
95924
95925           return graph;
95926       };
95927
95928
95929       action.copies = function() {
95930           return copies;
95931       };
95932
95933
95934       return action;
95935   }
95936
95937   function actionDeleteMember(relationId, memberIndex) {
95938       return function(graph) {
95939           var relation = graph.entity(relationId)
95940               .removeMember(memberIndex);
95941
95942           graph = graph.replace(relation);
95943
95944           if (relation.isDegenerate())
95945               graph = actionDeleteRelation(relation.id)(graph);
95946
95947           return graph;
95948       };
95949   }
95950
95951   function actionDiscardTags(difference) {
95952
95953       return function(graph) {
95954           function discardTags(entity) {
95955               var tags = {};
95956               var keys = Object.keys(entity.tags);
95957               var discarded = false;
95958
95959               for (var i = 0; i < keys.length; i++) {
95960                   var k = keys[i];
95961                   if (dataDiscarded[k] || !entity.tags[k]) {
95962                       discarded = true;
95963                   } else {
95964                       tags[k] = entity.tags[k];
95965                   }
95966               }
95967
95968               if (discarded) {
95969                   graph = graph.replace(entity.update({ tags: tags }));
95970               }
95971           }
95972
95973           difference.modified().forEach(discardTags);
95974           difference.created().forEach(discardTags);
95975
95976           return graph;
95977       };
95978   }
95979
95980   // Disconect the ways at the given node.
95981   //
95982   // Optionally, disconnect only the given ways.
95983   //
95984   // For testing convenience, accepts an ID to assign to the (first) new node.
95985   // Normally, this will be undefined and the way will automatically
95986   // be assigned a new ID.
95987   //
95988   // This is the inverse of `iD.actionConnect`.
95989   //
95990   // Reference:
95991   //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
95992   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
95993   //
95994   function actionDisconnect(nodeId, newNodeId) {
95995       var wayIds;
95996
95997
95998       var action = function(graph) {
95999           var node = graph.entity(nodeId);
96000           var connections = action.connections(graph);
96001
96002           connections.forEach(function(connection) {
96003               var way = graph.entity(connection.wayID);
96004               var newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
96005
96006               graph = graph.replace(newNode);
96007               if (connection.index === 0 && way.isArea()) {
96008                   // replace shared node with shared node..
96009                   graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
96010               } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
96011                   // replace closing node with new new node..
96012                   graph = graph.replace(way.unclose().addNode(newNode.id));
96013               } else {
96014                   // replace shared node with multiple new nodes..
96015                   graph = graph.replace(way.updateNode(newNode.id, connection.index));
96016               }
96017           });
96018
96019           return graph;
96020       };
96021
96022
96023       action.connections = function(graph) {
96024           var candidates = [];
96025           var keeping = false;
96026           var parentWays = graph.parentWays(graph.entity(nodeId));
96027
96028           parentWays.forEach(function(way) {
96029               if (wayIds && wayIds.indexOf(way.id) === -1) {
96030                   keeping = true;
96031                   return;
96032               }
96033               if (way.isArea() && (way.nodes[0] === nodeId)) {
96034                   candidates.push({ wayID: way.id, index: 0 });
96035               } else {
96036                   way.nodes.forEach(function(waynode, index) {
96037                       if (waynode === nodeId) {
96038                           candidates.push({ wayID: way.id, index: index });
96039                       }
96040                   });
96041               }
96042           });
96043
96044           return keeping ? candidates : candidates.slice(1);
96045       };
96046
96047
96048       action.disabled = function(graph) {
96049           var connections = action.connections(graph);
96050           if (connections.length === 0 || (wayIds && wayIds.length !== connections.length))
96051               return 'not_connected';
96052
96053           var parentWays = graph.parentWays(graph.entity(nodeId));
96054           var seenRelationIds = {};
96055           var sharedRelation;
96056
96057           parentWays.forEach(function(way) {
96058               if (wayIds && wayIds.indexOf(way.id) === -1)
96059                   return;
96060
96061               var relations = graph.parentRelations(way);
96062               relations.forEach(function(relation) {
96063                   if (relation.id in seenRelationIds) {
96064                       sharedRelation = relation;
96065                   } else {
96066                       seenRelationIds[relation.id] = true;
96067                   }
96068               });
96069           });
96070
96071           if (sharedRelation)
96072               return 'relation';
96073       };
96074
96075
96076       action.limitWays = function(_) {
96077           if (!arguments.length) return wayIds;
96078           wayIds = _;
96079           return action;
96080       };
96081
96082
96083       return action;
96084   }
96085
96086   // Join ways at the end node they share.
96087   //
96088   // This is the inverse of `iD.actionSplit`.
96089   //
96090   // Reference:
96091   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
96092   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
96093   //
96094   function actionJoin(ids) {
96095
96096       function groupEntitiesByGeometry(graph) {
96097           var entities = ids.map(function(id) { return graph.entity(id); });
96098           return assignIn({line: []}, groupBy(entities, function(entity) { return entity.geometry(graph); }));
96099       }
96100
96101
96102       var action = function(graph) {
96103           var ways = ids.map(graph.entity, graph);
96104           var survivorID = ways[0].id;
96105
96106           // Prefer to keep an existing way.
96107           for (var i = 0; i < ways.length; i++) {
96108               if (!ways[i].isNew()) {
96109                   survivorID = ways[i].id;
96110                   break;
96111               }
96112           }
96113
96114           var sequences = osmJoinWays(ways, graph);
96115           var joined = sequences[0];
96116
96117           // We might need to reverse some of these ways before joining them.  #4688
96118           // `joined.actions` property will contain any actions we need to apply.
96119           graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
96120
96121           var survivor = graph.entity(survivorID);
96122           survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
96123           graph = graph.replace(survivor);
96124
96125           joined.forEach(function(way) {
96126               if (way.id === survivorID) return;
96127
96128               graph.parentRelations(way).forEach(function(parent) {
96129                   graph = graph.replace(parent.replaceMember(way, survivor));
96130               });
96131
96132               survivor = survivor.mergeTags(way.tags);
96133
96134               graph = graph.replace(survivor);
96135               graph = actionDeleteWay(way.id)(graph);
96136           });
96137
96138           return graph;
96139       };
96140
96141
96142       action.disabled = function(graph) {
96143           var geometries = groupEntitiesByGeometry(graph);
96144           if (ids.length < 2 || ids.length !== geometries.line.length)
96145               return 'not_eligible';
96146
96147           var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
96148           if (joined.length > 1)
96149               return 'not_adjacent';
96150
96151           // Loop through all combinations of path-pairs to check potential intersections
96152           //  between all pairs
96153           for (var i = 0; i < ids.length-1; i++) {
96154               for (var j = i+1; j < ids.length; j++) {
96155                   var path1 = graph.childNodes(graph.entity(ids[i])).map(function(e) {
96156                       return e.loc;
96157                   });
96158                   var path2 = graph.childNodes(graph.entity(ids[j])).map(function(e) {
96159                       return e.loc;
96160                   });
96161                   var intersections = geoPathIntersections(path1, path2);
96162
96163                   // Check if intersections are just nodes lying on top of each other/the line,
96164                   //  as opposed to crossing it
96165                   if (intersection(
96166                           joined[0].nodes.map(function(n) { return n.loc.toString(); }),
96167                           intersections.map(function(n) { return n.toString(); })
96168                       ).length !== intersections.length) return 'paths_intersect';
96169               }
96170           }
96171
96172           var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
96173           var relation;
96174           var tags = {};
96175           var conflicting = false;
96176
96177           joined[0].forEach(function(way) {
96178               var parents = graph.parentRelations(way);
96179               parents.forEach(function(parent) {
96180                   if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
96181                       relation = parent;
96182               });
96183
96184               for (var k in way.tags) {
96185                   if (!(k in tags)) {
96186                       tags[k] = way.tags[k];
96187                   } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
96188                       conflicting = true;
96189                   }
96190               }
96191           });
96192
96193           if (relation)
96194               return 'restriction';
96195
96196           if (conflicting)
96197               return 'conflicting_tags';
96198       };
96199
96200
96201       return action;
96202   }
96203
96204   function actionMerge(ids) {
96205
96206       function groupEntitiesByGeometry(graph) {
96207           var entities = ids.map(function(id) { return graph.entity(id); });
96208           return assignIn({point: [], area: [], line: [], relation: []},
96209               groupBy(entities, function(entity) { return entity.geometry(graph); }));
96210       }
96211
96212
96213       var action = function(graph) {
96214           var geometries = groupEntitiesByGeometry(graph),
96215               target = geometries.area[0] || geometries.line[0],
96216               points = geometries.point;
96217
96218           points.forEach(function(point) {
96219               target = target.mergeTags(point.tags);
96220               graph = graph.replace(target);
96221
96222               graph.parentRelations(point).forEach(function(parent) {
96223                   graph = graph.replace(parent.replaceMember(point, target));
96224               });
96225
96226               var nodes = uniq(graph.childNodes(target)),
96227                   removeNode = point;
96228
96229               for (var i = 0; i < nodes.length; i++) {
96230                   var node = nodes[i];
96231                   if (graph.parentWays(node).length > 1 ||
96232                       graph.parentRelations(node).length ||
96233                       node.hasInterestingTags()) {
96234                       continue;
96235                   }
96236
96237                   // Found an uninteresting child node on the target way.
96238                   // Move orig point into its place to preserve point's history. #3683
96239                   graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
96240                   target = target.replaceNode(node.id, point.id);
96241                   graph = graph.replace(target);
96242                   removeNode = node;
96243                   break;
96244               }
96245
96246               graph = graph.remove(removeNode);
96247           });
96248
96249           return graph;
96250       };
96251
96252
96253       action.disabled = function(graph) {
96254           var geometries = groupEntitiesByGeometry(graph);
96255           if (geometries.point.length === 0 ||
96256               (geometries.area.length + geometries.line.length) !== 1 ||
96257               geometries.relation.length !== 0)
96258               return 'not_eligible';
96259       };
96260
96261
96262       return action;
96263   }
96264
96265   // `actionMergeNodes` is just a combination of:
96266   //
96267   // 1. move all the nodes to a common location
96268   // 2. `actionConnect` them
96269
96270   function actionMergeNodes(nodeIDs, loc) {
96271
96272       // If there is a single "interesting" node, use that as the location.
96273       // Otherwise return the average location of all the nodes.
96274       function chooseLoc(graph) {
96275           if (!nodeIDs.length) return null;
96276           var sum = [0,0];
96277           var interestingCount = 0;
96278           var interestingLoc;
96279
96280           for (var i = 0; i < nodeIDs.length; i++) {
96281               var node = graph.entity(nodeIDs[i]);
96282               if (node.hasInterestingTags()) {
96283                   interestingLoc = (++interestingCount === 1) ? node.loc : null;
96284               }
96285               sum = geoVecAdd(sum, node.loc);
96286           }
96287
96288           return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
96289       }
96290
96291
96292       var action = function(graph) {
96293           if (nodeIDs.length < 2) return graph;
96294           var toLoc = loc;
96295           if (!toLoc) {
96296               toLoc = chooseLoc(graph);
96297           }
96298
96299           for (var i = 0; i < nodeIDs.length; i++) {
96300               var node = graph.entity(nodeIDs[i]);
96301               if (node.loc !== toLoc) {
96302                   graph = graph.replace(node.move(toLoc));
96303               }
96304           }
96305
96306           return actionConnect(nodeIDs)(graph);
96307       };
96308
96309
96310       action.disabled = function(graph) {
96311           if (nodeIDs.length < 2) return 'not_eligible';
96312
96313           for (var i = 0; i < nodeIDs.length; i++) {
96314               var entity = graph.entity(nodeIDs[i]);
96315               if (entity.type !== 'node') return 'not_eligible';
96316           }
96317
96318           return actionConnect(nodeIDs).disabled(graph);
96319       };
96320
96321       return action;
96322   }
96323
96324   function actionMergePolygon(ids, newRelationId) {
96325
96326       function groupEntities(graph) {
96327           var entities = ids.map(function (id) { return graph.entity(id); });
96328           return assignIn({
96329                   closedWay: [],
96330                   multipolygon: [],
96331                   other: []
96332               }, groupBy(entities, function(entity) {
96333                   if (entity.type === 'way' && entity.isClosed()) {
96334                       return 'closedWay';
96335                   } else if (entity.type === 'relation' && entity.isMultipolygon()) {
96336                       return 'multipolygon';
96337                   } else {
96338                       return 'other';
96339                   }
96340               }));
96341       }
96342
96343
96344       var action = function(graph) {
96345           var entities = groupEntities(graph);
96346
96347           // An array representing all the polygons that are part of the multipolygon.
96348           //
96349           // Each element is itself an array of objects with an id property, and has a
96350           // locs property which is an array of the locations forming the polygon.
96351           var polygons = entities.multipolygon.reduce(function(polygons, m) {
96352               return polygons.concat(osmJoinWays(m.members, graph));
96353           }, []).concat(entities.closedWay.map(function(d) {
96354               var member = [{id: d.id}];
96355               member.nodes = graph.childNodes(d);
96356               return member;
96357           }));
96358
96359           // contained is an array of arrays of boolean values,
96360           // where contained[j][k] is true iff the jth way is
96361           // contained by the kth way.
96362           var contained = polygons.map(function(w, i) {
96363               return polygons.map(function(d, n) {
96364                   if (i === n) return null;
96365                   return geoPolygonContainsPolygon(
96366                       map$3(d.nodes, 'loc'),
96367                       map$3(w.nodes, 'loc'));
96368               });
96369           });
96370
96371           // Sort all polygons as either outer or inner ways
96372           var members = [],
96373               outer = true;
96374
96375           while (polygons.length) {
96376               extractUncontained(polygons);
96377               polygons = polygons.filter(isContained);
96378               contained = contained.filter(isContained).map(filterContained);
96379           }
96380
96381           function isContained(d, i) {
96382               return some(contained[i]);
96383           }
96384
96385           function filterContained(d) {
96386               return d.filter(isContained);
96387           }
96388
96389           function extractUncontained(polygons) {
96390               polygons.forEach(function(d, i) {
96391                   if (!isContained(d, i)) {
96392                       d.forEach(function(member) {
96393                           members.push({
96394                               type: 'way',
96395                               id: member.id,
96396                               role: outer ? 'outer' : 'inner'
96397                           });
96398                       });
96399                   }
96400               });
96401               outer = !outer;
96402           }
96403
96404           // Move all tags to one relation
96405           var relation = entities.multipolygon[0] ||
96406               osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
96407
96408           entities.multipolygon.slice(1).forEach(function(m) {
96409               relation = relation.mergeTags(m.tags);
96410               graph = graph.remove(m);
96411           });
96412
96413           entities.closedWay.forEach(function(way) {
96414               function isThisOuter(m) {
96415                   return m.id === way.id && m.role !== 'inner';
96416               }
96417               if (members.some(isThisOuter)) {
96418                   relation = relation.mergeTags(way.tags);
96419                   graph = graph.replace(way.update({ tags: {} }));
96420               }
96421           });
96422
96423           return graph.replace(relation.update({
96424               members: members,
96425               tags: omit(relation.tags, 'area')
96426           }));
96427       };
96428
96429
96430       action.disabled = function(graph) {
96431           var entities = groupEntities(graph);
96432           if (entities.other.length > 0 ||
96433               entities.closedWay.length + entities.multipolygon.length < 2)
96434               return 'not_eligible';
96435           if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
96436               return 'incomplete_relation';
96437       };
96438
96439
96440       return action;
96441   }
96442
96443   // Text diff algorithm following Hunt and McIlroy 1976.
96444   // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
96445   // comparison, Bell Telephone Laboratories CSTR #41 (1976)
96446   // http://www.cs.dartmouth.edu/~doug/
96447   //
96448   // Expects two arrays of strings.
96449   function LCS(file1, file2) {
96450     var equivalenceClasses;
96451     var file2indices;
96452     var newCandidate;
96453     var candidates;
96454     var line;
96455     var c, i, j, jX, r, s;
96456
96457     equivalenceClasses = {};
96458     for (j = 0; j < file2.length; j++) {
96459       line = file2[j];
96460       if (equivalenceClasses[line]) {
96461         equivalenceClasses[line].push(j);
96462       } else {
96463         equivalenceClasses[line] = [j];
96464       }
96465     }
96466
96467     candidates = [
96468       { file1index: -1, file2index: -1, chain: null }
96469     ];
96470
96471     for (i = 0; i < file1.length; i++) {
96472       line = file1[i];
96473       file2indices = equivalenceClasses[line] || [];
96474
96475       r = 0;
96476       c = candidates[0];
96477
96478       for (jX = 0; jX < file2indices.length; jX++) {
96479         j = file2indices[jX];
96480
96481         for (s = r; s < candidates.length; s++) {
96482           if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
96483             break;
96484           }
96485         }
96486
96487         if (s < candidates.length) {
96488           newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
96489           if (r === candidates.length) {
96490             candidates.push(c);
96491           } else {
96492             candidates[r] = c;
96493           }
96494           r = s + 1;
96495           c = newCandidate;
96496           if (r === candidates.length) {
96497             break; // no point in examining further (j)s
96498           }
96499         }
96500       }
96501
96502       candidates[r] = c;
96503     }
96504
96505     // At this point, we know the LCS: it's in the reverse of the
96506     // linked-list through .chain of candidates[candidates.length - 1].
96507
96508     return candidates[candidates.length - 1];
96509   }
96510
96511
96512   // We apply the LCS to give a simple representation of the
96513   // offsets and lengths of mismatched chunks in the input
96514   // files. This is used by diff3MergeIndices below.
96515   function diffIndices(file1, file2) {
96516     var result = [];
96517     var tail1 = file1.length;
96518     var tail2 = file2.length;
96519
96520     for (var candidate = LCS(file1, file2);
96521        candidate !== null;
96522        candidate = candidate.chain)
96523     {
96524       var mismatchLength1 = tail1 - candidate.file1index - 1;
96525       var mismatchLength2 = tail2 - candidate.file2index - 1;
96526       tail1 = candidate.file1index;
96527       tail2 = candidate.file2index;
96528
96529       if (mismatchLength1 || mismatchLength2) {
96530         result.push({
96531           file1: [tail1 + 1, mismatchLength1],
96532           file2: [tail2 + 1, mismatchLength2]
96533         });
96534       }
96535     }
96536
96537     result.reverse();
96538     return result;
96539   }
96540
96541
96542   // Given three files, A, O, and B, where both A and B are
96543   // independently derived from O, returns a fairly complicated
96544   // internal representation of merge decisions it's taken. The
96545   // interested reader may wish to consult
96546   //
96547   // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
96548   // 'A Formal Investigation of ' In Arvind and Prasad,
96549   // editors, Foundations of Software Technology and Theoretical
96550   // Computer Science (FSTTCS), December 2007.
96551   //
96552   // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
96553   function diff3MergeIndices(a, o, b) {
96554     var i;
96555     var m1 = diffIndices(o, a);
96556     var m2 = diffIndices(o, b);
96557
96558     var hunks = [];
96559     function addHunk(h, side) {
96560       hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
96561     }
96562     for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
96563     for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
96564     hunks.sort(function (x, y) { return x[0] - y[0]; });
96565
96566     var result = [];
96567     var commonOffset = 0;
96568     function copyCommon(targetOffset) {
96569       if (targetOffset > commonOffset) {
96570         result.push([1, commonOffset, targetOffset - commonOffset]);
96571         commonOffset = targetOffset;
96572       }
96573     }
96574
96575     for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
96576       var firstHunkIndex = hunkIndex;
96577       var hunk = hunks[hunkIndex];
96578       var regionLhs = hunk[0];
96579       var regionRhs = regionLhs + hunk[2];
96580       while (hunkIndex < hunks.length - 1) {
96581         var maybeOverlapping = hunks[hunkIndex + 1];
96582         var maybeLhs = maybeOverlapping[0];
96583         if (maybeLhs > regionRhs) {
96584           break;
96585         }
96586         regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
96587         hunkIndex++;
96588       }
96589
96590       copyCommon(regionLhs);
96591       if (firstHunkIndex === hunkIndex) {
96592         // The 'overlap' was only one hunk long, meaning that
96593         // there's no conflict here. Either a and o were the
96594         // same, or b and o were the same.
96595         if (hunk[4] > 0) {
96596           result.push([hunk[1], hunk[3], hunk[4]]);
96597         }
96598       } else {
96599         // A proper conflict. Determine the extents of the
96600         // regions involved from a, o and b. Effectively merge
96601         // all the hunks on the left into one giant hunk, and
96602         // do the same for the right; then, correct for skew
96603         // in the regions of o that each side changed, and
96604         // report appropriate spans for the three sides.
96605         var regions = {
96606           0: [a.length, -1, o.length, -1],
96607           2: [b.length, -1, o.length, -1]
96608         };
96609         for (i = firstHunkIndex; i <= hunkIndex; i++) {
96610           hunk = hunks[i];
96611           var side = hunk[1];
96612           var r = regions[side];
96613           var oLhs = hunk[0];
96614           var oRhs = oLhs + hunk[2];
96615           var abLhs = hunk[3];
96616           var abRhs = abLhs + hunk[4];
96617           r[0] = Math.min(abLhs, r[0]);
96618           r[1] = Math.max(abRhs, r[1]);
96619           r[2] = Math.min(oLhs, r[2]);
96620           r[3] = Math.max(oRhs, r[3]);
96621         }
96622         var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
96623         var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
96624         var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
96625         var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
96626         result.push([-1,
96627                      aLhs,      aRhs      - aLhs,
96628                      regionLhs, regionRhs - regionLhs,
96629                      bLhs,      bRhs      - bLhs]);
96630       }
96631       commonOffset = regionRhs;
96632     }
96633
96634     copyCommon(o.length);
96635     return result;
96636   }
96637
96638
96639   // Applies the output of diff3MergeIndices to actually
96640   // construct the merged file; the returned result alternates
96641   // between 'ok' and 'conflict' blocks.
96642   function diff3Merge(a, o, b, excludeFalseConflicts) {
96643     var result = [];
96644     var files = [a, o, b];
96645     var indices = diff3MergeIndices(a, o, b);
96646
96647     var okLines = [];
96648     function flushOk() {
96649       if (okLines.length) {
96650         result.push({ok: okLines});
96651       }
96652       okLines = [];
96653     }
96654     function pushOk(xs) {
96655       for (var j = 0; j < xs.length; j++) {
96656         okLines.push(xs[j]);
96657       }
96658     }
96659
96660     function isTrueConflict(rec) {
96661       if (rec[2] !== rec[6]) return true;
96662       var aoff = rec[1];
96663       var boff = rec[5];
96664       for (var j = 0; j < rec[2]; j++) {
96665         if (a[j + aoff] !== b[j + boff]) {
96666           return true;
96667         }
96668       }
96669       return false;
96670     }
96671
96672     for (var i = 0; i < indices.length; i++) {
96673       var x = indices[i];
96674       var side = x[0];
96675       if (side === -1) {
96676         if (excludeFalseConflicts && !isTrueConflict(x)) {
96677           pushOk(files[0].slice(x[1], x[1] + x[2]));
96678         } else {
96679           flushOk();
96680           result.push({
96681             conflict: {
96682               a: a.slice(x[1], x[1] + x[2]),
96683               aIndex: x[1],
96684               o: o.slice(x[3], x[3] + x[4]),
96685               oIndex: x[3],
96686               b: b.slice(x[5], x[5] + x[6]),
96687               bIndex: x[5]
96688             }
96689           });
96690         }
96691       } else {
96692         pushOk(files[side].slice(x[1], x[1] + x[2]));
96693       }
96694     }
96695
96696     flushOk();
96697     return result;
96698   }
96699
96700   function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
96701       var _option = 'safe';  // 'safe', 'force_local', 'force_remote'
96702       var _conflicts = [];
96703
96704
96705       function user(d) {
96706           return isFunction(formatUser) ? formatUser(d) : d;
96707       }
96708
96709
96710       function mergeLocation(remote, target) {
96711           function pointEqual(a, b) {
96712               var epsilon = 1e-6;
96713               return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
96714           }
96715
96716           if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
96717               return target;
96718           }
96719           if (_option === 'force_remote') {
96720               return target.update({loc: remote.loc});
96721           }
96722
96723           _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
96724           return target;
96725       }
96726
96727
96728       function mergeNodes(base, remote, target) {
96729           if (_option === 'force_local' || isEqual(target.nodes, remote.nodes)) {
96730               return target;
96731           }
96732           if (_option === 'force_remote') {
96733               return target.update({nodes: remote.nodes});
96734           }
96735
96736           var ccount = _conflicts.length;
96737           var o = base.nodes || [];
96738           var a = target.nodes || [];
96739           var b = remote.nodes || [];
96740           var nodes = [];
96741           var hunks = diff3Merge(a, o, b, true);
96742
96743           for (var i = 0; i < hunks.length; i++) {
96744               var hunk = hunks[i];
96745               if (hunk.ok) {
96746                   nodes.push.apply(nodes, hunk.ok);
96747               } else {
96748                   // for all conflicts, we can assume c.a !== c.b
96749                   // because `diff3Merge` called with `true` option to exclude false conflicts..
96750                   var c = hunk.conflict;
96751                   if (isEqual(c.o, c.a)) {  // only changed remotely
96752                       nodes.push.apply(nodes, c.b);
96753                   } else if (isEqual(c.o, c.b)) {  // only changed locally
96754                       nodes.push.apply(nodes, c.a);
96755                   } else {       // changed both locally and remotely
96756                       _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
96757                       break;
96758                   }
96759               }
96760           }
96761
96762           return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
96763       }
96764
96765
96766       function mergeChildren(targetWay, children, updates, graph) {
96767           function isUsed(node, targetWay) {
96768               var parentWays = map$3(graph.parentWays(node), 'id');
96769               return node.hasInterestingTags() ||
96770                   without(parentWays, targetWay.id).length > 0 ||
96771                   graph.parentRelations(node).length > 0;
96772           }
96773
96774           var ccount = _conflicts.length;
96775
96776           for (var i = 0; i < children.length; i++) {
96777               var id = children[i];
96778               var node = graph.hasEntity(id);
96779
96780               // remove unused childNodes..
96781               if (targetWay.nodes.indexOf(id) === -1) {
96782                   if (node && !isUsed(node, targetWay)) {
96783                       updates.removeIds.push(id);
96784                   }
96785                   continue;
96786               }
96787
96788               // restore used childNodes..
96789               var local = localGraph.hasEntity(id);
96790               var remote = remoteGraph.hasEntity(id);
96791               var target;
96792
96793               if (_option === 'force_remote' && remote && remote.visible) {
96794                   updates.replacements.push(remote);
96795
96796               } else if (_option === 'force_local' && local) {
96797                   target = osmEntity(local);
96798                   if (remote) {
96799                       target = target.update({ version: remote.version });
96800                   }
96801                   updates.replacements.push(target);
96802
96803               } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
96804                   target = osmEntity(local, { version: remote.version });
96805                   if (remote.visible) {
96806                       target = mergeLocation(remote, target);
96807                   } else {
96808                       _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
96809                   }
96810
96811                   if (_conflicts.length !== ccount) break;
96812                   updates.replacements.push(target);
96813               }
96814           }
96815
96816           return targetWay;
96817       }
96818
96819
96820       function updateChildren(updates, graph) {
96821           for (var i = 0; i < updates.replacements.length; i++) {
96822               graph = graph.replace(updates.replacements[i]);
96823           }
96824           if (updates.removeIds.length) {
96825               graph = actionDeleteMultiple(updates.removeIds)(graph);
96826           }
96827           return graph;
96828       }
96829
96830
96831       function mergeMembers(remote, target) {
96832           if (_option === 'force_local' || isEqual(target.members, remote.members)) {
96833               return target;
96834           }
96835           if (_option === 'force_remote') {
96836               return target.update({members: remote.members});
96837           }
96838
96839           _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
96840           return target;
96841       }
96842
96843
96844       function mergeTags(base, remote, target) {
96845           function ignoreKey(k) {
96846               return dataDiscarded[k];
96847           }
96848
96849           if (_option === 'force_local' || isEqual(target.tags, remote.tags)) {
96850               return target;
96851           }
96852           if (_option === 'force_remote') {
96853               return target.update({tags: remote.tags});
96854           }
96855
96856           var ccount = _conflicts.length;
96857           var o = base.tags || {};
96858           var a = target.tags || {};
96859           var b = remote.tags || {};
96860           var keys = reject(union(keys$1(o), keys$1(a), keys$1(b)), ignoreKey);
96861           var tags = clone(a);
96862           var changed = false;
96863
96864           for (var i = 0; i < keys.length; i++) {
96865               var k = keys[i];
96866
96867               if (o[k] !== b[k] && a[k] !== b[k]) {    // changed remotely..
96868                   if (o[k] !== a[k]) {      // changed locally..
96869                       _conflicts.push(t('merge_remote_changes.conflict.tags',
96870                           { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
96871
96872                   } else {                  // unchanged locally, accept remote change..
96873                       if (b.hasOwnProperty(k)) {
96874                           tags[k] = b[k];
96875                       } else {
96876                           delete tags[k];
96877                       }
96878                       changed = true;
96879                   }
96880               }
96881           }
96882
96883           return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
96884       }
96885
96886
96887       //  `graph.base()` is the common ancestor of the two graphs.
96888       //  `localGraph` contains user's edits up to saving
96889       //  `remoteGraph` contains remote edits to modified nodes
96890       //  `graph` must be a descendent of `localGraph` and may include
96891       //      some conflict resolution actions performed on it.
96892       //
96893       //                  --- ... --- `localGraph` -- ... -- `graph`
96894       //                 /
96895       //  `graph.base()` --- ... --- `remoteGraph`
96896       //
96897       var action = function(graph) {
96898           var updates = { replacements: [], removeIds: [] };
96899           var base = graph.base().entities[id];
96900           var local = localGraph.entity(id);
96901           var remote = remoteGraph.entity(id);
96902           var target = osmEntity(local, { version: remote.version });
96903
96904           // delete/undelete
96905           if (!remote.visible) {
96906               if (_option === 'force_remote') {
96907                   return actionDeleteMultiple([id])(graph);
96908
96909               } else if (_option === 'force_local') {
96910                   if (target.type === 'way') {
96911                       target = mergeChildren(target, uniq(local.nodes), updates, graph);
96912                       graph = updateChildren(updates, graph);
96913                   }
96914                   return graph.replace(target);
96915
96916               } else {
96917                   _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
96918                   return graph;  // do nothing
96919               }
96920           }
96921
96922           // merge
96923           if (target.type === 'node') {
96924               target = mergeLocation(remote, target);
96925
96926           } else if (target.type === 'way') {
96927               // pull in any child nodes that may not be present locally..
96928               graph.rebase(remoteGraph.childNodes(remote), [graph], false);
96929               target = mergeNodes(base, remote, target);
96930               target = mergeChildren(target, union(local.nodes, remote.nodes), updates, graph);
96931
96932           } else if (target.type === 'relation') {
96933               target = mergeMembers(remote, target);
96934           }
96935
96936           target = mergeTags(base, remote, target);
96937
96938           if (!_conflicts.length) {
96939               graph = updateChildren(updates, graph).replace(target);
96940           }
96941
96942           return graph;
96943       };
96944
96945
96946       action.withOption = function(opt) {
96947           _option = opt;
96948           return action;
96949       };
96950
96951
96952       action.conflicts = function() {
96953           return _conflicts;
96954       };
96955
96956
96957       return action;
96958   }
96959
96960   // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
96961   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
96962   function actionMove(moveIds, tryDelta, projection, cache) {
96963       var _delta = tryDelta;
96964
96965       function setupCache(graph) {
96966           function canMove(nodeId) {
96967               // Allow movement of any node that is in the selectedIDs list..
96968               if (moveIds.indexOf(nodeId) !== -1) return true;
96969
96970               // Allow movement of a vertex where 2 ways meet..
96971               var parents = map$3(graph.parentWays(graph.entity(nodeId)), 'id');
96972               if (parents.length < 3) return true;
96973
96974               // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
96975               var parentsMoving = every(parents, function(id) { return cache.moving[id]; });
96976               if (!parentsMoving) delete cache.moving[nodeId];
96977
96978               return parentsMoving;
96979           }
96980
96981           function cacheEntities(ids) {
96982               for (var i = 0; i < ids.length; i++) {
96983                   var id = ids[i];
96984                   if (cache.moving[id]) continue;
96985                   cache.moving[id] = true;
96986
96987                   var entity = graph.hasEntity(id);
96988                   if (!entity) continue;
96989
96990                   if (entity.type === 'node') {
96991                       cache.nodes.push(id);
96992                       cache.startLoc[id] = entity.loc;
96993                   } else if (entity.type === 'way') {
96994                       cache.ways.push(id);
96995                       cacheEntities(entity.nodes);
96996                   } else {
96997                       cacheEntities(entity.members.map(function(member) {
96998                           return member.id;
96999                       }));
97000                   }
97001               }
97002           }
97003
97004           function cacheIntersections(ids) {
97005               function isEndpoint(way, id) {
97006                   return !way.isClosed() && !!way.affix(id);
97007               }
97008
97009               for (var i = 0; i < ids.length; i++) {
97010                   var id = ids[i];
97011
97012                   // consider only intersections with 1 moved and 1 unmoved way.
97013                   var childNodes = graph.childNodes(graph.entity(id));
97014                   for (var j = 0; j < childNodes.length; j++) {
97015                       var node = childNodes[j];
97016                       var parents = graph.parentWays(node);
97017                       if (parents.length !== 2) continue;
97018
97019                       var moved = graph.entity(id);
97020                       var unmoved = null;
97021                       for (var k = 0; k < parents.length; k++) {
97022                           var way = parents[k];
97023                           if (!cache.moving[way.id]) {
97024                               unmoved = way;
97025                               break;
97026                           }
97027                       }
97028                       if (!unmoved) continue;
97029
97030                       // exclude ways that are overly connected..
97031                       if (intersection(moved.nodes, unmoved.nodes).length > 2) continue;
97032                       if (moved.isArea() || unmoved.isArea()) continue;
97033
97034                       cache.intersections.push({
97035                           nodeId: node.id,
97036                           movedId: moved.id,
97037                           unmovedId: unmoved.id,
97038                           movedIsEP: isEndpoint(moved, node.id),
97039                           unmovedIsEP: isEndpoint(unmoved, node.id)
97040                       });
97041                   }
97042               }
97043           }
97044
97045
97046           if (!cache) {
97047               cache = {};
97048           }
97049           if (!cache.ok) {
97050               cache.moving = {};
97051               cache.intersections = [];
97052               cache.replacedVertex = {};
97053               cache.startLoc = {};
97054               cache.nodes = [];
97055               cache.ways = [];
97056
97057               cacheEntities(moveIds);
97058               cacheIntersections(cache.ways);
97059               cache.nodes = filter(cache.nodes, canMove);
97060
97061               cache.ok = true;
97062           }
97063       }
97064
97065
97066       // Place a vertex where the moved vertex used to be, to preserve way shape..
97067       //
97068       //  Start:
97069       //      b ---- e
97070       //     / \
97071       //    /   \
97072       //   /     \
97073       //  a       c
97074       //
97075       //      *               node '*' added to preserve shape
97076       //     / \
97077       //    /   b ---- e      way `b,e` moved here:
97078       //   /     \
97079       //  a       c
97080       //
97081       //
97082       function replaceMovedVertex(nodeId, wayId, graph, delta) {
97083           var way = graph.entity(wayId);
97084           var moved = graph.entity(nodeId);
97085           var movedIndex = way.nodes.indexOf(nodeId);
97086           var len, prevIndex, nextIndex;
97087
97088           if (way.isClosed()) {
97089               len = way.nodes.length - 1;
97090               prevIndex = (movedIndex + len - 1) % len;
97091               nextIndex = (movedIndex + len + 1) % len;
97092           } else {
97093               len = way.nodes.length;
97094               prevIndex = movedIndex - 1;
97095               nextIndex = movedIndex + 1;
97096           }
97097
97098           var prev = graph.hasEntity(way.nodes[prevIndex]);
97099           var next = graph.hasEntity(way.nodes[nextIndex]);
97100
97101           // Don't add orig vertex at endpoint..
97102           if (!prev || !next) return graph;
97103
97104           var key = wayId + '_' + nodeId;
97105           var orig = cache.replacedVertex[key];
97106           if (!orig) {
97107               orig = osmNode();
97108               cache.replacedVertex[key] = orig;
97109               cache.startLoc[orig.id] = cache.startLoc[nodeId];
97110           }
97111
97112           var start, end;
97113           if (delta) {
97114               start = projection(cache.startLoc[nodeId]);
97115               end = projection.invert(geoVecAdd(start, delta));
97116           } else {
97117               end = cache.startLoc[nodeId];
97118           }
97119           orig = orig.move(end);
97120
97121           var angle = Math.abs(geoAngle(orig, prev, projection) -
97122                   geoAngle(orig, next, projection)) * 180 / Math.PI;
97123
97124           // Don't add orig vertex if it would just make a straight line..
97125           if (angle > 175 && angle < 185) return graph;
97126
97127           // moving forward or backward along way?
97128           var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
97129           var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
97130           var d1 = geoPathLength(p1);
97131           var d2 = geoPathLength(p2);
97132           var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
97133
97134           // moving around closed loop?
97135           if (way.isClosed() && insertAt === 0) insertAt = len;
97136
97137           way = way.addNode(orig.id, insertAt);
97138           return graph.replace(orig).replace(way);
97139       }
97140
97141
97142       // Remove duplicate vertex that might have been added by
97143       // replaceMovedVertex.  This is done after the unzorro checks.
97144       function removeDuplicateVertices(wayId, graph) {
97145           var way = graph.entity(wayId);
97146           var epsilon = 1e-6;
97147           var prev, curr;
97148
97149           function isInteresting(node, graph) {
97150               return graph.parentWays(node).length > 1 ||
97151                   graph.parentRelations(node).length ||
97152                   node.hasInterestingTags();
97153           }
97154
97155           for (var i = 0; i < way.nodes.length; i++) {
97156               curr = graph.entity(way.nodes[i]);
97157
97158               if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
97159                   if (!isInteresting(prev, graph)) {
97160                       way = way.removeNode(prev.id);
97161                       graph = graph.replace(way).remove(prev);
97162                   } else if (!isInteresting(curr, graph)) {
97163                       way = way.removeNode(curr.id);
97164                       graph = graph.replace(way).remove(curr);
97165                   }
97166               }
97167
97168               prev = curr;
97169           }
97170
97171           return graph;
97172       }
97173
97174
97175       // Reorder nodes around intersections that have moved..
97176       //
97177       //  Start:                way1.nodes: b,e         (moving)
97178       //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
97179       //      |                 vertex: b
97180       //      e                 isEP1: true,  isEP2, false
97181       //
97182       //  way1 `b,e` moved here:
97183       //  a ----- c = b - d
97184       //              |
97185       //              e
97186       //
97187       //  reorder nodes         way1.nodes: b,e
97188       //  a ----- c - b - d     way2.nodes: a,c,b,d
97189       //              |
97190       //              e
97191       //
97192       function unZorroIntersection(intersection, graph) {
97193           var vertex = graph.entity(intersection.nodeId);
97194           var way1 = graph.entity(intersection.movedId);
97195           var way2 = graph.entity(intersection.unmovedId);
97196           var isEP1 = intersection.movedIsEP;
97197           var isEP2 = intersection.unmovedIsEP;
97198
97199           // don't move the vertex if it is the endpoint of both ways.
97200           if (isEP1 && isEP2) return graph;
97201
97202           var nodes1 = without(graph.childNodes(way1), vertex);
97203           var nodes2 = without(graph.childNodes(way2), vertex);
97204
97205           if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
97206           if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
97207
97208           var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
97209           var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
97210           var loc;
97211
97212           // snap vertex to nearest edge (or some point between them)..
97213           if (!isEP1 && !isEP2) {
97214               var epsilon = 1e-6, maxIter = 10;
97215               for (var i = 0; i < maxIter; i++) {
97216                   loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
97217                   edge1 = geoChooseEdge(nodes1, projection(loc), projection);
97218                   edge2 = geoChooseEdge(nodes2, projection(loc), projection);
97219                   if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
97220               }
97221           } else if (!isEP1) {
97222               loc = edge1.loc;
97223           } else {
97224               loc = edge2.loc;
97225           }
97226
97227           graph = graph.replace(vertex.move(loc));
97228
97229           // if zorro happened, reorder nodes..
97230           if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
97231               way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
97232               graph = graph.replace(way1);
97233           }
97234           if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
97235               way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
97236               graph = graph.replace(way2);
97237           }
97238
97239           return graph;
97240       }
97241
97242
97243       function cleanupIntersections(graph) {
97244           for (var i = 0; i < cache.intersections.length; i++) {
97245               var obj = cache.intersections[i];
97246               graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
97247               graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
97248               graph = unZorroIntersection(obj, graph);
97249               graph = removeDuplicateVertices(obj.movedId, graph);
97250               graph = removeDuplicateVertices(obj.unmovedId, graph);
97251           }
97252
97253           return graph;
97254       }
97255
97256
97257       // check if moving way endpoint can cross an unmoved way, if so limit delta..
97258       function limitDelta(graph) {
97259           function moveNode(loc) {
97260               return geoVecAdd(projection(loc), _delta);
97261           }
97262
97263           for (var i = 0; i < cache.intersections.length; i++) {
97264               var obj = cache.intersections[i];
97265
97266               // Don't limit movement if this is vertex joins 2 endpoints..
97267               if (obj.movedIsEP && obj.unmovedIsEP) continue;
97268               // Don't limit movement if this vertex is not an endpoint anyway..
97269               if (!obj.movedIsEP) continue;
97270
97271               var node = graph.entity(obj.nodeId);
97272               var start = projection(node.loc);
97273               var end = geoVecAdd(start, _delta);
97274               var movedNodes = graph.childNodes(graph.entity(obj.movedId));
97275               var movedPath = map$3(map$3(movedNodes, 'loc'), moveNode);
97276               var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
97277               var unmovedPath = map$3(map$3(unmovedNodes, 'loc'), projection);
97278               var hits = geoPathIntersections(movedPath, unmovedPath);
97279
97280               for (var j = 0; i < hits.length; i++) {
97281                   if (isEqual(hits[j], end)) continue;
97282                   var edge = geoChooseEdge(unmovedNodes, end, projection);
97283                   _delta = geoVecSubtract(projection(edge.loc), start);
97284               }
97285           }
97286       }
97287
97288
97289       var action = function(graph) {
97290           if (_delta[0] === 0 && _delta[1] === 0) return graph;
97291
97292           setupCache(graph);
97293
97294           if (cache.intersections.length) {
97295               limitDelta(graph);
97296           }
97297
97298           for (var i = 0; i < cache.nodes.length; i++) {
97299               var node = graph.entity(cache.nodes[i]);
97300               var start = projection(node.loc);
97301               var end = geoVecAdd(start, _delta);
97302               graph = graph.replace(node.move(projection.invert(end)));
97303           }
97304
97305           if (cache.intersections.length) {
97306               graph = cleanupIntersections(graph);
97307           }
97308
97309           return graph;
97310       };
97311
97312
97313       action.delta = function() {
97314           return _delta;
97315       };
97316
97317
97318       return action;
97319   }
97320
97321   function actionMoveNode(nodeID, toLoc) {
97322
97323       var action = function(graph, t) {
97324           if (t === null || !isFinite(t)) t = 1;
97325           t = Math.min(Math.max(+t, 0), 1);
97326
97327           var node = graph.entity(nodeID);
97328           return graph.replace(
97329               node.move(geoVecInterp(node.loc, toLoc, t))
97330           );
97331       };
97332
97333       action.transitionable = true;
97334
97335       return action;
97336   }
97337
97338   function actionNoop() {
97339       return function(graph) {
97340           return graph;
97341       };
97342   }
97343
97344   /*
97345    * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
97346    */
97347   function actionOrthogonalize(wayId, projection) {
97348       var threshold = 12, // degrees within right or straight to alter
97349           lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180),
97350           upperThreshold = Math.cos(threshold * Math.PI / 180);
97351
97352
97353       var action = function(graph, t) {
97354           if (t === null || !isFinite(t)) t = 1;
97355           t = Math.min(Math.max(+t, 0), 1);
97356
97357           var way = graph.entity(wayId),
97358               nodes = graph.childNodes(way),
97359               points = uniq(nodes).map(function(n) { return projection(n.loc); }),
97360               corner = {i: 0, dotp: 1},
97361               epsilon = 1e-4,
97362               node, loc, score, motions, i, j;
97363
97364           if (points.length === 3) {   // move only one vertex for right triangle
97365               for (i = 0; i < 1000; i++) {
97366                   motions = points.map(calcMotion);
97367                   points[corner.i] = addPoints(points[corner.i], motions[corner.i]);
97368                   score = corner.dotp;
97369                   if (score < epsilon) {
97370                       break;
97371                   }
97372               }
97373
97374               node = graph.entity(nodes[corner.i].id);
97375               loc = projection.invert(points[corner.i]);
97376               graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
97377
97378           } else {
97379               var best,
97380                   originalPoints = clone(points);
97381               score = Infinity;
97382
97383               for (i = 0; i < 1000; i++) {
97384                   motions = points.map(calcMotion);
97385                   for (j = 0; j < motions.length; j++) {
97386                       points[j] = addPoints(points[j],motions[j]);
97387                   }
97388                   var newScore = squareness(points);
97389                   if (newScore < score) {
97390                       best = clone(points);
97391                       score = newScore;
97392                   }
97393                   if (score < epsilon) {
97394                       break;
97395                   }
97396               }
97397
97398               points = best;
97399
97400               for (i = 0; i < points.length; i++) {
97401                   // only move the points that actually moved
97402                   if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
97403                       loc = projection.invert(points[i]);
97404                       node = graph.entity(nodes[i].id);
97405                       graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
97406                   }
97407               }
97408
97409               // remove empty nodes on straight sections
97410               for (i = 0; t === 1 && i < points.length; i++) {
97411                   node = graph.entity(nodes[i].id);
97412
97413                   if (graph.parentWays(node).length > 1 ||
97414                       graph.parentRelations(node).length ||
97415                       node.hasInterestingTags()) {
97416                       continue;
97417                   }
97418
97419                   var dotp = normalizedDotProduct(i, points);
97420                   if (dotp < -1 + epsilon) {
97421                       graph = actionDeleteNode(node.id)(graph);
97422                   }
97423               }
97424           }
97425
97426           return graph;
97427
97428
97429           function calcMotion(b, i, array) {
97430               var a = array[(i - 1 + array.length) % array.length],
97431                   c = array[(i + 1) % array.length],
97432                   p = subtractPoints(a, b),
97433                   q = subtractPoints(c, b),
97434                   scale, dotp;
97435
97436               scale = 2 * Math.min(geoVecLength(p, [0, 0]), geoVecLength(q, [0, 0]));
97437               p = normalizePoint(p, 1.0);
97438               q = normalizePoint(q, 1.0);
97439
97440               dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
97441
97442               // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
97443               if (array.length > 3) {
97444                   if (dotp < -0.707106781186547) {
97445                       dotp += 1.0;
97446                   }
97447               } else if (dotp && Math.abs(dotp) < corner.dotp) {
97448                   corner.i = i;
97449                   corner.dotp = Math.abs(dotp);
97450               }
97451
97452               return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
97453           }
97454       };
97455
97456
97457       function squareness(points) {
97458           return points.reduce(function(sum, val, i, array) {
97459               var dotp = normalizedDotProduct(i, array);
97460
97461               dotp = filterDotProduct(dotp);
97462               return sum + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
97463           }, 0);
97464       }
97465
97466
97467       function normalizedDotProduct(i, points) {
97468           var a = points[(i - 1 + points.length) % points.length],
97469               b = points[i],
97470               c = points[(i + 1) % points.length],
97471               p = subtractPoints(a, b),
97472               q = subtractPoints(c, b);
97473
97474           p = normalizePoint(p, 1.0);
97475           q = normalizePoint(q, 1.0);
97476
97477           return p[0] * q[0] + p[1] * q[1];
97478       }
97479
97480
97481       function subtractPoints(a, b) {
97482           return [a[0] - b[0], a[1] - b[1]];
97483       }
97484
97485
97486       function addPoints(a, b) {
97487           return [a[0] + b[0], a[1] + b[1]];
97488       }
97489
97490
97491       function normalizePoint(point, scale) {
97492           var vector = [0, 0];
97493           var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
97494           if (length !== 0) {
97495               vector[0] = point[0] / length;
97496               vector[1] = point[1] / length;
97497           }
97498
97499           vector[0] *= scale;
97500           vector[1] *= scale;
97501
97502           return vector;
97503       }
97504
97505
97506       function filterDotProduct(dotp) {
97507           if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
97508               return dotp;
97509           }
97510
97511           return 0;
97512       }
97513
97514
97515       action.disabled = function(graph) {
97516           var way = graph.entity(wayId),
97517               nodes = graph.childNodes(way),
97518               points = uniq(nodes).map(function(n) { return projection(n.loc); });
97519
97520           if (squareness(points)) {
97521               return false;
97522           }
97523
97524           return 'not_squarish';
97525       };
97526
97527
97528       action.transitionable = true;
97529
97530
97531       return action;
97532   }
97533
97534   // `actionRestrictTurn` creates a turn restriction relation.
97535   //
97536   // `turn` must be an `osmTurn` object
97537   // see osm/intersection.js, pathToTurn()
97538   //
97539   // This specifies a restriction of type `restriction` when traveling from
97540   // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
97541   // (The action does not check that these entities form a valid intersection.)
97542   //
97543   // From, to, and via ways should be split before calling this action.
97544   // (old versions of the code would split the ways here, but we no longer do it)
97545   //
97546   // For testing convenience, accepts a restrictionID to assign to the new
97547   // relation. Normally, this will be undefined and the relation will
97548   // automatically be assigned a new ID.
97549   //
97550   function actionRestrictTurn(turn, restrictionType, restrictionID) {
97551
97552       return function(graph) {
97553           var fromWay = graph.entity(turn.from.way);
97554           var toWay = graph.entity(turn.to.way);
97555           var viaNode = turn.via.node && graph.entity(turn.via.node);
97556           var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
97557           var members = [];
97558
97559           members.push({ id: fromWay.id, type: 'way',  role: 'from' });
97560
97561           if (viaNode) {
97562               members.push({ id: viaNode.id,  type: 'node', role: 'via' });
97563           } else if (viaWays) {
97564               viaWays.forEach(function(viaWay) {
97565                   members.push({ id: viaWay.id,  type: 'way', role: 'via' });
97566               });
97567           }
97568
97569           members.push({ id: toWay.id, type: 'way',  role: 'to' });
97570
97571           return graph.replace(osmRelation({
97572               id: restrictionID,
97573               tags: {
97574                   type: 'restriction',
97575                   restriction: restrictionType
97576               },
97577               members: members
97578           }));
97579       };
97580   }
97581
97582   function actionRevert(id) {
97583       var action = function(graph) {
97584           var entity = graph.hasEntity(id),
97585               base = graph.base().entities[id];
97586
97587           if (entity && !base) {    // entity will be removed..
97588               if (entity.type === 'node') {
97589                   graph.parentWays(entity)
97590                       .forEach(function(parent) {
97591                           parent = parent.removeNode(id);
97592                           graph = graph.replace(parent);
97593
97594                           if (parent.isDegenerate()) {
97595                               graph = actionDeleteWay(parent.id)(graph);
97596                           }
97597                       });
97598               }
97599
97600               graph.parentRelations(entity)
97601                   .forEach(function(parent) {
97602                       parent = parent.removeMembersWithID(id);
97603                       graph = graph.replace(parent);
97604
97605                       if (parent.isDegenerate()) {
97606                           graph = actionDeleteRelation(parent.id)(graph);
97607                       }
97608                   });
97609           }
97610
97611           return graph.revert(id);
97612       };
97613
97614       return action;
97615   }
97616
97617   function actionRotate(rotateIds, pivot, angle, projection) {
97618
97619       var action = function(graph) {
97620           return graph.update(function(graph) {
97621               utilGetAllNodes(rotateIds, graph).forEach(function(node) {
97622                   var point = geoRotate([projection(node.loc)], angle, pivot)[0];
97623                   graph = graph.replace(node.move(projection.invert(point)));
97624               });
97625           });
97626       };
97627
97628       return action;
97629   }
97630
97631   /* Built-in method references for those with the same name as other `lodash` methods. */
97632   var nativeMax$8 = Math.max;
97633
97634   /**
97635    * Gets the index at which the first occurrence of `value` is found in `array`
97636    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
97637    * for equality comparisons. If `fromIndex` is negative, it's used as the
97638    * offset from the end of `array`.
97639    *
97640    * @static
97641    * @memberOf _
97642    * @since 0.1.0
97643    * @category Array
97644    * @param {Array} array The array to inspect.
97645    * @param {*} value The value to search for.
97646    * @param {number} [fromIndex=0] The index to search from.
97647    * @returns {number} Returns the index of the matched value, else `-1`.
97648    * @example
97649    *
97650    * _.indexOf([1, 2, 1, 2], 2);
97651    * // => 1
97652    *
97653    * // Search from the `fromIndex`.
97654    * _.indexOf([1, 2, 1, 2], 2, 2);
97655    * // => 3
97656    */
97657   function indexOf(array, value, fromIndex) {
97658     var length = array == null ? 0 : array.length;
97659     if (!length) {
97660       return -1;
97661     }
97662     var index = fromIndex == null ? 0 : toInteger(fromIndex);
97663     if (index < 0) {
97664       index = nativeMax$8(length + index, 0);
97665     }
97666     return baseIndexOf(array, value, index);
97667   }
97668
97669   // Split a way at the given node.
97670   //
97671   // Optionally, split only the given ways, if multiple ways share
97672   // the given node.
97673   //
97674   // This is the inverse of `iD.actionJoin`.
97675   //
97676   // For testing convenience, accepts an ID to assign to the new way.
97677   // Normally, this will be undefined and the way will automatically
97678   // be assigned a new ID.
97679   //
97680   // Reference:
97681   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
97682   //
97683   function actionSplit(nodeId, newWayIds) {
97684       var _wayIDs;
97685
97686       // If the way is closed, we need to search for a partner node
97687       // to split the way at.
97688       //
97689       // The following looks for a node that is both far away from
97690       // the initial node in terms of way segment length and nearby
97691       // in terms of beeline-distance. This assures that areas get
97692       // split on the most "natural" points (independent of the number
97693       // of nodes).
97694       // For example: bone-shaped areas get split across their waist
97695       // line, circles across the diameter.
97696       function splitArea(nodes, idxA, graph) {
97697           var lengths = new Array(nodes.length);
97698           var length;
97699           var i;
97700           var best = 0;
97701           var idxB;
97702
97703           function wrap(index) {
97704               return utilWrap(index, nodes.length);
97705           }
97706
97707           function dist(nA, nB) {
97708               var locA = graph.entity(nA).loc;
97709               var locB = graph.entity(nB).loc;
97710               var epsilon = 1e-6;
97711               return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
97712           }
97713
97714           // calculate lengths
97715           length = 0;
97716           for (i = wrap(idxA+1); i !== idxA; i = wrap(i+1)) {
97717               length += dist(nodes[i], nodes[wrap(i-1)]);
97718               lengths[i] = length;
97719           }
97720
97721           length = 0;
97722           for (i = wrap(idxA-1); i !== idxA; i = wrap(i-1)) {
97723               length += dist(nodes[i], nodes[wrap(i+1)]);
97724               if (length < lengths[i])
97725                   lengths[i] = length;
97726           }
97727
97728           // determine best opposite node to split
97729           for (i = 0; i < nodes.length; i++) {
97730               var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
97731               if (cost > best) {
97732                   idxB = i;
97733                   best = cost;
97734               }
97735           }
97736
97737           return idxB;
97738       }
97739
97740
97741       function split(graph, wayA, newWayId) {
97742           var wayB = osmWay({id: newWayId, tags: wayA.tags});   // `wayB` is the NEW way
97743           var origNodes = wayA.nodes.slice();
97744           var nodesA;
97745           var nodesB;
97746           var isArea = wayA.isArea();
97747           var isOuter = osmIsOldMultipolygonOuterMember(wayA, graph);
97748
97749           if (wayA.isClosed()) {
97750               var nodes = wayA.nodes.slice(0, -1);
97751               var idxA = indexOf(nodes, nodeId);
97752               var idxB = splitArea(nodes, idxA, graph);
97753
97754               if (idxB < idxA) {
97755                   nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
97756                   nodesB = nodes.slice(idxB, idxA + 1);
97757               } else {
97758                   nodesA = nodes.slice(idxA, idxB + 1);
97759                   nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
97760               }
97761           } else {
97762               var idx = indexOf(wayA.nodes, nodeId, 1);
97763               nodesA = wayA.nodes.slice(0, idx + 1);
97764               nodesB = wayA.nodes.slice(idx);
97765           }
97766
97767           wayA = wayA.update({nodes: nodesA});
97768           wayB = wayB.update({nodes: nodesB});
97769
97770           graph = graph.replace(wayA);
97771           graph = graph.replace(wayB);
97772
97773           graph.parentRelations(wayA).forEach(function(relation) {
97774               var member;
97775
97776               // Turn restrictions - make sure:
97777               // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
97778               //    (whichever one is connected to the VIA node/ways)
97779               // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
97780               if (relation.isRestriction()) {
97781                   var f = relation.memberByRole('from');
97782                   var v = relation.membersByRole('via');
97783                   var t = relation.memberByRole('to');
97784                   var i;
97785
97786                   // 1. split a FROM/TO
97787                   if (f.id === wayA.id || t.id === wayA.id) {
97788                       var keepB = false;
97789                       if (v.length === 1 && v[0].type === 'node') {   // check via node
97790                           keepB = wayB.contains(v[0].id);
97791                       } else {                                        // check via way(s)
97792                           for (i = 0; i < v.length; i++) {
97793                               if (v[i].type === 'way') {
97794                                   var wayVia = graph.hasEntity(v[i].id);
97795                                   if (wayVia && intersection(wayB.nodes, wayVia.nodes).length) {
97796                                       keepB = true;
97797                                       break;
97798                                   }
97799                               }
97800                           }
97801                       }
97802
97803                       if (keepB) {
97804                           relation = relation.replaceMember(wayA, wayB);
97805                           graph = graph.replace(relation);
97806                       }
97807
97808                   // 2. split a VIA
97809                   } else {
97810                       for (i = 0; i < v.length; i++) {
97811                           if (v[i].type === 'way' && v[i].id === wayA.id) {
97812                               member = {
97813                                   id: wayB.id,
97814                                   type: 'way',
97815                                   role: 'via'
97816                               };
97817                               graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
97818                               break;
97819                           }
97820                       }
97821                   }
97822
97823               // All other relations (Routes, Multipolygons, etc):
97824               // 1. Both `wayA` and `wayB` remain in the relation
97825               // 2. But must be inserted as a pair (see `actionAddMember` for details)
97826               } else {
97827                   if (relation === isOuter) {
97828                       graph = graph.replace(relation.mergeTags(wayA.tags));
97829                       graph = graph.replace(wayA.update({tags: {}}));
97830                       graph = graph.replace(wayB.update({tags: {}}));
97831                   }
97832
97833                   member = {
97834                       id: wayB.id,
97835                       type: 'way',
97836                       role: relation.memberById(wayA.id).role
97837                   };
97838
97839                   var insertPair = {
97840                       originalID: wayA.id,
97841                       insertedID: wayB.id,
97842                       nodes: origNodes
97843                   };
97844
97845                   graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
97846               }
97847           });
97848
97849           if (!isOuter && isArea) {
97850               var multipolygon = osmRelation({
97851                   tags: assignIn({}, wayA.tags, {type: 'multipolygon'}),
97852                   members: [
97853                       {id: wayA.id, role: 'outer', type: 'way'},
97854                       {id: wayB.id, role: 'outer', type: 'way'}
97855                   ]
97856               });
97857
97858               graph = graph.replace(multipolygon);
97859               graph = graph.replace(wayA.update({tags: {}}));
97860               graph = graph.replace(wayB.update({tags: {}}));
97861           }
97862
97863           return graph;
97864       }
97865
97866
97867       var action = function(graph) {
97868           var candidates = action.ways(graph);
97869           for (var i = 0; i < candidates.length; i++) {
97870               graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
97871           }
97872           return graph;
97873       };
97874
97875
97876       action.ways = function(graph) {
97877           var node = graph.entity(nodeId);
97878           var parents = graph.parentWays(node);
97879           var hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
97880
97881           return parents.filter(function(parent) {
97882               if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
97883                   return false;
97884
97885               if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
97886                   return false;
97887
97888               if (parent.isClosed()) {
97889                   return true;
97890               }
97891
97892               for (var i = 1; i < parent.nodes.length - 1; i++) {
97893                   if (parent.nodes[i] === nodeId) {
97894                       return true;
97895                   }
97896               }
97897
97898               return false;
97899           });
97900       };
97901
97902
97903       action.disabled = function(graph) {
97904           var candidates = action.ways(graph);
97905           if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length))
97906               return 'not_eligible';
97907       };
97908
97909
97910       action.limitWays = function(_) {
97911           if (!arguments.length) return _wayIDs;
97912           _wayIDs = _;
97913           return action;
97914       };
97915
97916
97917       return action;
97918   }
97919
97920   /*
97921    * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
97922    */
97923   function actionStraighten(wayId, projection) {
97924
97925       function positionAlongWay(n, s, e) {
97926           return ((n[0] - s[0]) * (e[0] - s[0]) + (n[1] - s[1]) * (e[1] - s[1])) /
97927                   (Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2));
97928       }
97929
97930
97931       var action = function(graph, t) {
97932           if (t === null || !isFinite(t)) t = 1;
97933           t = Math.min(Math.max(+t, 0), 1);
97934
97935           var way = graph.entity(wayId),
97936               nodes = graph.childNodes(way),
97937               points = nodes.map(function(n) { return projection(n.loc); }),
97938               startPoint = points[0],
97939               endPoint = points[points.length-1],
97940               toDelete = [],
97941               i;
97942
97943           for (i = 1; i < points.length-1; i++) {
97944               var node = nodes[i],
97945                   point = points[i];
97946
97947               if (t < 1 || graph.parentWays(node).length > 1 ||
97948                   graph.parentRelations(node).length ||
97949                   node.hasInterestingTags()) {
97950
97951                   var u = positionAlongWay(point, startPoint, endPoint),
97952                       p = [
97953                           startPoint[0] + u * (endPoint[0] - startPoint[0]),
97954                           startPoint[1] + u * (endPoint[1] - startPoint[1])
97955                       ],
97956                       loc2 = projection.invert(p);
97957
97958                   graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
97959
97960               } else {
97961                   // safe to delete
97962                   if (toDelete.indexOf(node) === -1) {
97963                       toDelete.push(node);
97964                   }
97965               }
97966           }
97967
97968           for (i = 0; i < toDelete.length; i++) {
97969               graph = actionDeleteNode(toDelete[i].id)(graph);
97970           }
97971
97972           return graph;
97973       };
97974
97975
97976       action.disabled = function(graph) {
97977           // check way isn't too bendy
97978           var way = graph.entity(wayId),
97979               nodes = graph.childNodes(way),
97980               points = nodes.map(function(n) { return projection(n.loc); }),
97981               startPoint = points[0],
97982               endPoint = points[points.length-1],
97983               threshold = 0.2 * geoVecLength(startPoint, endPoint),
97984               i;
97985
97986           if (threshold === 0) {
97987               return 'too_bendy';
97988           }
97989
97990           for (i = 1; i < points.length-1; i++) {
97991               var point = points[i],
97992                   u = positionAlongWay(point, startPoint, endPoint),
97993                   p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
97994                   p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]),
97995                   dist = Math.sqrt(Math.pow(p0 - point[0], 2) + Math.pow(p1 - point[1], 2));
97996
97997               // to bendy if point is off by 20% of total start/end distance in projected space
97998               if (isNaN(dist) || dist > threshold) {
97999                   return 'too_bendy';
98000               }
98001           }
98002       };
98003
98004
98005       action.transitionable = true;
98006
98007
98008       return action;
98009   }
98010
98011   // `actionUnrestrictTurn` deletes a turn restriction relation.
98012   //
98013   // `turn` must be an `osmTurn` object with a `restrictionID` property.
98014   // see osm/intersection.js, pathToTurn()
98015   //
98016   function actionUnrestrictTurn(turn) {
98017       return function(graph) {
98018           return actionDeleteRelation(turn.restrictionID)(graph);
98019       };
98020   }
98021
98022   /* Reflect the given area around its axis of symmetry */
98023   function actionReflect(reflectIds, projection) {
98024       var useLongAxis = true;
98025
98026
98027       // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
98028       // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
98029       function getSmallestSurroundingRectangle(graph, nodes) {
98030           var points = nodes.map(function(n) { return projection(n.loc); }),
98031               hull = d3_polygonHull(points),
98032               centroid = d3_polygonCentroid(hull),
98033               minArea = Infinity,
98034               ssrExtent = [],
98035               ssrAngle = 0,
98036               c1 = hull[0];
98037
98038           for (var i = 0; i <= hull.length - 1; i++) {
98039               var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1],
98040                   angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]),
98041                   poly = geoRotate(hull, -angle, centroid),
98042                   extent = poly.reduce(function(extent, point) {
98043                           return extent.extend(geoExtent(point));
98044                       }, geoExtent()),
98045                   area = extent.area();
98046
98047               if (area < minArea) {
98048                   minArea = area;
98049                   ssrExtent = extent;
98050                   ssrAngle = angle;
98051               }
98052               c1 = c2;
98053           }
98054
98055           return {
98056               poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
98057               angle: ssrAngle
98058           };
98059       }
98060
98061
98062       var action = function(graph, t) {
98063           if (t === null || !isFinite(t)) t = 1;
98064           t = Math.min(Math.max(+t, 0), 1);
98065
98066           var nodes = utilGetAllNodes(reflectIds, graph),
98067               ssr = getSmallestSurroundingRectangle(graph, nodes);
98068
98069           // Choose line pq = axis of symmetry.
98070           // The shape's surrounding rectangle has 2 axes of symmetry.
98071           // Reflect across the longer axis by default.
98072           var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ],
98073               q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ],
98074               p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ],
98075               q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ],
98076               p, q;
98077
98078           var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
98079           if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
98080               p = p1;
98081               q = q1;
98082           } else {
98083               p = p2;
98084               q = q2;
98085           }
98086
98087           // reflect c across pq
98088           // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
98089           var dx = q[0] - p[0];
98090           var dy = q[1] - p[1];
98091           var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
98092           var b = 2 * dx * dy / (dx * dx + dy * dy);
98093           for (var i = 0; i < nodes.length; i++) {
98094               var node = nodes[i];
98095               var c = projection(node.loc);
98096               var c2 = [
98097                   a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
98098                   b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
98099               ];
98100               var loc2 = projection.invert(c2);
98101               node = node.move(geoVecInterp(node.loc, loc2, t));
98102               graph = graph.replace(node);
98103           }
98104
98105           return graph;
98106       };
98107
98108
98109       action.useLongAxis = function(_) {
98110           if (!arguments.length) return useLongAxis;
98111           useLongAxis = _;
98112           return action;
98113       };
98114
98115
98116       action.transitionable = true;
98117
98118
98119       return action;
98120   }
98121
98122   function actionDetachNode(nodeID) {
98123
98124       var action = function(graph) {
98125           var node = graph.entity(nodeID);
98126
98127           // Create a new node to replace the one we will detach
98128           var replacement = osmNode({ loc: node.loc });
98129           graph = graph.replace(replacement);
98130
98131           // Process each way in turn, updating the graph as we go
98132           graph = graph.parentWays(node)
98133               .reduce(function(accGraph, parentWay) {
98134                   return accGraph.replace(parentWay.replaceNode(nodeID, replacement.id));
98135               }, graph);
98136
98137           // Process any relations too
98138           return graph.parentRelations(node)
98139               .reduce(function(accGraph, parentRel) {
98140                   return accGraph.replace(parentRel.replaceMember(node, replacement));
98141               }, graph);
98142       };
98143
98144
98145       action.disabled = function(graph) {
98146           var node = graph.entity(nodeID);
98147           var parentRels = graph.parentRelations(node);
98148
98149           for (var i = 0; i < parentRels.length; i++) {
98150               var relation = parentRels[i];
98151               if (!relation.isValidRestriction()) continue;
98152
98153               for (var j = 0; j < relation.members.length; j++) {
98154                   var m = relation.members[j];
98155                   if (m.id === nodeID && (m.role === 'via' || m.role === 'location_hint')) {
98156                       return 'restriction';
98157                   }
98158               }
98159           }
98160
98161           return false;
98162       };
98163
98164
98165       return action;
98166   }
98167
98168   var Connection = services.osm;
98169
98170   var debug = false;
98171
98172   var iD = /*#__PURE__*/Object.freeze({
98173     Connection: Connection,
98174     debug: debug,
98175     d3: index$3,
98176     coreValidator: coreValidator,
98177     Context: coreContext,
98178     setAreaKeys: setAreaKeys,
98179     get areaKeys () { return areaKeys; },
98180     Difference: coreDifference,
98181     Graph: coreGraph,
98182     History: coreHistory,
98183     Tree: coreTree,
98184     geoCross: geoVecCross,
98185     geoInterp: geoVecInterp,
98186     geoRoundCoordinates: geoVecFloor,
98187     geoEuclideanDistance: geoVecLength,
98188     Entity: osmEntity,
98189     Node: osmNode,
98190     Relation: osmRelation,
98191     Way: osmWay,
98192     BackgroundSource: rendererBackgroundSource,
98193     Background: rendererBackground,
98194     Features: rendererFeatures,
98195     Map: rendererMap,
98196     TileLayer: rendererTileLayer,
98197     Detect: utilDetect,
98198     uiPreset: uiPresetEditor,
98199     actionAddEntity: actionAddEntity,
98200     actionAddMember: actionAddMember,
98201     actionAddMidpoint: actionAddMidpoint,
98202     actionAddVertex: actionAddVertex,
98203     actionChangeMember: actionChangeMember,
98204     actionChangePreset: actionChangePreset,
98205     actionChangeTags: actionChangeTags,
98206     actionCircularize: actionCircularize,
98207     actionConnect: actionConnect,
98208     actionCopyEntities: actionCopyEntities,
98209     actionDeleteMember: actionDeleteMember,
98210     actionDeleteMultiple: actionDeleteMultiple,
98211     actionDeleteNode: actionDeleteNode,
98212     actionDeleteRelation: actionDeleteRelation,
98213     actionDeleteWay: actionDeleteWay,
98214     actionDiscardTags: actionDiscardTags,
98215     actionDisconnect: actionDisconnect,
98216     actionJoin: actionJoin,
98217     actionMerge: actionMerge,
98218     actionMergeNodes: actionMergeNodes,
98219     actionMergePolygon: actionMergePolygon,
98220     actionMergeRemoteChanges: actionMergeRemoteChanges,
98221     actionMove: actionMove,
98222     actionMoveNode: actionMoveNode,
98223     actionNoop: actionNoop,
98224     actionOrthogonalize: actionOrthogonalize,
98225     actionRestrictTurn: actionRestrictTurn,
98226     actionReverse: actionReverse,
98227     actionRevert: actionRevert,
98228     actionRotate: actionRotate,
98229     actionSplit: actionSplit,
98230     actionStraighten: actionStraighten,
98231     actionUnrestrictTurn: actionUnrestrictTurn,
98232     actionReflect: actionReflect,
98233     actionDetachNode: actionDetachNode,
98234     behaviorAddWay: behaviorAddWay,
98235     behaviorBreathe: behaviorBreathe,
98236     behaviorCopy: behaviorCopy,
98237     behaviorDrag: behaviorDrag,
98238     behaviorDrawWay: behaviorDrawWay,
98239     behaviorDraw: behaviorDraw,
98240     behaviorEdit: behaviorEdit,
98241     behaviorHash: behaviorHash,
98242     behaviorHover: behaviorHover,
98243     behaviorLasso: behaviorLasso,
98244     behaviorOperation: behaviorOperation,
98245     behaviorPaste: behaviorPaste,
98246     behaviorSelect: behaviorSelect,
98247     behaviorTail: behaviorTail,
98248     coreContext: coreContext,
98249     coreDifference: coreDifference,
98250     coreGraph: coreGraph,
98251     coreHistory: coreHistory,
98252     coreTree: coreTree,
98253     data: data,
98254     dataWikipedia: wikipedia$2,
98255     dataAddressFormats: dataAddressFormats,
98256     dataDeprecated: dataDeprecated,
98257     dataDiscarded: dataDiscarded,
98258     dataLocales: dataLocales,
98259     dataPhoneFormats: dataPhoneFormats,
98260     dataShortcuts: dataShortcuts,
98261     dataImperial: dataImperial,
98262     dataDriveLeft: dataDriveLeft,
98263     dataEn: en,
98264     geoExtent: geoExtent,
98265     geoLatToMeters: geoLatToMeters,
98266     geoLonToMeters: geoLonToMeters,
98267     geoMetersToLat: geoMetersToLat,
98268     geoMetersToLon: geoMetersToLon,
98269     geoMetersToOffset: geoMetersToOffset,
98270     geoOffsetToMeters: geoOffsetToMeters,
98271     geoScaleToZoom: geoScaleToZoom,
98272     geoSphericalClosestNode: geoSphericalClosestNode,
98273     geoSphericalDistance: geoSphericalDistance,
98274     geoZoomToScale: geoZoomToScale,
98275     geoAngle: geoAngle,
98276     geoChooseEdge: geoChooseEdge,
98277     geoEdgeEqual: geoEdgeEqual,
98278     geoHasLineIntersections: geoHasLineIntersections,
98279     geoHasSelfIntersections: geoHasSelfIntersections,
98280     geoRotate: geoRotate,
98281     geoLineIntersection: geoLineIntersection,
98282     geoPathHasIntersections: geoPathHasIntersections,
98283     geoPathIntersections: geoPathIntersections,
98284     geoPathLength: geoPathLength,
98285     geoPointInPolygon: geoPointInPolygon,
98286     geoPolygonContainsPolygon: geoPolygonContainsPolygon,
98287     geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
98288     geoViewportEdge: geoViewportEdge,
98289     geoRawMercator: geoRawMercator,
98290     geoVecAdd: geoVecAdd,
98291     geoVecAngle: geoVecAngle,
98292     geoVecCross: geoVecCross,
98293     geoVecDot: geoVecDot,
98294     geoVecEqual: geoVecEqual,
98295     geoVecFloor: geoVecFloor,
98296     geoVecInterp: geoVecInterp,
98297     geoVecLength: geoVecLength,
98298     geoVecSubtract: geoVecSubtract,
98299     geoVecScale: geoVecScale,
98300     modeAddArea: modeAddArea,
98301     modeAddLine: modeAddLine,
98302     modeAddPoint: modeAddPoint,
98303     modeAddNote: modeAddNote,
98304     modeBrowse: modeBrowse,
98305     modeDragNode: modeDragNode,
98306     modeDragNote: modeDragNote,
98307     modeDrawArea: modeDrawArea,
98308     modeDrawLine: modeDrawLine,
98309     modeMove: modeMove,
98310     modeRotate: modeRotate,
98311     modeSave: modeSave,
98312     modeSelect: modeSelect,
98313     modeSelectData: modeSelectData,
98314     modeSelectError: modeSelectError,
98315     modeSelectNote: modeSelectNote,
98316     operationCircularize: operationCircularize,
98317     operationContinue: operationContinue,
98318     operationDelete: operationDelete,
98319     operationDisconnect: operationDisconnect,
98320     operationMerge: operationMerge,
98321     operationMove: operationMove,
98322     operationOrthogonalize: operationOrthogonalize,
98323     operationReflectShort: operationReflectShort,
98324     operationReflectLong: operationReflectLong,
98325     operationReverse: operationReverse,
98326     operationRotate: operationRotate,
98327     operationSplit: operationSplit,
98328     operationStraighten: operationStraighten,
98329     operationDetachNode: operationDetachNode,
98330     osmChangeset: osmChangeset,
98331     osmEntity: osmEntity,
98332     osmNode: osmNode,
98333     osmNote: osmNote,
98334     osmRelation: osmRelation,
98335     osmWay: osmWay,
98336     qaError: qaError,
98337     osmIntersection: osmIntersection,
98338     osmTurn: osmTurn,
98339     osmInferRestriction: osmInferRestriction,
98340     osmLanes: osmLanes,
98341     osmOldMultipolygonOuterMemberOfRelation: osmOldMultipolygonOuterMemberOfRelation,
98342     osmIsOldMultipolygonOuterMember: osmIsOldMultipolygonOuterMember,
98343     osmOldMultipolygonOuterMember: osmOldMultipolygonOuterMember,
98344     osmJoinWays: osmJoinWays,
98345     osmOneWayTags: osmOneWayTags,
98346     osmPavedTags: osmPavedTags,
98347     osmIsInterestingTag: osmIsInterestingTag,
98348     presetCategory: presetCategory,
98349     presetCollection: presetCollection,
98350     presetField: presetField,
98351     presetPreset: presetPreset,
98352     presetIndex: presetIndex,
98353     rendererBackgroundSource: rendererBackgroundSource,
98354     rendererBackground: rendererBackground,
98355     rendererFeatures: rendererFeatures,
98356     rendererMap: rendererMap,
98357     rendererTileLayer: rendererTileLayer,
98358     services: services,
98359     serviceKeepRight: serviceKeepRight,
98360     serviceImproveOSM: serviceImproveOSM,
98361     serviceMapillary: serviceMapillary,
98362     serviceMapRules: serviceMapRules,
98363     serviceNominatim: serviceNominatim,
98364     serviceOpenstreetcam: serviceOpenstreetcam,
98365     serviceOsm: serviceOsm,
98366     serviceOsmWikibase: serviceOsmWikibase,
98367     serviceStreetside: serviceStreetside,
98368     serviceTaginfo: serviceTaginfo,
98369     serviceVectorTile: serviceVectorTile,
98370     serviceWikidata: serviceWikidata,
98371     serviceWikipedia: serviceWikipedia,
98372     svgAreas: svgAreas,
98373     svgData: svgData,
98374     svgDebug: svgDebug,
98375     svgDefs: svgDefs,
98376     svgKeepRight: svgKeepRight,
98377     svgIcon: svgIcon,
98378     svgGeolocate: svgGeolocate,
98379     svgLabels: svgLabels,
98380     svgLayers: svgLayers,
98381     svgLines: svgLines,
98382     svgMapillaryImages: svgMapillaryImages,
98383     svgMapillarySigns: svgMapillarySigns,
98384     svgMidpoints: svgMidpoints,
98385     svgNotes: svgNotes,
98386     svgMarkerSegments: svgMarkerSegments,
98387     svgOpenstreetcamImages: svgOpenstreetcamImages,
98388     svgOsm: svgOsm,
98389     svgPassiveVertex: svgPassiveVertex,
98390     svgPath: svgPath,
98391     svgPointTransform: svgPointTransform,
98392     svgPoints: svgPoints,
98393     svgRelationMemberTags: svgRelationMemberTags,
98394     svgSegmentWay: svgSegmentWay,
98395     svgStreetside: svgStreetside,
98396     svgTagClasses: svgTagClasses,
98397     svgTouch: svgTouch,
98398     svgTurns: svgTurns,
98399     svgVertices: svgVertices,
98400     uiFields: uiFields,
98401     uiFieldDefaultCheck: uiFieldCheck,
98402     uiFieldOnewayCheck: uiFieldCheck,
98403     uiFieldCheck: uiFieldCheck,
98404     uiFieldMultiCombo: uiFieldCombo,
98405     uiFieldNetworkCombo: uiFieldCombo,
98406     uiFieldSemiCombo: uiFieldCombo,
98407     uiFieldTypeCombo: uiFieldCombo,
98408     uiFieldCombo: uiFieldCombo,
98409     uiFieldUrl: uiFieldText,
98410     uiFieldNumber: uiFieldText,
98411     uiFieldTel: uiFieldText,
98412     uiFieldEmail: uiFieldText,
98413     uiFieldText: uiFieldText,
98414     uiFieldAccess: uiFieldAccess,
98415     uiFieldAddress: uiFieldAddress,
98416     uiFieldCycleway: uiFieldCycleway,
98417     uiFieldLanes: uiFieldLanes,
98418     uiFieldLocalized: uiFieldLocalized,
98419     uiFieldMaxspeed: uiFieldMaxspeed,
98420     uiFieldStructureRadio: uiFieldRadio,
98421     uiFieldRadio: uiFieldRadio,
98422     uiFieldRestrictions: uiFieldRestrictions,
98423     uiFieldTextarea: uiFieldTextarea,
98424     uiFieldWikidata: uiFieldWikidata,
98425     uiFieldWikipedia: uiFieldWikipedia,
98426     uiIntro: uiIntro,
98427     uiInfoPanels: uiInfoPanels,
98428     uiPanelBackground: uiPanelBackground,
98429     uiPanelHistory: uiPanelHistory,
98430     uiPanelLocation: uiPanelLocation,
98431     uiPanelMeasurement: uiPanelMeasurement,
98432     uiSettingsCustomBackground: uiSettingsCustomBackground,
98433     uiSettingsCustomData: uiSettingsCustomData,
98434     uiInit: uiInit,
98435     uiAccount: uiAccount,
98436     uiAttribution: uiAttribution,
98437     uiBackground: uiBackground,
98438     uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
98439     uiBackgroundOffset: uiBackgroundOffset,
98440     uiChangesetEditor: uiChangesetEditor,
98441     uiCmd: uiCmd,
98442     uiCombobox: uiCombobox,
98443     uiCommit: uiCommit,
98444     uiCommitChanges: uiCommitChanges,
98445     uiCommitWarnings: uiCommitWarnings,
98446     uiConfirm: uiConfirm,
98447     uiConflicts: uiConflicts,
98448     uiContributors: uiContributors,
98449     uiCurtain: uiCurtain,
98450     uiDataEditor: uiDataEditor,
98451     uiDataHeader: uiDataHeader,
98452     uiDisclosure: uiDisclosure,
98453     uiEditMenu: uiEditMenu,
98454     uiEntityEditor: uiEntityEditor,
98455     uiFeatureInfo: uiFeatureInfo,
98456     uiFeatureList: uiFeatureList,
98457     uiField: uiField,
98458     uiFieldHelp: uiFieldHelp,
98459     uiFlash: uiFlash,
98460     uiFormFields: uiFormFields,
98461     uiFullScreen: uiFullScreen,
98462     uiGeolocate: uiGeolocate,
98463     uiHelp: uiHelp,
98464     uiImproveOsmComments: uiImproveOsmComments,
98465     uiImproveOsmDetails: uiImproveOsmDetails,
98466     uiImproveOsmEditor: uiImproveOsmEditor,
98467     uiImproveOsmHeader: uiImproveOsmHeader,
98468     uiInfo: uiInfo,
98469     uiInspector: uiInspector,
98470     uiKeepRightDetails: uiKeepRightDetails,
98471     uiKeepRightEditor: uiKeepRightEditor,
98472     uiKeepRightHeader: uiKeepRightHeader,
98473     uiLasso: uiLasso,
98474     uiLoading: uiLoading,
98475     uiMapData: uiMapData,
98476     uiMapInMap: uiMapInMap,
98477     uiModal: uiModal,
98478     uiModes: uiModes,
98479     uiNotice: uiNotice,
98480     uiNoteComments: uiNoteComments,
98481     uiNoteEditor: uiNoteEditor,
98482     uiNoteHeader: uiNoteHeader,
98483     uiNoteReport: uiNoteReport,
98484     uiPresetEditor: uiPresetEditor,
98485     uiPresetIcon: uiPresetIcon,
98486     uiPresetList: uiPresetList,
98487     uiQuickLinks: uiQuickLinks,
98488     uiRadialMenu: uiRadialMenu,
98489     uiRawMemberEditor: uiRawMemberEditor,
98490     uiRawMembershipEditor: uiRawMembershipEditor,
98491     uiRawTagEditor: uiRawTagEditor,
98492     uiRestore: uiRestore,
98493     uiSave: uiSave,
98494     uiScale: uiScale,
98495     uiSelectionList: uiSelectionList,
98496     uiSidebar: uiSidebar,
98497     uiSourceSwitch: uiSourceSwitch,
98498     uiSpinner: uiSpinner,
98499     uiSplash: uiSplash,
98500     uiStatus: uiStatus,
98501     uiSuccess: uiSuccess,
98502     uiTagReference: uiTagReference,
98503     uiToggle: uiToggle,
98504     uiTooltipHtml: uiTooltipHtml,
98505     uiUndoRedo: uiUndoRedo,
98506     uiVersion: uiVersion,
98507     uiViewOnOSM: uiViewOnOSM,
98508     uiViewOnKeepRight: uiViewOnKeepRight,
98509     uiZoom: uiZoom,
98510     utilAsyncMap: utilAsyncMap,
98511     utilCallWhenIdle: utilCallWhenIdle,
98512     utilCleanTags: utilCleanTags,
98513     utilDisplayName: utilDisplayName,
98514     utilDisplayNameForPath: utilDisplayNameForPath,
98515     utilDisplayType: utilDisplayType,
98516     utilDisplayLabel: utilDisplayLabel,
98517     utilEntityRoot: utilEntityRoot,
98518     utilEditDistance: utilEditDistance,
98519     utilEntitySelector: utilEntitySelector,
98520     utilEntityOrMemberSelector: utilEntityOrMemberSelector,
98521     utilEntityOrDeepMemberSelector: utilEntityOrDeepMemberSelector,
98522     utilFastMouse: utilFastMouse,
98523     utilFunctor: utilFunctor,
98524     utilGetAllNodes: utilGetAllNodes,
98525     utilGetPrototypeOf: utilGetPrototypeOf,
98526     utilGetSetValue: utilGetSetValue,
98527     utilHashcode: utilHashcode,
98528     utilHighlightEntities: utilHighlightEntities,
98529     utilIdleWorker: utilIdleWorker,
98530     utilKeybinding: utilKeybinding,
98531     utilNoAuto: utilNoAuto,
98532     utilPrefixCSSProperty: utilPrefixCSSProperty,
98533     utilPrefixDOMProperty: utilPrefixDOMProperty,
98534     utilPreset: utilPreset,
98535     utilQsString: utilQsString,
98536     utilRebind: utilRebind,
98537     utilSetTransform: utilSetTransform,
98538     utilSessionMutex: utilSessionMutex,
98539     utilStringQs: utilStringQs,
98540     utilTagText: utilTagText,
98541     utilTiler: utilTiler,
98542     utilTriggerEvent: utilTriggerEvent,
98543     utilWrap: utilWrap,
98544     validationAlmostJunction: validationAlmostJunction,
98545     validationCrossingWays: validationCrossingWays,
98546     validationDeprecatedTag: validationDeprecatedTag,
98547     validationDisconnectedWay: validationDisconnectedWay,
98548     validationGenericName: validationGenericName,
98549     validationManyDeletions: validationManyDeletions,
98550     validationMaprules: validationMaprules,
98551     validationMissingTag: validationMissingTag,
98552     validationOldMultipolygon: validationOldMultipolygon,
98553     validationTagSuggestsArea: validationTagSuggestsArea
98554   });
98555
98556   window.iD = iD;
98557
98558 }());
98559 //# sourceMappingURL=iD.js.map